]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
memregion: Support fine grained invalidate by cpu_cache_invalidate_memregion()
authorYicong Yang <yangyicong@hisilicon.com>
Mon, 17 Nov 2025 10:47:55 +0000 (10:47 +0000)
committerConor Dooley <conor.dooley@microchip.com>
Mon, 17 Nov 2025 23:45:45 +0000 (23:45 +0000)
Extend cpu_cache_invalidate_memregion() to support invalidating a
particular range of memory by introducing start and length parameters.
Control of types of invalidation is left for when use cases turn up. For
now everything is Clean and Invalidate.

Where the range is unknown, use the provided cpu_cache_invalidate_all()
helper to act as documentation of intent in a fashion that is clearer than
passing (0, -1) to cpu_cache_invalidate_memregion().

Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
arch/x86/mm/pat/set_memory.c
drivers/cxl/core/region.c
drivers/nvdimm/region.c
drivers/nvdimm/region_devs.c
include/linux/memregion.h

index 4019b17fb65edd6d5a6235c876ae8db77a83c324..292c7202faed9e6c658e4ca252c7152dff0b6a88 100644 (file)
@@ -368,7 +368,7 @@ bool cpu_cache_has_invalidate_memregion(void)
 }
 EXPORT_SYMBOL_NS_GPL(cpu_cache_has_invalidate_memregion, "DEVMEM");
 
-int cpu_cache_invalidate_memregion(void)
+int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len)
 {
        if (WARN_ON_ONCE(!cpu_cache_has_invalidate_memregion()))
                return -ENXIO;
index d7fa76810f8268d24c50cafbcacfadc3c17529ea..410e41cef5d3f5278af24ba9b89e19da05504960 100644 (file)
@@ -228,7 +228,10 @@ static int cxl_region_invalidate_memregion(struct cxl_region *cxlr)
                return -ENXIO;
        }
 
-       cpu_cache_invalidate_memregion();
+       if (!cxlr->params.res)
+               return -ENXIO;
+       cpu_cache_invalidate_memregion(cxlr->params.res->start,
+                                      resource_size(cxlr->params.res));
        return 0;
 }
 
index c43506448edf84a0c92f3cc0acdfe0403443efe7..42e982db5b049acc307f2bb4a1e053bdc36fb592 100644 (file)
@@ -110,7 +110,7 @@ static void nd_region_remove(struct device *dev)
         * here is ok.
         */
        if (cpu_cache_has_invalidate_memregion())
-               cpu_cache_invalidate_memregion();
+               cpu_cache_invalidate_all();
 }
 
 static int child_notify(struct device *dev, void *data)
index 3cdd93d40997ffcd56b4cd2b63c6176aad7795a5..e27fc380f6c0b96f53171e02e73f8cf12260d0ee 100644 (file)
@@ -90,7 +90,7 @@ static int nd_region_invalidate_memregion(struct nd_region *nd_region)
                }
        }
 
-       cpu_cache_invalidate_memregion();
+       cpu_cache_invalidate_all();
 out:
        for (i = 0; i < nd_region->ndr_mappings; i++) {
                struct nd_mapping *nd_mapping = &nd_region->mapping[i];
index 945646bde825c93e40bdb5f06d961028adb174b7..a55f62cc52660e5355d7495c42d7698ec5a08007 100644 (file)
@@ -27,6 +27,9 @@ static inline void memregion_free(int id)
 /**
  * cpu_cache_invalidate_memregion - drop any CPU cached data for
  *     memregion
+ * @start: start physical address of the target memory region.
+ * @len: length of the target memory region. -1 for all the regions of
+ *       the target type.
  *
  * Perform cache maintenance after a memory event / operation that
  * changes the contents of physical memory in a cache-incoherent manner.
@@ -45,7 +48,7 @@ static inline void memregion_free(int id)
  * the cache maintenance.
  */
 #ifdef CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION
-int cpu_cache_invalidate_memregion(void);
+int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len);
 bool cpu_cache_has_invalidate_memregion(void);
 #else
 static inline bool cpu_cache_has_invalidate_memregion(void)
@@ -53,10 +56,16 @@ static inline bool cpu_cache_has_invalidate_memregion(void)
        return false;
 }
 
-static inline int cpu_cache_invalidate_memregion(void)
+static inline int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len)
 {
        WARN_ON_ONCE("CPU cache invalidation required");
        return -ENXIO;
 }
 #endif
+
+static inline int cpu_cache_invalidate_all(void)
+{
+       return cpu_cache_invalidate_memregion(0, -1);
+}
+
 #endif /* _MEMREGION_H_ */