From: Christoph Hellwig <hch@lst.de> To: Dan Williams <dan.j.williams@intel.com> Cc: linux-mm@kvack.org, "Jérôme Glisse" <jglisse@redhat.com>, linux-nvdimm@lists.01.org Subject: [PATCH 03/14] mm: better abstract out dev_pagemap freeing Date: Thu, 7 Dec 2017 07:08:29 -0800 [thread overview] Message-ID: <20171207150840.28409-4-hch@lst.de> (raw) In-Reply-To: <20171207150840.28409-1-hch@lst.de> Add a new helper that both looks up the pagemap and updates the alloc counter. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/powerpc/mm/init_64.c | 6 ++---- arch/x86/mm/init_64.c | 5 +---- include/linux/memremap.h | 7 ++++++- kernel/memremap.c | 9 +++++++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index a07722531b32..d6a040198edf 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c @@ -268,7 +268,6 @@ void __ref vmemmap_free(unsigned long start, unsigned long end) for (; start < end; start += page_size) { unsigned long nr_pages, addr; - struct vmem_altmap *altmap; struct page *section_base; struct page *page; @@ -288,9 +287,8 @@ void __ref vmemmap_free(unsigned long start, unsigned long end) section_base = pfn_to_page(vmemmap_section_start(start)); nr_pages = 1 << page_order; - altmap = to_vmem_altmap((unsigned long) section_base); - if (altmap) { - vmem_altmap_free(altmap, nr_pages); + if (dev_pagemap_free_pages(section_base, nr_pages)) { + ; } else if (PageReserved(page)) { /* allocated from bootmem */ if (page_size < PAGE_SIZE) { diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 4a837289f2ad..f5e51b941d19 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -804,12 +804,9 @@ static void __meminit free_pagetable(struct page *page, int order) { unsigned long magic; unsigned int nr_pages = 1 << order; - struct vmem_altmap *altmap = to_vmem_altmap((unsigned long) page); - if (altmap) { - vmem_altmap_free(altmap, nr_pages); + if (dev_pagemap_free_pages(page, nr_pages)) return; - } /* bootmem page has reserved flag */ if (PageReserved(page)) { diff --git a/include/linux/memremap.h b/include/linux/memremap.h index f24e0c71d6a6..8f4d96f0e265 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -27,7 +27,6 @@ struct vmem_altmap { }; unsigned long vmem_altmap_offset(struct vmem_altmap *altmap); -void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns); #ifdef CONFIG_ZONE_DEVICE struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start); @@ -139,6 +138,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, struct dev_pagemap *get_dev_pagemap(unsigned long pfn, struct dev_pagemap *pgmap); static inline bool is_zone_device_page(const struct page *page); +bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages); #else static inline void *devm_memremap_pages(struct device *dev, struct resource *res, struct percpu_ref *ref, @@ -158,6 +158,11 @@ static inline struct dev_pagemap *get_dev_pagemap(unsigned long pfn, { return NULL; } + +static inline bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages) +{ + return false; +} #endif /* CONFIG_ZONE_DEVICE */ #if defined(CONFIG_DEVICE_PRIVATE) || defined(CONFIG_DEVICE_PUBLIC) diff --git a/kernel/memremap.c b/kernel/memremap.c index 502fa107a585..1b7c5bc93162 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -470,9 +470,14 @@ unsigned long vmem_altmap_offset(struct vmem_altmap *altmap) return altmap->reserve + altmap->free; } -void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns) +bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages) { - altmap->alloc -= nr_pfns; + struct vmem_altmap *pgmap = to_vmem_altmap((uintptr_t)page); + + if (!pgmap) + return false; + pgmap->alloc -= nr_pages; + return true; } struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start) -- 2.14.2 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de> To: Dan Williams <dan.j.williams@intel.com> Cc: "Jérôme Glisse" <jglisse@redhat.com>, "Logan Gunthorpe" <logang@deltatee.com>, linux-nvdimm@lists.01.org, linux-mm@kvack.org Subject: [PATCH 03/14] mm: better abstract out dev_pagemap freeing Date: Thu, 7 Dec 2017 07:08:29 -0800 [thread overview] Message-ID: <20171207150840.28409-4-hch@lst.de> (raw) In-Reply-To: <20171207150840.28409-1-hch@lst.de> Add a new helper that both looks up the pagemap and updates the alloc counter. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/powerpc/mm/init_64.c | 6 ++---- arch/x86/mm/init_64.c | 5 +---- include/linux/memremap.h | 7 ++++++- kernel/memremap.c | 9 +++++++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index a07722531b32..d6a040198edf 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c @@ -268,7 +268,6 @@ void __ref vmemmap_free(unsigned long start, unsigned long end) for (; start < end; start += page_size) { unsigned long nr_pages, addr; - struct vmem_altmap *altmap; struct page *section_base; struct page *page; @@ -288,9 +287,8 @@ void __ref vmemmap_free(unsigned long start, unsigned long end) section_base = pfn_to_page(vmemmap_section_start(start)); nr_pages = 1 << page_order; - altmap = to_vmem_altmap((unsigned long) section_base); - if (altmap) { - vmem_altmap_free(altmap, nr_pages); + if (dev_pagemap_free_pages(section_base, nr_pages)) { + ; } else if (PageReserved(page)) { /* allocated from bootmem */ if (page_size < PAGE_SIZE) { diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 4a837289f2ad..f5e51b941d19 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -804,12 +804,9 @@ static void __meminit free_pagetable(struct page *page, int order) { unsigned long magic; unsigned int nr_pages = 1 << order; - struct vmem_altmap *altmap = to_vmem_altmap((unsigned long) page); - if (altmap) { - vmem_altmap_free(altmap, nr_pages); + if (dev_pagemap_free_pages(page, nr_pages)) return; - } /* bootmem page has reserved flag */ if (PageReserved(page)) { diff --git a/include/linux/memremap.h b/include/linux/memremap.h index f24e0c71d6a6..8f4d96f0e265 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -27,7 +27,6 @@ struct vmem_altmap { }; unsigned long vmem_altmap_offset(struct vmem_altmap *altmap); -void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns); #ifdef CONFIG_ZONE_DEVICE struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start); @@ -139,6 +138,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, struct dev_pagemap *get_dev_pagemap(unsigned long pfn, struct dev_pagemap *pgmap); static inline bool is_zone_device_page(const struct page *page); +bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages); #else static inline void *devm_memremap_pages(struct device *dev, struct resource *res, struct percpu_ref *ref, @@ -158,6 +158,11 @@ static inline struct dev_pagemap *get_dev_pagemap(unsigned long pfn, { return NULL; } + +static inline bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages) +{ + return false; +} #endif /* CONFIG_ZONE_DEVICE */ #if defined(CONFIG_DEVICE_PRIVATE) || defined(CONFIG_DEVICE_PUBLIC) diff --git a/kernel/memremap.c b/kernel/memremap.c index 502fa107a585..1b7c5bc93162 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -470,9 +470,14 @@ unsigned long vmem_altmap_offset(struct vmem_altmap *altmap) return altmap->reserve + altmap->free; } -void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns) +bool dev_pagemap_free_pages(struct page *page, unsigned nr_pages) { - altmap->alloc -= nr_pfns; + struct vmem_altmap *pgmap = to_vmem_altmap((uintptr_t)page); + + if (!pgmap) + return false; + pgmap->alloc -= nr_pages; + return true; } struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start) -- 2.14.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-12-07 15:04 UTC|newest] Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-12-07 15:08 revamp vmem_altmap / dev_pagemap handling Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 15:08 ` [PATCH 01/14] mm: move get_dev_pagemap out of line Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 18:34 ` Logan Gunthorpe 2017-12-07 18:34 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 02/14] mm: optimize dev_pagemap reference counting around get_dev_pagemap Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 18:46 ` Logan Gunthorpe 2017-12-07 18:46 ` Logan Gunthorpe 2017-12-07 15:08 ` Christoph Hellwig [this message] 2017-12-07 15:08 ` [PATCH 03/14] mm: better abstract out dev_pagemap freeing Christoph Hellwig 2017-12-07 18:49 ` Logan Gunthorpe 2017-12-07 18:49 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 04/14] mm: better abstract out dev_pagemap alloc Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 18:52 ` Logan Gunthorpe 2017-12-07 18:52 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 05/14] mm: better abstract out dev_pagemap offset calculation Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 18:54 ` Logan Gunthorpe 2017-12-07 18:54 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 06/14] mm: better abstract out dev_pagemap start_pfn Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 18:57 ` Logan Gunthorpe 2017-12-07 18:57 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 07/14] mm: split dev_pagemap memory map allocation from normal case Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:08 ` Logan Gunthorpe 2017-12-07 19:08 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 08/14] mm: merge vmem_altmap_alloc into dev_pagemap_alloc_block_buf Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:14 ` Logan Gunthorpe 2017-12-07 19:14 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 09/14] memremap: drop private struct page_map Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 15:08 ` [PATCH 10/14] memremap: change devm_memremap_pages interface to use struct dev_pagemap Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-08 4:03 ` Dan Williams 2017-12-07 15:08 ` [PATCH 11/14] memremap: simplify duplicate region handling in devm_memremap_pages Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:34 ` Logan Gunthorpe 2017-12-07 19:34 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 12/14] memremap: remove find_dev_pagemap Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:35 ` Logan Gunthorpe 2017-12-07 19:35 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 13/14] memremap: remove struct vmem_altmap Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:40 ` Logan Gunthorpe 2017-12-07 19:40 ` Logan Gunthorpe 2017-12-07 15:08 ` [PATCH 14/14] memremap: RCU protect data returned from dev_pagemap lookups Christoph Hellwig 2017-12-07 15:08 ` Christoph Hellwig 2017-12-07 19:53 ` Logan Gunthorpe 2017-12-07 19:53 ` Logan Gunthorpe 2017-12-08 4:14 ` revamp vmem_altmap / dev_pagemap handling Williams, Dan J 2017-12-08 4:14 ` Williams, Dan J
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20171207150840.28409-4-hch@lst.de \ --to=hch@lst.de \ --cc=dan.j.williams@intel.com \ --cc=jglisse@redhat.com \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.