libnvdimm, nd_blk: remove mmio_flush_range()
authorRobin Murphy <robin.murphy@arm.com>
Thu, 31 Aug 2017 11:27:09 +0000 (12:27 +0100)
committerDan Williams <dan.j.williams@intel.com>
Thu, 31 Aug 2017 22:05:10 +0000 (15:05 -0700)
mmio_flush_range() suffers from a lack of clearly-defined semantics,
and is somewhat ambiguous to port to other architectures where the
scope of the writeback implied by "flush" and ordering might matter,
but MMIO would tend to imply non-cacheable anyway. Per the rationale
in 67a3e8fe9015 ("nd_blk: change aperture mapping from WC to WB"), the
only existing use is actually to invalidate clean cache lines for
ARCH_MEMREMAP_PMEM type mappings *without* writeback. Since the recent
cleanup of the pmem API, that also now happens to be the exact purpose
of arch_invalidate_pmem(), which would be a far more well-defined tool
for the job.

Rather than risk potentially inconsistent implementations of
mmio_flush_range() for the sake of one callsite, streamline things by
removing it entirely and instead move the ARCH_MEMREMAP_PMEM related
definitions up to the libnvdimm level, so they can be shared by NFIT
as well. This allows NFIT to be enabled for arm64.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
arch/x86/Kconfig
arch/x86/include/asm/cacheflush.h
drivers/acpi/nfit/Kconfig
drivers/acpi/nfit/core.c
drivers/nvdimm/pmem.h
include/linux/libnvdimm.h
lib/Kconfig
tools/testing/nvdimm/test/nfit.c

index 781521b7cf9ef6b6766dac9249a3568f257c4fa8..5f3b756ec0d3e58728bada989a1ce454f88d6873 100644 (file)
@@ -53,7 +53,6 @@ config X86
        select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_GCOV_PROFILE_ALL
        select ARCH_HAS_KCOV                    if X86_64
-       select ARCH_HAS_MMIO_FLUSH
        select ARCH_HAS_PMEM_API                if X86_64
        select ARCH_HAS_UACCESS_FLUSHCACHE      if X86_64
        select ARCH_HAS_SET_MEMORY
index 8b4140f6724f4cfe4cf89135b9e0547baa527d94..cb9a1af109b4796152d8017ca8a9d11f959183f7 100644 (file)
@@ -7,6 +7,4 @@
 
 void clflush_cache_range(void *addr, unsigned int size);
 
-#define mmio_flush_range(addr, size) clflush_cache_range(addr, size)
-
 #endif /* _ASM_X86_CACHEFLUSH_H */
index 6d3351452ea2e7c126ee0219aeddfec422832ec6..929ba4da0b3097d6d9c2ae583f4950be20227124 100644 (file)
@@ -2,7 +2,7 @@ config ACPI_NFIT
        tristate "ACPI NVDIMM Firmware Interface Table (NFIT)"
        depends on PHYS_ADDR_T_64BIT
        depends on BLK_DEV
-       depends on ARCH_HAS_MMIO_FLUSH
+       depends on ARCH_HAS_PMEM_API
        select LIBNVDIMM
        help
          Infrastructure to probe ACPI 6 compliant platforms for
index 03105648f9b16d41976bae7202d316312645b109..c20124a6eb4964890e25edc50d0de2cacfd80bba 100644 (file)
@@ -1964,7 +1964,7 @@ static int acpi_nfit_blk_single_io(struct nfit_blk *nfit_blk,
                        memcpy_flushcache(mmio->addr.aperture + offset, iobuf + copied, c);
                else {
                        if (nfit_blk->dimm_flags & NFIT_BLK_READ_FLUSH)
-                               mmio_flush_range((void __force *)
+                               arch_invalidate_pmem((void __force *)
                                        mmio->addr.aperture + offset, c);
 
                        memcpy(iobuf + copied, mmio->addr.aperture + offset, c);
index 5434321cad67f11d4f044a0a7152a8e5035aa97d..c5917f040fa7ba56a8229a45c4134ae9a79535ea 100644 (file)
@@ -5,20 +5,6 @@
 #include <linux/pfn_t.h>
 #include <linux/fs.h>
 
-#ifdef CONFIG_ARCH_HAS_PMEM_API
-#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
-void arch_wb_cache_pmem(void *addr, size_t size);
-void arch_invalidate_pmem(void *addr, size_t size);
-#else
-#define ARCH_MEMREMAP_PMEM MEMREMAP_WT
-static inline void arch_wb_cache_pmem(void *addr, size_t size)
-{
-}
-static inline void arch_invalidate_pmem(void *addr, size_t size)
-{
-}
-#endif
-
 /* this definition is in it's own header for tools/testing/nvdimm to consume */
 struct pmem_device {
        /* One contiguous memory region per device */
index 9b8d81a7b80eaa2db050755a5e4ac7e1e181822f..3eaad2fbf284ea81688316a6a623f062adeadb4c 100644 (file)
@@ -174,4 +174,19 @@ u64 nd_fletcher64(void *addr, size_t len, bool le);
 void nvdimm_flush(struct nd_region *nd_region);
 int nvdimm_has_flush(struct nd_region *nd_region);
 int nvdimm_has_cache(struct nd_region *nd_region);
+
+#ifdef CONFIG_ARCH_HAS_PMEM_API
+#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
+void arch_wb_cache_pmem(void *addr, size_t size);
+void arch_invalidate_pmem(void *addr, size_t size);
+#else
+#define ARCH_MEMREMAP_PMEM MEMREMAP_WT
+static inline void arch_wb_cache_pmem(void *addr, size_t size)
+{
+}
+static inline void arch_invalidate_pmem(void *addr, size_t size)
+{
+}
+#endif
+
 #endif /* __LIBNVDIMM_H__ */
index 6762529ad9e4597f473a07e9300bd0ac8a601c10..527da69e3be1a1c192e10c787befcb82bad350cd 100644 (file)
@@ -559,9 +559,6 @@ config ARCH_HAS_PMEM_API
 config ARCH_HAS_UACCESS_FLUSHCACHE
        bool
 
-config ARCH_HAS_MMIO_FLUSH
-       bool
-
 config STACKDEPOT
        bool
        select STACKTRACE
index 4c2fa98ef39dffc2f15d60801d5463b3f2a3d3d4..d20791c3f4990bdced0308989205db61f07087a0 100644 (file)
@@ -1546,8 +1546,8 @@ static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
        else {
                memcpy(iobuf, mmio->addr.base + dpa, len);
 
-               /* give us some some coverage of the mmio_flush_range() API */
-               mmio_flush_range(mmio->addr.base + dpa, len);
+               /* give us some some coverage of the arch_invalidate_pmem() API */
+               arch_invalidate_pmem(mmio->addr.base + dpa, len);
        }
        nd_region_release_lane(nd_region, lane);