• Dan Williams's avatar
    libnvdimm, region: sysfs trigger for nvdimm_flush() · ab630891
    Dan Williams authored
    The nvdimm_flush() mechanism helps to reduce the impact of an ADR
    (asynchronous-dimm-refresh) failure. The ADR mechanism handles flushing
    platform WPQ (write-pending-queue) buffers when power is removed. The
    nvdimm_flush() mechanism performs that same function on-demand.
    
    When a pmem namespace is associated with a block device, an
    nvdimm_flush() is triggered with every block-layer REQ_FUA, or REQ_FLUSH
    request. These requests are typically associated with filesystem
    metadata updates. However, when a namespace is in device-dax mode,
    userspace (think database metadata) needs another path to perform the
    same flushing. In other words this is not required to make data
    persistent, but in the case of metadata it allows for a smaller failure
    domain in the unlikely event of an ADR failure.
    
    The new 'deep_flush' attribute is visible when the individual DIMMs
    backing a given interleave-set are described by platform firmware. In
    ACPI terms this is "NVDIMM Region Mapping Structures" and associated
    "Flush Hint Address Structures". Reads return "1" if the region supports
    triggering WPQ flushes on all DIMMs. Reads return "0" the flush
    operation is a platform nop, and in that case the attribute is
    read-only.
    
    Why sysfs and not an ioctl? An ioctl requires establishing a new
    ioctl function number space for device-dax. Given that this would be
    called on a device-dax fd an application could be forgiven for
    accidentally calling this on a filesystem-dax fd. Placing this interface
    in libnvdimm sysfs removes that potential for collision with a
    filesystem ioctl, and it keeps ioctls out of the generic device-dax
    implementation.
    
    Cc: Jeff Moyer <jmoyer@redhat.com>
    Cc: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    ab630891
region_devs.c 27.2 KB