From: "Jérôme Glisse" <jglisse@redhat.com> To: akpm@linux-foundation.org, <linux-kernel@vger.kernel.org>, linux-mm@kvack.org Cc: "John Hubbard" <jhubbard@nvidia.com>, "Jérôme Glisse" <jglisse@redhat.com>, "Dan Williams" <dan.j.williams@intel.com>, "Ross Zwisler" <ross.zwisler@linux.intel.com> Subject: [HMM v13 04/18] mm/ZONE_DEVICE/free-page: callback when page is freed Date: Fri, 18 Nov 2016 13:18:13 -0500 [thread overview] Message-ID: <1479493107-982-5-git-send-email-jglisse@redhat.com> (raw) In-Reply-To: <1479493107-982-1-git-send-email-jglisse@redhat.com> When a ZONE_DEVICE page refcount reach 1 it means it is free and nobody is holding a reference on it (only device to which the memory belong do). Add a callback and call it when that happen so device driver can implement their own free page management. Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> --- include/linux/memremap.h | 4 ++++ kernel/memremap.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/include/linux/memremap.h b/include/linux/memremap.h index fe61dca..469c88d 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -37,17 +37,21 @@ static inline struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start) /** * struct dev_pagemap - metadata for ZONE_DEVICE mappings + * @free_devpage: free page callback when page refcount reach 1 * @altmap: pre-allocated/reserved memory for vmemmap allocations * @res: physical address range covered by @ref * @ref: reference count that pins the devm_memremap_pages() mapping * @dev: host device of the mapping for debug + * @data: privata data pointer for free_devpage * @flags: memory flags (look for MEMORY_FLAGS_NONE in memory_hotplug.h) */ struct dev_pagemap { + void (*free_devpage)(struct page *page, void *data); struct vmem_altmap *altmap; const struct resource *res; struct percpu_ref *ref; struct device *dev; + void *data; int flags; }; diff --git a/kernel/memremap.c b/kernel/memremap.c index 438a73aa2..3d28048 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -190,6 +190,12 @@ EXPORT_SYMBOL(get_zone_device_page); void put_zone_device_page(struct page *page) { + /* + * If refcount is 1 then page is freed and refcount is stable as nobody + * holds a reference on the page. + */ + if (page->pgmap->free_devpage && page_count(page) == 1) + page->pgmap->free_devpage(page, page->pgmap->data); put_dev_pagemap(page->pgmap); } EXPORT_SYMBOL(put_zone_device_page); @@ -326,6 +332,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, pgmap->ref = ref; pgmap->res = &page_map->res; pgmap->flags = flags | MEMORY_DEVICE; + pgmap->free_devpage = NULL; + pgmap->data = NULL; mutex_lock(&pgmap_lock); error = 0; -- 2.4.3
WARNING: multiple messages have this Message-ID (diff)
From: "Jérôme Glisse" <jglisse@redhat.com> To: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: "John Hubbard" <jhubbard@nvidia.com>, "Jérôme Glisse" <jglisse@redhat.com>, "Dan Williams" <dan.j.williams@intel.com>, "Ross Zwisler" <ross.zwisler@linux.intel.com> Subject: [HMM v13 04/18] mm/ZONE_DEVICE/free-page: callback when page is freed Date: Fri, 18 Nov 2016 13:18:13 -0500 [thread overview] Message-ID: <1479493107-982-5-git-send-email-jglisse@redhat.com> (raw) In-Reply-To: <1479493107-982-1-git-send-email-jglisse@redhat.com> When a ZONE_DEVICE page refcount reach 1 it means it is free and nobody is holding a reference on it (only device to which the memory belong do). Add a callback and call it when that happen so device driver can implement their own free page management. Signed-off-by: JA(C)rA'me Glisse <jglisse@redhat.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> --- include/linux/memremap.h | 4 ++++ kernel/memremap.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/include/linux/memremap.h b/include/linux/memremap.h index fe61dca..469c88d 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -37,17 +37,21 @@ static inline struct vmem_altmap *to_vmem_altmap(unsigned long memmap_start) /** * struct dev_pagemap - metadata for ZONE_DEVICE mappings + * @free_devpage: free page callback when page refcount reach 1 * @altmap: pre-allocated/reserved memory for vmemmap allocations * @res: physical address range covered by @ref * @ref: reference count that pins the devm_memremap_pages() mapping * @dev: host device of the mapping for debug + * @data: privata data pointer for free_devpage * @flags: memory flags (look for MEMORY_FLAGS_NONE in memory_hotplug.h) */ struct dev_pagemap { + void (*free_devpage)(struct page *page, void *data); struct vmem_altmap *altmap; const struct resource *res; struct percpu_ref *ref; struct device *dev; + void *data; int flags; }; diff --git a/kernel/memremap.c b/kernel/memremap.c index 438a73aa2..3d28048 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -190,6 +190,12 @@ EXPORT_SYMBOL(get_zone_device_page); void put_zone_device_page(struct page *page) { + /* + * If refcount is 1 then page is freed and refcount is stable as nobody + * holds a reference on the page. + */ + if (page->pgmap->free_devpage && page_count(page) == 1) + page->pgmap->free_devpage(page, page->pgmap->data); put_dev_pagemap(page->pgmap); } EXPORT_SYMBOL(put_zone_device_page); @@ -326,6 +332,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, pgmap->ref = ref; pgmap->res = &page_map->res; pgmap->flags = flags | MEMORY_DEVICE; + pgmap->free_devpage = NULL; + pgmap->data = NULL; mutex_lock(&pgmap_lock); error = 0; -- 2.4.3 -- 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:[~2016-11-18 17:21 UTC|newest] Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-11-18 18:18 [HMM v13 00/18] HMM (Heterogeneous Memory Management) v13 Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 01/18] mm/memory/hotplug: convert device parameter bool to set of flags Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 0:44 ` Balbir Singh 2016-11-21 0:44 ` Balbir Singh 2016-11-21 4:53 ` Jerome Glisse 2016-11-21 4:53 ` Jerome Glisse 2016-11-21 6:57 ` Anshuman Khandual 2016-11-21 6:57 ` Anshuman Khandual 2016-11-21 12:19 ` Jerome Glisse 2016-11-21 12:19 ` Jerome Glisse 2016-11-21 6:41 ` Anshuman Khandual 2016-11-21 6:41 ` Anshuman Khandual 2016-11-21 12:27 ` Jerome Glisse 2016-11-21 12:27 ` Jerome Glisse 2016-11-22 5:35 ` Anshuman Khandual 2016-11-22 5:35 ` Anshuman Khandual 2016-11-22 14:08 ` Jerome Glisse 2016-11-22 14:08 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 02/18] mm/ZONE_DEVICE/unaddressable: add support for un-addressable device memory Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 8:06 ` Anshuman Khandual 2016-11-21 8:06 ` Anshuman Khandual 2016-11-21 12:33 ` Jerome Glisse 2016-11-21 12:33 ` Jerome Glisse 2016-11-22 5:15 ` Anshuman Khandual 2016-11-22 5:15 ` Anshuman Khandual 2016-11-18 18:18 ` [HMM v13 03/18] mm/ZONE_DEVICE/free_hot_cold_page: catch ZONE_DEVICE pages Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 8:18 ` Anshuman Khandual 2016-11-21 8:18 ` Anshuman Khandual 2016-11-21 12:50 ` Jerome Glisse 2016-11-21 12:50 ` Jerome Glisse 2016-11-22 4:30 ` Anshuman Khandual 2016-11-22 4:30 ` Anshuman Khandual 2016-11-18 18:18 ` Jérôme Glisse [this message] 2016-11-18 18:18 ` [HMM v13 04/18] mm/ZONE_DEVICE/free-page: callback when page is freed Jérôme Glisse 2016-11-21 1:49 ` Balbir Singh 2016-11-21 1:49 ` Balbir Singh 2016-11-21 4:57 ` Jerome Glisse 2016-11-21 4:57 ` Jerome Glisse 2016-11-21 8:26 ` Anshuman Khandual 2016-11-21 8:26 ` Anshuman Khandual 2016-11-21 12:34 ` Jerome Glisse 2016-11-21 12:34 ` Jerome Glisse 2016-11-22 5:02 ` Anshuman Khandual 2016-11-22 5:02 ` Anshuman Khandual 2016-11-18 18:18 ` [HMM v13 05/18] mm/ZONE_DEVICE/devmem_pages_remove: allow early removal of device memory Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 10:37 ` Anshuman Khandual 2016-11-21 10:37 ` Anshuman Khandual 2016-11-21 12:39 ` Jerome Glisse 2016-11-21 12:39 ` Jerome Glisse 2016-11-22 4:54 ` Anshuman Khandual 2016-11-22 4:54 ` Anshuman Khandual 2016-11-18 18:18 ` [HMM v13 06/18] mm/ZONE_DEVICE/unaddressable: add special swap for unaddressable Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 2:06 ` Balbir Singh 2016-11-21 2:06 ` Balbir Singh 2016-11-21 5:05 ` Jerome Glisse 2016-11-21 5:05 ` Jerome Glisse 2016-11-22 2:19 ` Balbir Singh 2016-11-22 2:19 ` Balbir Singh 2016-11-22 13:59 ` Jerome Glisse 2016-11-22 13:59 ` Jerome Glisse 2016-11-21 11:10 ` Anshuman Khandual 2016-11-21 11:10 ` Anshuman Khandual 2016-11-21 10:58 ` Anshuman Khandual 2016-11-21 10:58 ` Anshuman Khandual 2016-11-21 12:42 ` Jerome Glisse 2016-11-21 12:42 ` Jerome Glisse 2016-11-22 4:48 ` Anshuman Khandual 2016-11-22 4:48 ` Anshuman Khandual 2016-11-24 13:56 ` Jerome Glisse 2016-11-24 13:56 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 07/18] mm/ZONE_DEVICE/x86: add support for un-addressable device memory Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 2:08 ` Balbir Singh 2016-11-21 2:08 ` Balbir Singh 2016-11-21 5:08 ` Jerome Glisse 2016-11-21 5:08 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 08/18] mm/hmm: heterogeneous memory management (HMM for short) Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 2:29 ` Balbir Singh 2016-11-21 2:29 ` Balbir Singh 2016-11-21 5:14 ` Jerome Glisse 2016-11-21 5:14 ` Jerome Glisse 2016-11-23 4:03 ` Anshuman Khandual 2016-11-23 4:03 ` Anshuman Khandual 2016-11-27 13:10 ` Jerome Glisse 2016-11-27 13:10 ` Jerome Glisse 2016-11-28 2:58 ` Anshuman Khandual 2016-11-28 2:58 ` Anshuman Khandual 2016-11-28 9:41 ` Jerome Glisse 2016-11-28 9:41 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 09/18] mm/hmm/mirror: mirror process address space on device with HMM helpers Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-21 2:42 ` Balbir Singh 2016-11-21 2:42 ` Balbir Singh 2016-11-21 5:18 ` Jerome Glisse 2016-11-21 5:18 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 10/18] mm/hmm/mirror: add range lock helper, prevent CPU page table update for the range Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 11/18] mm/hmm/mirror: add range monitor helper, to monitor CPU page table update Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 12/18] mm/hmm/mirror: helper to snapshot CPU page table Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 13/18] mm/hmm/mirror: device page fault handler Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 14/18] mm/hmm/migrate: support un-addressable ZONE_DEVICE page in migration Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 15/18] mm/hmm/migrate: add new boolean copy flag to migratepage() callback Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 16/18] mm/hmm/migrate: new memory migration helper for use with device memory Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 19:57 ` Aneesh Kumar K.V 2016-11-18 19:57 ` Aneesh Kumar K.V 2016-11-18 20:15 ` Jerome Glisse 2016-11-18 20:15 ` Jerome Glisse 2016-11-19 14:32 ` Aneesh Kumar K.V 2016-11-19 14:32 ` Aneesh Kumar K.V 2016-11-19 17:17 ` Jerome Glisse 2016-11-19 17:17 ` Jerome Glisse 2016-11-20 18:21 ` Aneesh Kumar K.V 2016-11-20 18:21 ` Aneesh Kumar K.V 2016-11-20 20:06 ` Jerome Glisse 2016-11-20 20:06 ` Jerome Glisse 2016-11-21 3:30 ` Balbir Singh 2016-11-21 3:30 ` Balbir Singh 2016-11-21 5:31 ` Jerome Glisse 2016-11-21 5:31 ` Jerome Glisse 2016-11-18 18:18 ` [HMM v13 17/18] mm/hmm/devmem: device driver helper to hotplug ZONE_DEVICE memory Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-18 18:18 ` [HMM v13 18/18] mm/hmm/devmem: dummy HMM device as an helper for " Jérôme Glisse 2016-11-18 18:18 ` Jérôme Glisse 2016-11-19 0:41 ` [HMM v13 00/18] HMM (Heterogeneous Memory Management) v13 John Hubbard 2016-11-19 0:41 ` John Hubbard 2016-11-19 14:50 ` Aneesh Kumar K.V 2016-11-19 14:50 ` Aneesh Kumar K.V 2016-11-23 9:16 ` Haggai Eran 2016-11-23 9:16 ` Haggai Eran 2016-11-25 16:16 ` Jerome Glisse 2016-11-25 16:16 ` Jerome Glisse 2016-11-27 13:27 ` Haggai Eran 2016-11-27 13:27 ` Haggai Eran
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=1479493107-982-5-git-send-email-jglisse@redhat.com \ --to=jglisse@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=dan.j.williams@intel.com \ --cc=jhubbard@nvidia.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=ross.zwisler@linux.intel.com \ /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.