[PATCH v2 00/17] replace pcommit with ADR or directed flushing

From: Dan Williams
Date: Sat Jul 09 2016 - 23:27:00 EST


Changes since v1 [1]:

1/ Move flush address data from nvdimm_drvdata to nd_region_data (Greg,
Toshi)

2/ Add more detail to cover letter and patch descriptions (Linda, Jeff)

3/ Account for s/REQ_FLUSH/REQ_PREFLUSH/ rename pending in -next.

4/ Add a directed flush at pmem ->remove() and ->shutdown() time.

[1]: https://lists.01.org/pipermail/linux-nvdimm/2016-June/005897.html

---

The pcommit instruction, which has not shipped on any product, is
deprecated. Instead, the expectation is that platforms implement either
ADR, or provide one or more flush addresses per nvdimm. ADR
(Asynchronous DRAM Refresh) flushes data in posted write buffers to the
memory controller on a power-fail event. Flush addresses are defined in
ACPI 6.x as an NVDIMM Firmware Interface Table (NFIT) sub-structure:
"Flush Hint Address Structure". A flush hint is an mmio address that
when written and fenced assures that all previous posted writes
targeting a given dimm have been flushed to media.

Code paths that previously called wmb_pmem() instead must arrange for a
flush request to be sent to the pmem driver. Towards this end, the pmem
driver is converted to advertise itself as having a write cache to
indicate to a filesystem that a flush request must occur before writes
are guaranteed to be on media. See "[PATCH v2 08/17] libnvdimm:
introduce nvdimm_flush() and nvdimm_has_flush()" for details.

---

Dan Williams (17):
nfit: always associate flush hints
nfit: don't override return value of nfit_mem_init
libnvdimm: introduce devm_nvdimm_memremap(), convert nfit_spa_map() users
libnvdimm, nfit: remove nfit_spa_map() infrastructure
libnvdimm, nfit: move flush hint mapping to region-device driver-data
tools/testing/nvdimm: simulate multiple flush hints per-dimm
libnvdimm: keep region data alive over namespace removal
libnvdimm: introduce nvdimm_flush() and nvdimm_has_flush()
libnvdimm: cycle flush hints
libnvdimm, pmem: use REQ_FUA, REQ_FLUSH for nvdimm_flush()
libnvdimm, pmem: flush posted-write queues on shutdown
fs/dax: remove wmb_pmem()
libnvdimm, pmem: use nvdimm_flush() for namespace I/O writes
pmem: kill wmb_pmem()
Revert "KVM: x86: add pcommit support"
x86/insn: remove pcommit
pmem: kill __pmem address space


Documentation/filesystems/Locking | 2
arch/powerpc/sysdev/axonram.c | 4
arch/x86/include/asm/cpufeatures.h | 1
arch/x86/include/asm/pmem.h | 77 ++-----
arch/x86/include/asm/special_insns.h | 46 ----
arch/x86/include/asm/vmx.h | 1
arch/x86/include/uapi/asm/vmx.h | 4
arch/x86/kvm/cpuid.c | 2
arch/x86/kvm/cpuid.h | 8 -
arch/x86/kvm/vmx.c | 32 ---
arch/x86/lib/x86-opcode-map.txt | 2
drivers/acpi/nfit.c | 230 +++-----------------
drivers/acpi/nfit.h | 25 --
drivers/block/brd.c | 4
drivers/nvdimm/bus.c | 16 +
drivers/nvdimm/claim.c | 2
drivers/nvdimm/core.c | 122 +++++++++++
drivers/nvdimm/dimm_devs.c | 5
drivers/nvdimm/nd-core.h | 4
drivers/nvdimm/nd.h | 10 +
drivers/nvdimm/pmem.c | 59 ++++-
drivers/nvdimm/pmem.h | 4
drivers/nvdimm/region.c | 19 +-
drivers/nvdimm/region_devs.c | 148 ++++++++++++-
drivers/s390/block/dcssblk.c | 6 -
fs/dax.c | 13 -
include/linux/blkdev.h | 6 -
include/linux/compiler.h | 2
include/linux/libnvdimm.h | 16 +
include/linux/nd.h | 3
include/linux/pmem.h | 117 ++--------
scripts/checkpatch.pl | 1
tools/objtool/arch/x86/insn/x86-opcode-map.txt | 2
tools/perf/arch/x86/tests/insn-x86-dat-32.c | 2
tools/perf/arch/x86/tests/insn-x86-dat-64.c | 2
tools/perf/arch/x86/tests/insn-x86-dat-src.c | 4
.../perf/util/intel-pt-decoder/x86-opcode-map.txt | 2
tools/testing/nvdimm/pmem-dax.c | 2
tools/testing/nvdimm/test/nfit.c | 55 +++--
39 files changed, 505 insertions(+), 555 deletions(-)