From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C342C47095 for ; Tue, 6 Oct 2020 07:14:10 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id ACC302078E for ; Tue, 6 Oct 2020 07:14:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ACC302078E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 46BD56B0074; Tue, 6 Oct 2020 03:14:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 41BF18E0001; Tue, 6 Oct 2020 03:14:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 309676B0078; Tue, 6 Oct 2020 03:14:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0202.hostedemail.com [216.40.44.202]) by kanga.kvack.org (Postfix) with ESMTP id ED2BA6B0074 for ; Tue, 6 Oct 2020 03:14:08 -0400 (EDT) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 7B23F181AE871 for ; Tue, 6 Oct 2020 07:14:08 +0000 (UTC) X-FDA: 77340636576.14.pump66_630457b271c4 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin14.hostedemail.com (Postfix) with ESMTP id 5C5A618229835 for ; Tue, 6 Oct 2020 07:14:08 +0000 (UTC) X-HE-Tag: pump66_630457b271c4 X-Filterd-Recvd-Size: 40471 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf47.hostedemail.com (Postfix) with ESMTP for ; Tue, 6 Oct 2020 07:14:07 +0000 (UTC) IronPort-SDR: i+ZhNyuvUF2xU52R8u4LWa8RXLag8uPZmR5YKT7zC7tTS6kUxPnc5W5QjyOCcq87lwGQXd3yay +TnaLQ/5ZG4Q== X-IronPort-AV: E=McAfee;i="6000,8403,9765"; a="161003641" X-IronPort-AV: E=Sophos;i="5.77,342,1596524400"; d="scan'208";a="161003641" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Oct 2020 00:14:06 -0700 IronPort-SDR: UYbgY8oCorpF56WK+5x0acSqLwKCCAr5lM2Q/R7z4aoNNTbXBBDKh/VOhtBXDj57UpYk6QBc/n lkhU1g6VnaLg== X-IronPort-AV: E=Sophos;i="5.77,342,1596524400"; d="scan'208";a="296852034" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.25]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Oct 2020 00:14:05 -0700 Subject: [PATCH v6 09/11] mm/memremap_pages: convert to 'struct range' From: Dan Williams To: akpm@linux-foundation.org Cc: Paul Mackerras , Michael Ellerman , Benjamin Herrenschmidt , Vishal Verma , Vivek Goyal , Dave Jiang , Ben Skeggs , David Airlie , Daniel Vetter , Ira Weiny , Bjorn Helgaas , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , =?utf-8?b?SsOpcsO0bWU=?= Glisse , Dan Carpenter , dave.hansen@linux.intel.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, david@redhat.com, joao.m.martins@oracle.com Date: Mon, 05 Oct 2020 23:55:36 -0700 Message-ID: <160196733645.2166475.12840692906594512941.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <160196728453.2166475.12832711415715687418.stgit@dwillia2-desk3.amr.corp.intel.com> References: <160196728453.2166475.12832711415715687418.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-3-g996c MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The 'struct resource' in 'struct dev_pagemap' is only used for holding resource span information. The other fields, 'name', 'flags', 'desc', 'parent', 'sibling', and 'child' are all unused wasted space. This is in preparation for introducing a multi-range extension of devm_memremap_pages(). The bulk of this change is unwinding all the places internal to libnvdimm that used 'struct resource' unnecessarily, and replacing instances of 'struct dev_pagemap'.res with 'struct dev_pagemap'.range. P2PDMA had a minor usage of the resource flags field, but only to report failures with "%pR". That is replaced with an open coded print of the range. Link: https://lkml.kernel.org/r/159643103173.4062302.768998885691711532.s= tgit@dwillia2-desk3.amr.corp.intel.com Link: https://lkml.kernel.org/r/20200926121402.GA7467@kadam Cc: Paul Mackerras Cc: Michael Ellerman Cc: Benjamin Herrenschmidt Cc: Vishal Verma Cc: Vivek Goyal Cc: Dave Jiang Cc: Ben Skeggs Cc: David Airlie Cc: Daniel Vetter Cc: Ira Weiny Cc: Bjorn Helgaas Cc: Boris Ostrovsky Cc: Juergen Gross Cc: Stefano Stabellini Cc: "J=C3=A9r=C3=B4me Glisse" Cc: Andrew Morton Reported-by: Dan Carpenter Signed-off-by: Dan Williams --- arch/powerpc/kvm/book3s_hv_uvmem.c | 13 +++-- drivers/dax/bus.c | 10 ++-- drivers/dax/bus.h | 2 - drivers/dax/device.c | 3 - drivers/dax/hmem/hmem.c | 5 ++ drivers/dax/pmem/core.c | 12 ++--- drivers/gpu/drm/nouveau/nouveau_dmem.c | 14 +++--- drivers/nvdimm/badrange.c | 26 +++++------ drivers/nvdimm/claim.c | 13 +++-- drivers/nvdimm/nd.h | 3 + drivers/nvdimm/pfn_devs.c | 12 ++--- drivers/nvdimm/pmem.c | 26 ++++++----- drivers/nvdimm/region.c | 21 +++++---- drivers/pci/p2pdma.c | 11 ++--- drivers/xen/unpopulated-alloc.c | 48 +++++++++++++------- include/linux/memremap.h | 5 +- include/linux/range.h | 1=20 lib/test_hmm.c | 50 ++++++++++----------- mm/memremap.c | 77 ++++++++++++++++----------= ------ tools/testing/nvdimm/test/iomap.c | 2 - 20 files changed, 192 insertions(+), 162 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv_uvmem.c b/arch/powerpc/kvm/book3s= _hv_uvmem.c index 7705d5557239..29ec555055c2 100644 --- a/arch/powerpc/kvm/book3s_hv_uvmem.c +++ b/arch/powerpc/kvm/book3s_hv_uvmem.c @@ -687,9 +687,9 @@ static struct page *kvmppc_uvmem_get_page(unsigned lo= ng gpa, struct kvm *kvm) struct kvmppc_uvmem_page_pvt *pvt; unsigned long pfn_last, pfn_first; =20 - pfn_first =3D kvmppc_uvmem_pgmap.res.start >> PAGE_SHIFT; + pfn_first =3D kvmppc_uvmem_pgmap.range.start >> PAGE_SHIFT; pfn_last =3D pfn_first + - (resource_size(&kvmppc_uvmem_pgmap.res) >> PAGE_SHIFT); + (range_len(&kvmppc_uvmem_pgmap.range) >> PAGE_SHIFT); =20 spin_lock(&kvmppc_uvmem_bitmap_lock); bit =3D find_first_zero_bit(kvmppc_uvmem_bitmap, @@ -1007,7 +1007,7 @@ static vm_fault_t kvmppc_uvmem_migrate_to_ram(struc= t vm_fault *vmf) static void kvmppc_uvmem_page_free(struct page *page) { unsigned long pfn =3D page_to_pfn(page) - - (kvmppc_uvmem_pgmap.res.start >> PAGE_SHIFT); + (kvmppc_uvmem_pgmap.range.start >> PAGE_SHIFT); struct kvmppc_uvmem_page_pvt *pvt; =20 spin_lock(&kvmppc_uvmem_bitmap_lock); @@ -1170,7 +1170,8 @@ int kvmppc_uvmem_init(void) } =20 kvmppc_uvmem_pgmap.type =3D MEMORY_DEVICE_PRIVATE; - kvmppc_uvmem_pgmap.res =3D *res; + kvmppc_uvmem_pgmap.range.start =3D res->start; + kvmppc_uvmem_pgmap.range.end =3D res->end; kvmppc_uvmem_pgmap.ops =3D &kvmppc_uvmem_ops; /* just one global instance: */ kvmppc_uvmem_pgmap.owner =3D &kvmppc_uvmem_pgmap; @@ -1205,7 +1206,7 @@ void kvmppc_uvmem_free(void) return; =20 memunmap_pages(&kvmppc_uvmem_pgmap); - release_mem_region(kvmppc_uvmem_pgmap.res.start, - resource_size(&kvmppc_uvmem_pgmap.res)); + release_mem_region(kvmppc_uvmem_pgmap.range.start, + range_len(&kvmppc_uvmem_pgmap.range)); kfree(kvmppc_uvmem_bitmap); } diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c index 53d07f2f1285..00fa73a8dfb4 100644 --- a/drivers/dax/bus.c +++ b/drivers/dax/bus.c @@ -515,7 +515,7 @@ static void dax_region_unregister(void *region) } =20 struct dax_region *alloc_dax_region(struct device *parent, int region_id= , - struct resource *res, int target_node, unsigned int align, + struct range *range, int target_node, unsigned int align, unsigned long flags) { struct dax_region *dax_region; @@ -530,8 +530,8 @@ struct dax_region *alloc_dax_region(struct device *pa= rent, int region_id, return NULL; } =20 - if (!IS_ALIGNED(res->start, align) - || !IS_ALIGNED(resource_size(res), align)) + if (!IS_ALIGNED(range->start, align) + || !IS_ALIGNED(range_len(range), align)) return NULL; =20 dax_region =3D kzalloc(sizeof(*dax_region), GFP_KERNEL); @@ -546,8 +546,8 @@ struct dax_region *alloc_dax_region(struct device *pa= rent, int region_id, dax_region->target_node =3D target_node; ida_init(&dax_region->ida); dax_region->res =3D (struct resource) { - .start =3D res->start, - .end =3D res->end, + .start =3D range->start, + .end =3D range->end, .flags =3D IORESOURCE_MEM | flags, }; =20 diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h index da27ea70a19a..72b92f95509f 100644 --- a/drivers/dax/bus.h +++ b/drivers/dax/bus.h @@ -13,7 +13,7 @@ void dax_region_put(struct dax_region *dax_region); =20 #define IORESOURCE_DAX_STATIC (1UL << 0) struct dax_region *alloc_dax_region(struct device *parent, int region_id= , - struct resource *res, int target_node, unsigned int align, + struct range *range, int target_node, unsigned int align, unsigned long flags); =20 enum dev_dax_subsys { diff --git a/drivers/dax/device.c b/drivers/dax/device.c index 9833fa83b537..a14448bca83d 100644 --- a/drivers/dax/device.c +++ b/drivers/dax/device.c @@ -416,8 +416,7 @@ int dev_dax_probe(struct dev_dax *dev_dax) pgmap =3D devm_kzalloc(dev, sizeof(*pgmap), GFP_KERNEL); if (!pgmap) return -ENOMEM; - pgmap->res.start =3D range->start; - pgmap->res.end =3D range->end; + pgmap->range =3D *range; } pgmap->type =3D MEMORY_DEVICE_GENERIC; addr =3D devm_memremap_pages(dev, pgmap); diff --git a/drivers/dax/hmem/hmem.c b/drivers/dax/hmem/hmem.c index aa260009dfc7..1a3347bb6143 100644 --- a/drivers/dax/hmem/hmem.c +++ b/drivers/dax/hmem/hmem.c @@ -13,13 +13,16 @@ static int dax_hmem_probe(struct platform_device *pde= v) struct dev_dax_data data; struct dev_dax *dev_dax; struct resource *res; + struct range range; =20 res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENOMEM; =20 mri =3D dev->platform_data; - dax_region =3D alloc_dax_region(dev, pdev->id, res, mri->target_node, + range.start =3D res->start; + range.end =3D res->end; + dax_region =3D alloc_dax_region(dev, pdev->id, &range, mri->target_node= , PMD_SIZE, 0); if (!dax_region) return -ENOMEM; diff --git a/drivers/dax/pmem/core.c b/drivers/dax/pmem/core.c index 4fe700884338..62b26bfceab1 100644 --- a/drivers/dax/pmem/core.c +++ b/drivers/dax/pmem/core.c @@ -9,7 +9,7 @@ =20 struct dev_dax *__dax_pmem_probe(struct device *dev, enum dev_dax_subsys= subsys) { - struct resource res; + struct range range; int rc, id, region_id; resource_size_t offset; struct nd_pfn_sb *pfn_sb; @@ -50,10 +50,10 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, = enum dev_dax_subsys subsys) if (rc !=3D 2) return ERR_PTR(-EINVAL); =20 - /* adjust the dax_region resource to the start of data */ - memcpy(&res, &pgmap.res, sizeof(res)); - res.start +=3D offset; - dax_region =3D alloc_dax_region(dev, region_id, &res, + /* adjust the dax_region range to the start of data */ + range =3D pgmap.range; + range.start +=3D offset, + dax_region =3D alloc_dax_region(dev, region_id, &range, nd_region->target_node, le32_to_cpu(pfn_sb->align), IORESOURCE_DAX_STATIC); if (!dax_region) @@ -64,7 +64,7 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, en= um dev_dax_subsys subsys) .id =3D id, .pgmap =3D &pgmap, .subsys =3D subsys, - .size =3D resource_size(&res), + .size =3D range_len(&range), }; dev_dax =3D devm_create_dev_dax(&data); =20 diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nou= veau/nouveau_dmem.c index 4e8112fde3e6..25811ed7e274 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dmem.c +++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c @@ -101,7 +101,7 @@ unsigned long nouveau_dmem_page_addr(struct page *pag= e) { struct nouveau_dmem_chunk *chunk =3D nouveau_page_to_chunk(page); unsigned long off =3D (page_to_pfn(page) << PAGE_SHIFT) - - chunk->pagemap.res.start; + chunk->pagemap.range.start; =20 return chunk->bo->offset + off; } @@ -249,7 +249,8 @@ nouveau_dmem_chunk_alloc(struct nouveau_drm *drm, str= uct page **ppage) =20 chunk->drm =3D drm; chunk->pagemap.type =3D MEMORY_DEVICE_PRIVATE; - chunk->pagemap.res =3D *res; + chunk->pagemap.range.start =3D res->start; + chunk->pagemap.range.end =3D res->end; chunk->pagemap.ops =3D &nouveau_dmem_pagemap_ops; chunk->pagemap.owner =3D drm->dev; =20 @@ -273,7 +274,7 @@ nouveau_dmem_chunk_alloc(struct nouveau_drm *drm, str= uct page **ppage) list_add(&chunk->list, &drm->dmem->chunks); mutex_unlock(&drm->dmem->mutex); =20 - pfn_first =3D chunk->pagemap.res.start >> PAGE_SHIFT; + pfn_first =3D chunk->pagemap.range.start >> PAGE_SHIFT; page =3D pfn_to_page(pfn_first); spin_lock(&drm->dmem->lock); for (i =3D 0; i < DMEM_CHUNK_NPAGES - 1; ++i, ++page) { @@ -294,8 +295,7 @@ nouveau_dmem_chunk_alloc(struct nouveau_drm *drm, str= uct page **ppage) out_bo_free: nouveau_bo_ref(NULL, &chunk->bo); out_release: - release_mem_region(chunk->pagemap.res.start, - resource_size(&chunk->pagemap.res)); + release_mem_region(chunk->pagemap.range.start, range_len(&chunk->pagema= p.range)); out_free: kfree(chunk); out: @@ -382,8 +382,8 @@ nouveau_dmem_fini(struct nouveau_drm *drm) nouveau_bo_ref(NULL, &chunk->bo); list_del(&chunk->list); memunmap_pages(&chunk->pagemap); - release_mem_region(chunk->pagemap.res.start, - resource_size(&chunk->pagemap.res)); + release_mem_region(chunk->pagemap.range.start, + range_len(&chunk->pagemap.range)); kfree(chunk); } =20 diff --git a/drivers/nvdimm/badrange.c b/drivers/nvdimm/badrange.c index b9eeefa27e3a..aaf6e215a8c6 100644 --- a/drivers/nvdimm/badrange.c +++ b/drivers/nvdimm/badrange.c @@ -211,7 +211,7 @@ static void __add_badblock_range(struct badblocks *bb= , u64 ns_offset, u64 len) } =20 static void badblocks_populate(struct badrange *badrange, - struct badblocks *bb, const struct resource *res) + struct badblocks *bb, const struct range *range) { struct badrange_entry *bre; =20 @@ -222,34 +222,34 @@ static void badblocks_populate(struct badrange *bad= range, u64 bre_end =3D bre->start + bre->length - 1; =20 /* Discard intervals with no intersection */ - if (bre_end < res->start) + if (bre_end < range->start) continue; - if (bre->start > res->end) + if (bre->start > range->end) continue; /* Deal with any overlap after start of the namespace */ - if (bre->start >=3D res->start) { + if (bre->start >=3D range->start) { u64 start =3D bre->start; u64 len; =20 - if (bre_end <=3D res->end) + if (bre_end <=3D range->end) len =3D bre->length; else - len =3D res->start + resource_size(res) + len =3D range->start + range_len(range) - bre->start; - __add_badblock_range(bb, start - res->start, len); + __add_badblock_range(bb, start - range->start, len); continue; } /* * Deal with overlap for badrange starting before * the namespace. */ - if (bre->start < res->start) { + if (bre->start < range->start) { u64 len; =20 - if (bre_end < res->end) - len =3D bre->start + bre->length - res->start; + if (bre_end < range->end) + len =3D bre->start + bre->length - range->start; else - len =3D resource_size(res); + len =3D range_len(range); __add_badblock_range(bb, 0, len); } } @@ -267,7 +267,7 @@ static void badblocks_populate(struct badrange *badra= nge, * and add badblocks entries for all matching sub-ranges */ void nvdimm_badblocks_populate(struct nd_region *nd_region, - struct badblocks *bb, const struct resource *res) + struct badblocks *bb, const struct range *range) { struct nvdimm_bus *nvdimm_bus; =20 @@ -279,7 +279,7 @@ void nvdimm_badblocks_populate(struct nd_region *nd_r= egion, nvdimm_bus =3D walk_to_nvdimm_bus(&nd_region->dev); =20 nvdimm_bus_lock(&nvdimm_bus->dev); - badblocks_populate(&nvdimm_bus->badrange, bb, res); + badblocks_populate(&nvdimm_bus->badrange, bb, range); nvdimm_bus_unlock(&nvdimm_bus->dev); } EXPORT_SYMBOL_GPL(nvdimm_badblocks_populate); diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c index 45964acba944..290267e1ff9f 100644 --- a/drivers/nvdimm/claim.c +++ b/drivers/nvdimm/claim.c @@ -303,13 +303,16 @@ static int nsio_rw_bytes(struct nd_namespace_common= *ndns, int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio, resource_size_t size) { - struct resource *res =3D &nsio->res; struct nd_namespace_common *ndns =3D &nsio->common; + struct range range =3D { + .start =3D nsio->res.start, + .end =3D nsio->res.end, + }; =20 nsio->size =3D size; - if (!devm_request_mem_region(dev, res->start, size, + if (!devm_request_mem_region(dev, range.start, size, dev_name(&ndns->dev))) { - dev_warn(dev, "could not reserve region %pR\n", res); + dev_warn(dev, "could not reserve region %pR\n", &nsio->res); return -EBUSY; } =20 @@ -317,9 +320,9 @@ int devm_nsio_enable(struct device *dev, struct nd_na= mespace_io *nsio, if (devm_init_badblocks(dev, &nsio->bb)) return -ENOMEM; nvdimm_badblocks_populate(to_nd_region(ndns->dev.parent), &nsio->bb, - &nsio->res); + &range); =20 - nsio->addr =3D devm_memremap(dev, res->start, size, ARCH_MEMREMAP_PMEM)= ; + nsio->addr =3D devm_memremap(dev, range.start, size, ARCH_MEMREMAP_PMEM= ); =20 return PTR_ERR_OR_ZERO(nsio->addr); } diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 85c1ae813ea3..bac90afa4604 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -377,8 +377,9 @@ int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt= ); const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns, char *name); unsigned int pmem_sector_size(struct nd_namespace_common *ndns); +struct range; void nvdimm_badblocks_populate(struct nd_region *nd_region, - struct badblocks *bb, const struct resource *res); + struct badblocks *bb, const struct range *range); int devm_namespace_enable(struct device *dev, struct nd_namespace_common= *ndns, resource_size_t size); void devm_namespace_disable(struct device *dev, diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c index 3e11ef8d3f5b..3c4787b92a6a 100644 --- a/drivers/nvdimm/pfn_devs.c +++ b/drivers/nvdimm/pfn_devs.c @@ -672,7 +672,7 @@ static unsigned long init_altmap_reserve(resource_siz= e_t base) =20 static int __nvdimm_setup_pfn(struct nd_pfn *nd_pfn, struct dev_pagemap = *pgmap) { - struct resource *res =3D &pgmap->res; + struct range *range =3D &pgmap->range; struct vmem_altmap *altmap =3D &pgmap->altmap; struct nd_pfn_sb *pfn_sb =3D nd_pfn->pfn_sb; u64 offset =3D le64_to_cpu(pfn_sb->dataoff); @@ -689,16 +689,16 @@ static int __nvdimm_setup_pfn(struct nd_pfn *nd_pfn= , struct dev_pagemap *pgmap) .end_pfn =3D PHYS_PFN(end), }; =20 - memcpy(res, &nsio->res, sizeof(*res)); - res->start +=3D start_pad; - res->end -=3D end_trunc; - + *range =3D (struct range) { + .start =3D nsio->res.start + start_pad, + .end =3D nsio->res.end - end_trunc, + }; if (nd_pfn->mode =3D=3D PFN_MODE_RAM) { if (offset < reserve) return -EINVAL; nd_pfn->npfns =3D le64_to_cpu(pfn_sb->npfns); } else if (nd_pfn->mode =3D=3D PFN_MODE_PMEM) { - nd_pfn->npfns =3D PHYS_PFN((resource_size(res) - offset)); + nd_pfn->npfns =3D PHYS_PFN((range_len(range) - offset)); if (le64_to_cpu(nd_pfn->pfn_sb->npfns) > nd_pfn->npfns) dev_info(&nd_pfn->dev, "number of pfns truncated from %lld to %ld\n", diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index fab29b514372..69cc0e783709 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -376,7 +376,7 @@ static int pmem_attach_disk(struct device *dev, struct nd_region *nd_region =3D to_nd_region(dev->parent); int nid =3D dev_to_node(dev), fua; struct resource *res =3D &nsio->res; - struct resource bb_res; + struct range bb_range; struct nd_pfn *nd_pfn =3D NULL; struct dax_device *dax_dev; struct nd_pfn_sb *pfn_sb; @@ -435,24 +435,26 @@ static int pmem_attach_disk(struct device *dev, pfn_sb =3D nd_pfn->pfn_sb; pmem->data_offset =3D le64_to_cpu(pfn_sb->dataoff); pmem->pfn_pad =3D resource_size(res) - - resource_size(&pmem->pgmap.res); + range_len(&pmem->pgmap.range); pmem->pfn_flags |=3D PFN_MAP; - memcpy(&bb_res, &pmem->pgmap.res, sizeof(bb_res)); - bb_res.start +=3D pmem->data_offset; + bb_range =3D pmem->pgmap.range; + bb_range.start +=3D pmem->data_offset; } else if (pmem_should_map_pages(dev)) { - memcpy(&pmem->pgmap.res, &nsio->res, sizeof(pmem->pgmap.res)); + pmem->pgmap.range.start =3D res->start; + pmem->pgmap.range.end =3D res->end; pmem->pgmap.type =3D MEMORY_DEVICE_FS_DAX; pmem->pgmap.ops =3D &fsdax_pagemap_ops; addr =3D devm_memremap_pages(dev, &pmem->pgmap); pmem->pfn_flags |=3D PFN_MAP; - memcpy(&bb_res, &pmem->pgmap.res, sizeof(bb_res)); + bb_range =3D pmem->pgmap.range; } else { if (devm_add_action_or_reset(dev, pmem_release_queue, &pmem->pgmap)) return -ENOMEM; addr =3D devm_memremap(dev, pmem->phys_addr, pmem->size, ARCH_MEMREMAP_PMEM); - memcpy(&bb_res, &nsio->res, sizeof(bb_res)); + bb_range.start =3D res->start; + bb_range.end =3D res->end; } =20 if (IS_ERR(addr)) @@ -482,7 +484,7 @@ static int pmem_attach_disk(struct device *dev, / 512); if (devm_init_badblocks(dev, &pmem->bb)) return -ENOMEM; - nvdimm_badblocks_populate(nd_region, &pmem->bb, &bb_res); + nvdimm_badblocks_populate(nd_region, &pmem->bb, &bb_range); disk->bb =3D &pmem->bb; =20 if (is_nvdimm_sync(nd_region)) @@ -593,8 +595,8 @@ static void nd_pmem_notify(struct device *dev, enum n= vdimm_event event) resource_size_t offset =3D 0, end_trunc =3D 0; struct nd_namespace_common *ndns; struct nd_namespace_io *nsio; - struct resource res; struct badblocks *bb; + struct range range; struct kernfs_node *bb_state; =20 if (event !=3D NVDIMM_REVALIDATE_POISON) @@ -630,9 +632,9 @@ static void nd_pmem_notify(struct device *dev, enum n= vdimm_event event) nsio =3D to_nd_namespace_io(&ndns->dev); } =20 - res.start =3D nsio->res.start + offset; - res.end =3D nsio->res.end - end_trunc; - nvdimm_badblocks_populate(nd_region, bb, &res); + range.start =3D nsio->res.start + offset; + range.end =3D nsio->res.end - end_trunc; + nvdimm_badblocks_populate(nd_region, bb, &range); if (bb_state) sysfs_notify_dirent(bb_state); } diff --git a/drivers/nvdimm/region.c b/drivers/nvdimm/region.c index 0f6978e72e7c..bfce87ed72ab 100644 --- a/drivers/nvdimm/region.c +++ b/drivers/nvdimm/region.c @@ -35,7 +35,10 @@ static int nd_region_probe(struct device *dev) return rc; =20 if (is_memory(&nd_region->dev)) { - struct resource ndr_res; + struct range range =3D { + .start =3D nd_region->ndr_start, + .end =3D nd_region->ndr_start + nd_region->ndr_size - 1, + }; =20 if (devm_init_badblocks(dev, &nd_region->bb)) return -ENODEV; @@ -44,9 +47,7 @@ static int nd_region_probe(struct device *dev) if (!nd_region->bb_state) dev_warn(&nd_region->dev, "'badblocks' notification disabled\n"); - ndr_res.start =3D nd_region->ndr_start; - ndr_res.end =3D nd_region->ndr_start + nd_region->ndr_size - 1; - nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res); + nvdimm_badblocks_populate(nd_region, &nd_region->bb, &range); } =20 rc =3D nd_region_register_namespaces(nd_region, &err); @@ -121,14 +122,16 @@ static void nd_region_notify(struct device *dev, en= um nvdimm_event event) { if (event =3D=3D NVDIMM_REVALIDATE_POISON) { struct nd_region *nd_region =3D to_nd_region(dev); - struct resource res; =20 if (is_memory(&nd_region->dev)) { - res.start =3D nd_region->ndr_start; - res.end =3D nd_region->ndr_start + - nd_region->ndr_size - 1; + struct range range =3D { + .start =3D nd_region->ndr_start, + .end =3D nd_region->ndr_start + + nd_region->ndr_size - 1, + }; + nvdimm_badblocks_populate(nd_region, - &nd_region->bb, &res); + &nd_region->bb, &range); if (nd_region->bb_state) sysfs_notify_dirent(nd_region->bb_state); } diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index f357f9a32b3a..256850513813 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -185,9 +185,8 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int= bar, size_t size, return -ENOMEM; =20 pgmap =3D &p2p_pgmap->pgmap; - pgmap->res.start =3D pci_resource_start(pdev, bar) + offset; - pgmap->res.end =3D pgmap->res.start + size - 1; - pgmap->res.flags =3D pci_resource_flags(pdev, bar); + pgmap->range.start =3D pci_resource_start(pdev, bar) + offset; + pgmap->range.end =3D pgmap->range.start + size - 1; pgmap->type =3D MEMORY_DEVICE_PCI_P2PDMA; =20 p2p_pgmap->provider =3D pdev; @@ -202,13 +201,13 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, i= nt bar, size_t size, =20 error =3D gen_pool_add_owner(pdev->p2pdma->pool, (unsigned long)addr, pci_bus_address(pdev, bar) + offset, - resource_size(&pgmap->res), dev_to_node(&pdev->dev), + range_len(&pgmap->range), dev_to_node(&pdev->dev), pgmap->ref); if (error) goto pages_free; =20 - pci_info(pdev, "added peer-to-peer DMA memory %pR\n", - &pgmap->res); + pci_info(pdev, "added peer-to-peer DMA memory %#llx-%#llx\n", + pgmap->range.start, pgmap->range.end); =20 return 0; =20 diff --git a/drivers/xen/unpopulated-alloc.c b/drivers/xen/unpopulated-al= loc.c index 3b98dc921426..90a007648082 100644 --- a/drivers/xen/unpopulated-alloc.c +++ b/drivers/xen/unpopulated-alloc.c @@ -18,27 +18,37 @@ static unsigned int list_count; static int fill_list(unsigned int nr_pages) { struct dev_pagemap *pgmap; + struct resource *res; void *vaddr; unsigned int i, alloc_pages =3D round_up(nr_pages, PAGES_PER_SECTION); - int ret; + int ret =3D -ENOMEM; =20 - pgmap =3D kzalloc(sizeof(*pgmap), GFP_KERNEL); - if (!pgmap) + res =3D kzalloc(sizeof(*res), GFP_KERNEL); + if (!res) return -ENOMEM; =20 - pgmap->type =3D MEMORY_DEVICE_GENERIC; - pgmap->res.name =3D "Xen scratch"; - pgmap->res.flags =3D IORESOURCE_MEM | IORESOURCE_BUSY; + res->name =3D "Xen scratch"; + res->flags =3D IORESOURCE_MEM | IORESOURCE_BUSY; =20 - ret =3D allocate_resource(&iomem_resource, &pgmap->res, + ret =3D allocate_resource(&iomem_resource, res, alloc_pages * PAGE_SIZE, 0, -1, PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL); if (ret < 0) { pr_err("Cannot allocate new IOMEM resource\n"); - kfree(pgmap); - return ret; + goto err_resource; } =20 + pgmap =3D kzalloc(sizeof(*pgmap), GFP_KERNEL); + if (!pgmap) + goto err_pgmap; + + pgmap->type =3D MEMORY_DEVICE_GENERIC; + pgmap->range =3D (struct range) { + .start =3D res->start, + .end =3D res->end, + }; + pgmap->owner =3D res; + #ifdef CONFIG_XEN_HAVE_PVMMU /* * memremap will build page tables for the new memory so @@ -50,14 +60,13 @@ static int fill_list(unsigned int nr_pages) * conflict with any devices. */ if (!xen_feature(XENFEAT_auto_translated_physmap)) { - xen_pfn_t pfn =3D PFN_DOWN(pgmap->res.start); + xen_pfn_t pfn =3D PFN_DOWN(res->start); =20 for (i =3D 0; i < alloc_pages; i++) { if (!set_phys_to_machine(pfn + i, INVALID_P2M_ENTRY)) { pr_warn("set_phys_to_machine() failed, no memory added\n"); - release_resource(&pgmap->res); - kfree(pgmap); - return -ENOMEM; + ret =3D -ENOMEM; + goto err_memremap; } } } @@ -66,9 +75,8 @@ static int fill_list(unsigned int nr_pages) vaddr =3D memremap_pages(pgmap, NUMA_NO_NODE); if (IS_ERR(vaddr)) { pr_err("Cannot remap memory range\n"); - release_resource(&pgmap->res); - kfree(pgmap); - return PTR_ERR(vaddr); + ret =3D PTR_ERR(vaddr); + goto err_memremap; } =20 for (i =3D 0; i < alloc_pages; i++) { @@ -80,6 +88,14 @@ static int fill_list(unsigned int nr_pages) } =20 return 0; + +err_memremap: + kfree(pgmap); +err_pgmap: + release_resource(res); +err_resource: + kfree(res); + return ret; } =20 /** diff --git a/include/linux/memremap.h b/include/linux/memremap.h index b37686803a6d..375b9e87a5cf 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_MEMREMAP_H_ #define _LINUX_MEMREMAP_H_ +#include #include #include =20 @@ -93,7 +94,7 @@ struct dev_pagemap_ops { /** * struct dev_pagemap - metadata for ZONE_DEVICE mappings * @altmap: pre-allocated/reserved memory for vmemmap allocations - * @res: physical address range covered by @ref + * @range: physical address range covered by @ref * @ref: reference count that pins the devm_memremap_pages() mapping * @internal_ref: internal reference if @ref is not provided by the call= er * @done: completion for @internal_ref @@ -106,7 +107,7 @@ struct dev_pagemap_ops { */ struct dev_pagemap { struct vmem_altmap altmap; - struct resource res; + struct range range; struct percpu_ref *ref; struct percpu_ref internal_ref; struct completion done; diff --git a/include/linux/range.h b/include/linux/range.h index 9c28353a1219..274681cc3154 100644 --- a/include/linux/range.h +++ b/include/linux/range.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_RANGE_H #define _LINUX_RANGE_H +#include =20 struct range { u64 start; diff --git a/lib/test_hmm.c b/lib/test_hmm.c index e7dc3de355b7..e97ca8ec0bce 100644 --- a/lib/test_hmm.c +++ b/lib/test_hmm.c @@ -460,6 +460,21 @@ static bool dmirror_allocate_chunk(struct dmirror_de= vice *mdevice, unsigned long pfn_last; void *ptr; =20 + devmem =3D kzalloc(sizeof(*devmem), GFP_KERNEL); + if (!devmem) + return -ENOMEM; + + res =3D request_free_mem_region(&iomem_resource, DEVMEM_CHUNK_SIZE, + "hmm_dmirror"); + if (IS_ERR(res)) + goto err_devmem; + + devmem->pagemap.type =3D MEMORY_DEVICE_PRIVATE; + devmem->pagemap.range.start =3D res->start; + devmem->pagemap.range.end =3D res->end; + devmem->pagemap.ops =3D &dmirror_devmem_ops; + devmem->pagemap.owner =3D mdevice; + mutex_lock(&mdevice->devmem_lock); =20 if (mdevice->devmem_count =3D=3D mdevice->devmem_capacity) { @@ -472,33 +487,18 @@ static bool dmirror_allocate_chunk(struct dmirror_d= evice *mdevice, sizeof(new_chunks[0]) * new_capacity, GFP_KERNEL); if (!new_chunks) - goto err; + goto err_release; mdevice->devmem_capacity =3D new_capacity; mdevice->devmem_chunks =3D new_chunks; } =20 - res =3D request_free_mem_region(&iomem_resource, DEVMEM_CHUNK_SIZE, - "hmm_dmirror"); - if (IS_ERR(res)) - goto err; - - devmem =3D kzalloc(sizeof(*devmem), GFP_KERNEL); - if (!devmem) - goto err_release; - - devmem->pagemap.type =3D MEMORY_DEVICE_PRIVATE; - devmem->pagemap.res =3D *res; - devmem->pagemap.ops =3D &dmirror_devmem_ops; - devmem->pagemap.owner =3D mdevice; - ptr =3D memremap_pages(&devmem->pagemap, numa_node_id()); if (IS_ERR(ptr)) - goto err_free; + goto err_release; =20 devmem->mdevice =3D mdevice; - pfn_first =3D devmem->pagemap.res.start >> PAGE_SHIFT; - pfn_last =3D pfn_first + - (resource_size(&devmem->pagemap.res) >> PAGE_SHIFT); + pfn_first =3D devmem->pagemap.range.start >> PAGE_SHIFT; + pfn_last =3D pfn_first + (range_len(&devmem->pagemap.range) >> PAGE_SHI= FT); mdevice->devmem_chunks[mdevice->devmem_count++] =3D devmem; =20 mutex_unlock(&mdevice->devmem_lock); @@ -525,12 +525,12 @@ static bool dmirror_allocate_chunk(struct dmirror_d= evice *mdevice, =20 return true; =20 -err_free: - kfree(devmem); err_release: - release_mem_region(res->start, resource_size(res)); -err: mutex_unlock(&mdevice->devmem_lock); + release_mem_region(devmem->pagemap.range.start, range_len(&devmem->page= map.range)); +err_devmem: + kfree(devmem); + return false; } =20 @@ -1100,8 +1100,8 @@ static void dmirror_device_remove(struct dmirror_de= vice *mdevice) mdevice->devmem_chunks[i]; =20 memunmap_pages(&devmem->pagemap); - release_mem_region(devmem->pagemap.res.start, - resource_size(&devmem->pagemap.res)); + release_mem_region(devmem->pagemap.range.start, + range_len(&devmem->pagemap.range)); kfree(devmem); } kfree(mdevice->devmem_chunks); diff --git a/mm/memremap.c b/mm/memremap.c index f008706b685e..7c895e1477b0 100644 --- a/mm/memremap.c +++ b/mm/memremap.c @@ -70,24 +70,24 @@ static void devmap_managed_enable_put(void) } #endif /* CONFIG_DEV_PAGEMAP_OPS */ =20 -static void pgmap_array_delete(struct resource *res) +static void pgmap_array_delete(struct range *range) { - xa_store_range(&pgmap_array, PHYS_PFN(res->start), PHYS_PFN(res->end), + xa_store_range(&pgmap_array, PHYS_PFN(range->start), PHYS_PFN(range->en= d), NULL, GFP_KERNEL); synchronize_rcu(); } =20 static unsigned long pfn_first(struct dev_pagemap *pgmap) { - return PHYS_PFN(pgmap->res.start) + + return PHYS_PFN(pgmap->range.start) + vmem_altmap_offset(pgmap_altmap(pgmap)); } =20 static unsigned long pfn_end(struct dev_pagemap *pgmap) { - const struct resource *res =3D &pgmap->res; + const struct range *range =3D &pgmap->range; =20 - return (res->start + resource_size(res)) >> PAGE_SHIFT; + return (range->start + range_len(range)) >> PAGE_SHIFT; } =20 static unsigned long pfn_next(unsigned long pfn) @@ -146,7 +146,7 @@ static void dev_pagemap_cleanup(struct dev_pagemap *p= gmap) =20 void memunmap_pages(struct dev_pagemap *pgmap) { - struct resource *res =3D &pgmap->res; + struct range *range =3D &pgmap->range; struct page *first_page; unsigned long pfn; int nid; @@ -163,20 +163,20 @@ void memunmap_pages(struct dev_pagemap *pgmap) nid =3D page_to_nid(first_page); =20 mem_hotplug_begin(); - remove_pfn_range_from_zone(page_zone(first_page), PHYS_PFN(res->start), - PHYS_PFN(resource_size(res))); + remove_pfn_range_from_zone(page_zone(first_page), PHYS_PFN(range->start= ), + PHYS_PFN(range_len(range))); if (pgmap->type =3D=3D MEMORY_DEVICE_PRIVATE) { - __remove_pages(PHYS_PFN(res->start), - PHYS_PFN(resource_size(res)), NULL); + __remove_pages(PHYS_PFN(range->start), + PHYS_PFN(range_len(range)), NULL); } else { - arch_remove_memory(nid, res->start, resource_size(res), + arch_remove_memory(nid, range->start, range_len(range), pgmap_altmap(pgmap)); - kasan_remove_zero_shadow(__va(res->start), resource_size(res)); + kasan_remove_zero_shadow(__va(range->start), range_len(range)); } mem_hotplug_done(); =20 - untrack_pfn(NULL, PHYS_PFN(res->start), resource_size(res)); - pgmap_array_delete(res); + untrack_pfn(NULL, PHYS_PFN(range->start), range_len(range)); + pgmap_array_delete(range); WARN_ONCE(pgmap->altmap.alloc, "failed to free all reserved pages\n"); devmap_managed_enable_put(); } @@ -202,7 +202,7 @@ static void dev_pagemap_percpu_release(struct percpu_= ref *ref) */ void *memremap_pages(struct dev_pagemap *pgmap, int nid) { - struct resource *res =3D &pgmap->res; + struct range *range =3D &pgmap->range; struct dev_pagemap *conflict_pgmap; struct mhp_params params =3D { /* @@ -271,7 +271,7 @@ void *memremap_pages(struct dev_pagemap *pgmap, int n= id) return ERR_PTR(error); } =20 - conflict_pgmap =3D get_dev_pagemap(PHYS_PFN(res->start), NULL); + conflict_pgmap =3D get_dev_pagemap(PHYS_PFN(range->start), NULL); if (conflict_pgmap) { WARN(1, "Conflicting mapping in same section\n"); put_dev_pagemap(conflict_pgmap); @@ -279,7 +279,7 @@ void *memremap_pages(struct dev_pagemap *pgmap, int n= id) goto err_array; } =20 - conflict_pgmap =3D get_dev_pagemap(PHYS_PFN(res->end), NULL); + conflict_pgmap =3D get_dev_pagemap(PHYS_PFN(range->end), NULL); if (conflict_pgmap) { WARN(1, "Conflicting mapping in same section\n"); put_dev_pagemap(conflict_pgmap); @@ -287,26 +287,27 @@ void *memremap_pages(struct dev_pagemap *pgmap, int= nid) goto err_array; } =20 - is_ram =3D region_intersects(res->start, resource_size(res), + is_ram =3D region_intersects(range->start, range_len(range), IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); =20 if (is_ram !=3D REGION_DISJOINT) { - WARN_ONCE(1, "%s attempted on %s region %pr\n", __func__, - is_ram =3D=3D REGION_MIXED ? "mixed" : "ram", res); + WARN_ONCE(1, "attempted on %s region %#llx-%#llx\n", + is_ram =3D=3D REGION_MIXED ? "mixed" : "ram", + range->start, range->end); error =3D -ENXIO; goto err_array; } =20 - error =3D xa_err(xa_store_range(&pgmap_array, PHYS_PFN(res->start), - PHYS_PFN(res->end), pgmap, GFP_KERNEL)); + error =3D xa_err(xa_store_range(&pgmap_array, PHYS_PFN(range->start), + PHYS_PFN(range->end), pgmap, GFP_KERNEL)); if (error) goto err_array; =20 if (nid < 0) nid =3D numa_mem_id(); =20 - error =3D track_pfn_remap(NULL, ¶ms.pgprot, PHYS_PFN(res->start), - 0, resource_size(res)); + error =3D track_pfn_remap(NULL, ¶ms.pgprot, PHYS_PFN(range->start),= 0, + range_len(range)); if (error) goto err_pfn_remap; =20 @@ -324,16 +325,16 @@ void *memremap_pages(struct dev_pagemap *pgmap, int= nid) * arch_add_memory(). */ if (pgmap->type =3D=3D MEMORY_DEVICE_PRIVATE) { - error =3D add_pages(nid, PHYS_PFN(res->start), - PHYS_PFN(resource_size(res)), ¶ms); + error =3D add_pages(nid, PHYS_PFN(range->start), + PHYS_PFN(range_len(range)), ¶ms); } else { - error =3D kasan_add_zero_shadow(__va(res->start), resource_size(res)); + error =3D kasan_add_zero_shadow(__va(range->start), range_len(range)); if (error) { mem_hotplug_done(); goto err_kasan; } =20 - error =3D arch_add_memory(nid, res->start, resource_size(res), + error =3D arch_add_memory(nid, range->start, range_len(range), ¶ms); } =20 @@ -341,8 +342,8 @@ void *memremap_pages(struct dev_pagemap *pgmap, int n= id) struct zone *zone; =20 zone =3D &NODE_DATA(nid)->node_zones[ZONE_DEVICE]; - move_pfn_range_to_zone(zone, PHYS_PFN(res->start), - PHYS_PFN(resource_size(res)), params.altmap); + move_pfn_range_to_zone(zone, PHYS_PFN(range->start), + PHYS_PFN(range_len(range)), params.altmap); } =20 mem_hotplug_done(); @@ -354,17 +355,17 @@ void *memremap_pages(struct dev_pagemap *pgmap, int= nid) * to allow us to do the work while not holding the hotplug lock. */ memmap_init_zone_device(&NODE_DATA(nid)->node_zones[ZONE_DEVICE], - PHYS_PFN(res->start), - PHYS_PFN(resource_size(res)), pgmap); + PHYS_PFN(range->start), + PHYS_PFN(range_len(range)), pgmap); percpu_ref_get_many(pgmap->ref, pfn_end(pgmap) - pfn_first(pgmap)); - return __va(res->start); + return __va(range->start); =20 err_add_memory: - kasan_remove_zero_shadow(__va(res->start), resource_size(res)); + kasan_remove_zero_shadow(__va(range->start), range_len(range)); err_kasan: - untrack_pfn(NULL, PHYS_PFN(res->start), resource_size(res)); + untrack_pfn(NULL, PHYS_PFN(range->start), range_len(range)); err_pfn_remap: - pgmap_array_delete(res); + pgmap_array_delete(range); err_array: dev_pagemap_kill(pgmap); dev_pagemap_cleanup(pgmap); @@ -389,7 +390,7 @@ EXPORT_SYMBOL_GPL(memremap_pages); * 'live' on entry and will be killed and reaped at * devm_memremap_pages_release() time, or if this routine fails. * - * 4/ res is expected to be a host memory range that could feasibly be + * 4/ range is expected to be a host memory range that could feasibly be * treated as a "System RAM" range, i.e. not a device mmio range, but * this is not enforced. */ @@ -446,7 +447,7 @@ struct dev_pagemap *get_dev_pagemap(unsigned long pfn= , * In the cached case we're already holding a live reference. */ if (pgmap) { - if (phys >=3D pgmap->res.start && phys <=3D pgmap->res.end) + if (phys >=3D pgmap->range.start && phys <=3D pgmap->range.end) return pgmap; put_dev_pagemap(pgmap); } diff --git a/tools/testing/nvdimm/test/iomap.c b/tools/testing/nvdimm/tes= t/iomap.c index 03e40b3b0106..c62d372d426f 100644 --- a/tools/testing/nvdimm/test/iomap.c +++ b/tools/testing/nvdimm/test/iomap.c @@ -126,7 +126,7 @@ static void dev_pagemap_percpu_release(struct percpu_= ref *ref) void *__wrap_devm_memremap_pages(struct device *dev, struct dev_pagemap = *pgmap) { int error; - resource_size_t offset =3D pgmap->res.start; + resource_size_t offset =3D pgmap->range.start; struct nfit_test_resource *nfit_res =3D get_nfit_res(offset); =20 if (!nfit_res)