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>, "Jatin Kumar" <jakumar@nvidia.com>, "Mark Hairgrove" <mhairgrove@nvidia.com>, "Sherry Cheung" <SCheung@nvidia.com>, "Subhash Gutti" <sgutti@nvidia.com> Subject: [HMM v13 18/18] mm/hmm/devmem: dummy HMM device as an helper for ZONE_DEVICE memory Date: Fri, 18 Nov 2016 13:18:27 -0500 [thread overview] Message-ID: <1479493107-982-19-git-send-email-jglisse@redhat.com> (raw) In-Reply-To: <1479493107-982-1-git-send-email-jglisse@redhat.com> This introduce a dummy HMM device class so device driver can use it to create hmm_device for the sole purpose of registering device memory. It is usefull to device driver that want to manage multiple physical device memory under same device umbrella. Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Signed-off-by: Jatin Kumar <jakumar@nvidia.com> Signed-off-by: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Mark Hairgrove <mhairgrove@nvidia.com> Signed-off-by: Sherry Cheung <SCheung@nvidia.com> Signed-off-by: Subhash Gutti <sgutti@nvidia.com> --- include/linux/hmm.h | 22 ++++++++++++- mm/hmm.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index ac0b69a..106de1f 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -88,10 +88,10 @@ #if IS_ENABLED(CONFIG_HMM) +#include <linux/device.h> #include <linux/memremap.h> #include <linux/completion.h> - struct hmm; /* @@ -484,6 +484,26 @@ static inline unsigned long hmm_devmem_page_get_drvdata(struct page *page) } +/* + * struct hmm_device - fake device to hang device memory onto + * + * @device: device struct + * @minor: device minor number + */ +struct hmm_device { + struct device device; + unsigned minor; +}; + +/* + * Device driver that want to handle multiple devices memory through a single + * fake device can use hmm_device to do so. This is purely an helper and it + * is not needed to make use of any HMM functionality. + */ +struct hmm_device *hmm_device_new(void); +void hmm_device_put(struct hmm_device *hmm_device); + + /* Below are for HMM internal use only ! Not to be use by device driver ! */ void hmm_mm_destroy(struct mm_struct *mm); diff --git a/mm/hmm.c b/mm/hmm.c index f2ca895..61c3640187 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -24,6 +24,7 @@ #include <linux/slab.h> #include <linux/sched.h> #include <linux/mmzone.h> +#include <linux/module.h> #include <linux/pagemap.h> #include <linux/swapops.h> #include <linux/hugetlb.h> @@ -1078,3 +1079,97 @@ int hmm_devmem_fault_range(struct hmm_devmem *devmem, return 0; } EXPORT_SYMBOL(hmm_devmem_fault_range); + +/* + * Device driver that want to handle multiple devices memory through a single + * fake device can use hmm_device to do so. This is purely an helper and it + * is not needed to make use of any HMM functionality. + */ +#define HMM_DEVICE_MAX 256 + +static DECLARE_BITMAP(hmm_device_mask, HMM_DEVICE_MAX); +static DEFINE_SPINLOCK(hmm_device_lock); +static struct class *hmm_device_class; +static dev_t hmm_device_devt; + +static void hmm_device_release(struct device *device) +{ + struct hmm_device *hmm_device; + + hmm_device = container_of(device, struct hmm_device, device); + spin_lock(&hmm_device_lock); + clear_bit(hmm_device->minor, hmm_device_mask); + spin_unlock(&hmm_device_lock); + + kfree(hmm_device); +} + +struct hmm_device *hmm_device_new(void) +{ + struct hmm_device *hmm_device; + int ret; + + hmm_device = kzalloc(sizeof(*hmm_device), GFP_KERNEL); + if (!hmm_device) + return ERR_PTR(-ENOMEM); + + ret = alloc_chrdev_region(&hmm_device->device.devt,0,1,"hmm_device"); + if (ret < 0) { + kfree(hmm_device); + return NULL; + } + + spin_lock(&hmm_device_lock); + hmm_device->minor=find_first_zero_bit(hmm_device_mask,HMM_DEVICE_MAX); + if (hmm_device->minor >= HMM_DEVICE_MAX) { + spin_unlock(&hmm_device_lock); + kfree(hmm_device); + return NULL; + } + set_bit(hmm_device->minor, hmm_device_mask); + spin_unlock(&hmm_device_lock); + + dev_set_name(&hmm_device->device, "hmm_device%d", hmm_device->minor); + hmm_device->device.devt = MKDEV(MAJOR(hmm_device_devt), + hmm_device->minor); + hmm_device->device.release = hmm_device_release; + hmm_device->device.class = hmm_device_class; + device_initialize(&hmm_device->device); + + return hmm_device; +} +EXPORT_SYMBOL(hmm_device_new); + +void hmm_device_put(struct hmm_device *hmm_device) +{ + put_device(&hmm_device->device); +} +EXPORT_SYMBOL(hmm_device_put); + +static int __init hmm_init(void) +{ + int ret; + + ret = alloc_chrdev_region(&hmm_device_devt, 0, + HMM_DEVICE_MAX, + "hmm_device"); + if (ret) + return ret; + + hmm_device_class = class_create(THIS_MODULE, "hmm_device"); + if (IS_ERR(hmm_device_class)) { + unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); + return PTR_ERR(hmm_device_class); + } + return 0; +} + +static void __exit hmm_exit(void) +{ + unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); + class_destroy(hmm_device_class); +} + +module_init(hmm_init); +module_exit(hmm_exit); +MODULE_LICENSE("GPL"); -- 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>, "Jatin Kumar" <jakumar@nvidia.com>, "Mark Hairgrove" <mhairgrove@nvidia.com>, "Sherry Cheung" <SCheung@nvidia.com>, "Subhash Gutti" <sgutti@nvidia.com> Subject: [HMM v13 18/18] mm/hmm/devmem: dummy HMM device as an helper for ZONE_DEVICE memory Date: Fri, 18 Nov 2016 13:18:27 -0500 [thread overview] Message-ID: <1479493107-982-19-git-send-email-jglisse@redhat.com> (raw) In-Reply-To: <1479493107-982-1-git-send-email-jglisse@redhat.com> This introduce a dummy HMM device class so device driver can use it to create hmm_device for the sole purpose of registering device memory. It is usefull to device driver that want to manage multiple physical device memory under same device umbrella. Signed-off-by: JA(C)rA'me Glisse <jglisse@redhat.com> Signed-off-by: Jatin Kumar <jakumar@nvidia.com> Signed-off-by: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Mark Hairgrove <mhairgrove@nvidia.com> Signed-off-by: Sherry Cheung <SCheung@nvidia.com> Signed-off-by: Subhash Gutti <sgutti@nvidia.com> --- include/linux/hmm.h | 22 ++++++++++++- mm/hmm.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index ac0b69a..106de1f 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -88,10 +88,10 @@ #if IS_ENABLED(CONFIG_HMM) +#include <linux/device.h> #include <linux/memremap.h> #include <linux/completion.h> - struct hmm; /* @@ -484,6 +484,26 @@ static inline unsigned long hmm_devmem_page_get_drvdata(struct page *page) } +/* + * struct hmm_device - fake device to hang device memory onto + * + * @device: device struct + * @minor: device minor number + */ +struct hmm_device { + struct device device; + unsigned minor; +}; + +/* + * Device driver that want to handle multiple devices memory through a single + * fake device can use hmm_device to do so. This is purely an helper and it + * is not needed to make use of any HMM functionality. + */ +struct hmm_device *hmm_device_new(void); +void hmm_device_put(struct hmm_device *hmm_device); + + /* Below are for HMM internal use only ! Not to be use by device driver ! */ void hmm_mm_destroy(struct mm_struct *mm); diff --git a/mm/hmm.c b/mm/hmm.c index f2ca895..61c3640187 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -24,6 +24,7 @@ #include <linux/slab.h> #include <linux/sched.h> #include <linux/mmzone.h> +#include <linux/module.h> #include <linux/pagemap.h> #include <linux/swapops.h> #include <linux/hugetlb.h> @@ -1078,3 +1079,97 @@ int hmm_devmem_fault_range(struct hmm_devmem *devmem, return 0; } EXPORT_SYMBOL(hmm_devmem_fault_range); + +/* + * Device driver that want to handle multiple devices memory through a single + * fake device can use hmm_device to do so. This is purely an helper and it + * is not needed to make use of any HMM functionality. + */ +#define HMM_DEVICE_MAX 256 + +static DECLARE_BITMAP(hmm_device_mask, HMM_DEVICE_MAX); +static DEFINE_SPINLOCK(hmm_device_lock); +static struct class *hmm_device_class; +static dev_t hmm_device_devt; + +static void hmm_device_release(struct device *device) +{ + struct hmm_device *hmm_device; + + hmm_device = container_of(device, struct hmm_device, device); + spin_lock(&hmm_device_lock); + clear_bit(hmm_device->minor, hmm_device_mask); + spin_unlock(&hmm_device_lock); + + kfree(hmm_device); +} + +struct hmm_device *hmm_device_new(void) +{ + struct hmm_device *hmm_device; + int ret; + + hmm_device = kzalloc(sizeof(*hmm_device), GFP_KERNEL); + if (!hmm_device) + return ERR_PTR(-ENOMEM); + + ret = alloc_chrdev_region(&hmm_device->device.devt,0,1,"hmm_device"); + if (ret < 0) { + kfree(hmm_device); + return NULL; + } + + spin_lock(&hmm_device_lock); + hmm_device->minor=find_first_zero_bit(hmm_device_mask,HMM_DEVICE_MAX); + if (hmm_device->minor >= HMM_DEVICE_MAX) { + spin_unlock(&hmm_device_lock); + kfree(hmm_device); + return NULL; + } + set_bit(hmm_device->minor, hmm_device_mask); + spin_unlock(&hmm_device_lock); + + dev_set_name(&hmm_device->device, "hmm_device%d", hmm_device->minor); + hmm_device->device.devt = MKDEV(MAJOR(hmm_device_devt), + hmm_device->minor); + hmm_device->device.release = hmm_device_release; + hmm_device->device.class = hmm_device_class; + device_initialize(&hmm_device->device); + + return hmm_device; +} +EXPORT_SYMBOL(hmm_device_new); + +void hmm_device_put(struct hmm_device *hmm_device) +{ + put_device(&hmm_device->device); +} +EXPORT_SYMBOL(hmm_device_put); + +static int __init hmm_init(void) +{ + int ret; + + ret = alloc_chrdev_region(&hmm_device_devt, 0, + HMM_DEVICE_MAX, + "hmm_device"); + if (ret) + return ret; + + hmm_device_class = class_create(THIS_MODULE, "hmm_device"); + if (IS_ERR(hmm_device_class)) { + unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); + return PTR_ERR(hmm_device_class); + } + return 0; +} + +static void __exit hmm_exit(void) +{ + unregister_chrdev_region(hmm_device_devt, HMM_DEVICE_MAX); + class_destroy(hmm_device_class); +} + +module_init(hmm_init); +module_exit(hmm_exit); +MODULE_LICENSE("GPL"); -- 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:18 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 ` [HMM v13 04/18] mm/ZONE_DEVICE/free-page: callback when page is freed Jérôme Glisse 2016-11-18 18:18 ` 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 ` Jérôme Glisse [this message] 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-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-19-git-send-email-jglisse@redhat.com \ --to=jglisse@redhat.com \ --cc=SCheung@nvidia.com \ --cc=akpm@linux-foundation.org \ --cc=jakumar@nvidia.com \ --cc=jhubbard@nvidia.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mhairgrove@nvidia.com \ --cc=sgutti@nvidia.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.