Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

memregion: Support fine grained invalidate by cpu_cache_invalidate_memregion()

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>

authored by

Yicong Yang and committed by
Conor Dooley
b43652d8 f49ae864

+18 -6
+1 -1
arch/x86/mm/pat/set_memory.c
··· 368 368 } 369 369 EXPORT_SYMBOL_NS_GPL(cpu_cache_has_invalidate_memregion, "DEVMEM"); 370 370 371 - int cpu_cache_invalidate_memregion(void) 371 + int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len) 372 372 { 373 373 if (WARN_ON_ONCE(!cpu_cache_has_invalidate_memregion())) 374 374 return -ENXIO;
+4 -1
drivers/cxl/core/region.c
··· 228 228 return -ENXIO; 229 229 } 230 230 231 - cpu_cache_invalidate_memregion(); 231 + if (!cxlr->params.res) 232 + return -ENXIO; 233 + cpu_cache_invalidate_memregion(cxlr->params.res->start, 234 + resource_size(cxlr->params.res)); 232 235 return 0; 233 236 } 234 237
+1 -1
drivers/nvdimm/region.c
··· 110 110 * here is ok. 111 111 */ 112 112 if (cpu_cache_has_invalidate_memregion()) 113 - cpu_cache_invalidate_memregion(); 113 + cpu_cache_invalidate_all(); 114 114 } 115 115 116 116 static int child_notify(struct device *dev, void *data)
+1 -1
drivers/nvdimm/region_devs.c
··· 90 90 } 91 91 } 92 92 93 - cpu_cache_invalidate_memregion(); 93 + cpu_cache_invalidate_all(); 94 94 out: 95 95 for (i = 0; i < nd_region->ndr_mappings; i++) { 96 96 struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+11 -2
include/linux/memregion.h
··· 27 27 /** 28 28 * cpu_cache_invalidate_memregion - drop any CPU cached data for 29 29 * memregion 30 + * @start: start physical address of the target memory region. 31 + * @len: length of the target memory region. -1 for all the regions of 32 + * the target type. 30 33 * 31 34 * Perform cache maintenance after a memory event / operation that 32 35 * changes the contents of physical memory in a cache-incoherent manner. ··· 48 45 * the cache maintenance. 49 46 */ 50 47 #ifdef CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION 51 - int cpu_cache_invalidate_memregion(void); 48 + int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len); 52 49 bool cpu_cache_has_invalidate_memregion(void); 53 50 #else 54 51 static inline bool cpu_cache_has_invalidate_memregion(void) ··· 56 53 return false; 57 54 } 58 55 59 - static inline int cpu_cache_invalidate_memregion(void) 56 + static inline int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len) 60 57 { 61 58 WARN_ON_ONCE("CPU cache invalidation required"); 62 59 return -ENXIO; 63 60 } 64 61 #endif 62 + 63 + static inline int cpu_cache_invalidate_all(void) 64 + { 65 + return cpu_cache_invalidate_memregion(0, -1); 66 + } 67 + 65 68 #endif /* _MEMREGION_H_ */