diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/nvdimm/nd.h | 4 | ||||
| -rw-r--r-- | drivers/nvdimm/pfn_devs.c | 10 | 
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 1b9955651379..e89af4b2d8e9 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -375,6 +375,10 @@ unsigned int pmem_sector_size(struct nd_namespace_common *ndns);  void nvdimm_badblocks_populate(struct nd_region *nd_region,  		struct badblocks *bb, const struct resource *res);  #if IS_ENABLED(CONFIG_ND_CLAIM) + +/* max struct page size independent of kernel config */ +#define MAX_STRUCT_PAGE_SIZE 64 +  int nvdimm_setup_pfn(struct nd_pfn *nd_pfn, struct dev_pagemap *pgmap);  int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio);  void devm_nsio_disable(struct device *dev, struct nd_namespace_io *nsio); diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c index 3e7b11cf1aae..cd120feb9213 100644 --- a/drivers/nvdimm/pfn_devs.c +++ b/drivers/nvdimm/pfn_devs.c @@ -701,8 +701,16 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)  		 * The altmap should be padded out to the block size used  		 * when populating the vmemmap. This *should* be equal to  		 * PMD_SIZE for most architectures. +		 * +		 * Also make sure size of struct page is less than 64. We +		 * want to make sure we use large enough size here so that +		 * we don't have a dynamic reserve space depending on +		 * struct page size. But we also want to make sure we notice +		 * when we end up adding new elements to struct page.  		 */ -		offset = ALIGN(start + SZ_8K + 64 * npfns, align) - start; +		BUILD_BUG_ON(sizeof(struct page) > MAX_STRUCT_PAGE_SIZE); +		offset = ALIGN(start + SZ_8K + MAX_STRUCT_PAGE_SIZE * npfns, align) +			- start;  	} else if (nd_pfn->mode == PFN_MODE_RAM)  		offset = ALIGN(start + SZ_8K, align) - start;  	else  | 
