From: Dan Williams <dan.j.williams@intel.com> To: linux-kernel@vger.kernel.org Cc: linux-nvdimm@lists.01.org, x86@kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 2/5] lib/memregion: Uplevel the pmem "region" ida to a global allocator Date: Thu, 04 Apr 2019 12:08:38 -0700 [thread overview] Message-ID: <155440491849.3190322.17551464505265122881.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <155440490809.3190322.15060922240602775809.stgit@dwillia2-desk3.amr.corp.intel.com> In preparation for handling platform differentiated memory types beyond persistent memory, uplevel the "region" identifier to a global number space. This enables a device-dax instance to be registered to any memory type with guaranteed unique names. Cc: Keith Busch <keith.busch@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/nvdimm/Kconfig | 1 + drivers/nvdimm/core.c | 1 - drivers/nvdimm/nd-core.h | 1 - drivers/nvdimm/region_devs.c | 13 ++++--------- include/linux/memregion.h | 6 ++++++ lib/Kconfig | 6 ++++++ lib/Makefile | 1 + lib/memregion.c | 22 ++++++++++++++++++++++ 8 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 include/linux/memregion.h create mode 100644 lib/memregion.c diff --git a/drivers/nvdimm/Kconfig b/drivers/nvdimm/Kconfig index 5e27918e4624..bf26cc5f6d67 100644 --- a/drivers/nvdimm/Kconfig +++ b/drivers/nvdimm/Kconfig @@ -3,6 +3,7 @@ menuconfig LIBNVDIMM depends on PHYS_ADDR_T_64BIT depends on HAS_IOMEM depends on BLK_DEV + select MEMREGION help Generic support for non-volatile memory devices including ACPI-6-NFIT defined resources. On platforms that define an diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c index acce050856a8..75fe651d327d 100644 --- a/drivers/nvdimm/core.c +++ b/drivers/nvdimm/core.c @@ -463,7 +463,6 @@ static __exit void libnvdimm_exit(void) nd_region_exit(); nvdimm_exit(); nvdimm_bus_exit(); - nd_region_devs_exit(); nvdimm_devs_exit(); } diff --git a/drivers/nvdimm/nd-core.h b/drivers/nvdimm/nd-core.h index e5ffd5733540..17561302dfec 100644 --- a/drivers/nvdimm/nd-core.h +++ b/drivers/nvdimm/nd-core.h @@ -133,7 +133,6 @@ struct nvdimm_bus *walk_to_nvdimm_bus(struct device *nd_dev); int __init nvdimm_bus_init(void); void nvdimm_bus_exit(void); void nvdimm_devs_exit(void); -void nd_region_devs_exit(void); void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev); struct nd_region; void nd_region_create_ns_seed(struct nd_region *nd_region); diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index b4ef7d9ff22e..eefdfd2565dd 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c @@ -11,6 +11,7 @@ * General Public License for more details. */ #include <linux/scatterlist.h> +#include <linux/memregion.h> #include <linux/highmem.h> #include <linux/sched.h> #include <linux/slab.h> @@ -27,7 +28,6 @@ */ #include <linux/io-64-nonatomic-hi-lo.h> -static DEFINE_IDA(region_ida); static DEFINE_PER_CPU(int, flush_idx); static int nvdimm_map_flush(struct device *dev, struct nvdimm *nvdimm, int dimm, @@ -141,7 +141,7 @@ static void nd_region_release(struct device *dev) put_device(&nvdimm->dev); } free_percpu(nd_region->lane); - ida_simple_remove(®ion_ida, nd_region->id); + memregion_free(nd_region->id); if (is_nd_blk(dev)) kfree(to_nd_blk_region(dev)); else @@ -1036,7 +1036,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus, if (!region_buf) return NULL; - nd_region->id = ida_simple_get(®ion_ida, 0, 0, GFP_KERNEL); + nd_region->id = memregion_alloc(); if (nd_region->id < 0) goto err_id; @@ -1090,7 +1090,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus, return nd_region; err_percpu: - ida_simple_remove(®ion_ida, nd_region->id); + memregion_free(nd_region->id); err_id: kfree(region_buf); return NULL; @@ -1237,8 +1237,3 @@ int nd_region_conflict(struct nd_region *nd_region, resource_size_t start, return device_for_each_child(&nvdimm_bus->dev, &ctx, region_conflict); } - -void __exit nd_region_devs_exit(void) -{ - ida_destroy(®ion_ida); -} diff --git a/include/linux/memregion.h b/include/linux/memregion.h new file mode 100644 index 000000000000..99fa47793b49 --- /dev/null +++ b/include/linux/memregion.h @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef _MEMREGION_H_ +#define _MEMREGION_H_ +int memregion_alloc(void); +void memregion_free(int id); +#endif /* _MEMREGION_H_ */ diff --git a/lib/Kconfig b/lib/Kconfig index a9e56539bd11..0b765d9a1145 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -318,6 +318,12 @@ config DECOMPRESS_LZ4 config GENERIC_ALLOCATOR bool +# +# Generic IDA for memory regions +# +config MEMREGION + bool + # # reed solomon support is select'ed if needed # diff --git a/lib/Makefile b/lib/Makefile index 3b08673e8881..6e237c4071af 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -122,6 +122,7 @@ obj-$(CONFIG_LIBCRC32C) += libcrc32c.o obj-$(CONFIG_CRC8) += crc8.o obj-$(CONFIG_XXHASH) += xxhash.o obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o +obj-$(CONFIG_MEMREGION) += memregion.o obj-$(CONFIG_842_COMPRESS) += 842/ obj-$(CONFIG_842_DECOMPRESS) += 842/ diff --git a/lib/memregion.c b/lib/memregion.c new file mode 100644 index 000000000000..21f5ff96c2eb --- /dev/null +++ b/lib/memregion.c @@ -0,0 +1,22 @@ +#include <linux/idr.h> +#include <linux/module.h> + +static DEFINE_IDA(region_ida); + +int memregion_alloc(void) +{ + return ida_simple_get(®ion_ida, 0, 0, GFP_KERNEL); +} +EXPORT_SYMBOL(memregion_alloc); + +void memregion_free(int id) +{ + ida_simple_remove(®ion_ida, id); +} +EXPORT_SYMBOL(memregion_free); + +static void __exit memregion_exit(void) +{ + ida_destroy(®ion_ida); +} +module_exit(memregion_exit); _______________________________________________ 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: Dan Williams <dan.j.williams@intel.com> To: linux-kernel@vger.kernel.org Cc: Keith Busch <keith.busch@intel.com>, vishal.l.verma@intel.com, x86@kernel.org, linux-mm@kvack.org, keith.busch@intel.com, vishal.l.verma@intel.com, linux-nvdimm@lists.01.org Subject: [RFC PATCH 2/5] lib/memregion: Uplevel the pmem "region" ida to a global allocator Date: Thu, 04 Apr 2019 12:08:38 -0700 [thread overview] Message-ID: <155440491849.3190322.17551464505265122881.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <155440490809.3190322.15060922240602775809.stgit@dwillia2-desk3.amr.corp.intel.com> In preparation for handling platform differentiated memory types beyond persistent memory, uplevel the "region" identifier to a global number space. This enables a device-dax instance to be registered to any memory type with guaranteed unique names. Cc: Keith Busch <keith.busch@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/nvdimm/Kconfig | 1 + drivers/nvdimm/core.c | 1 - drivers/nvdimm/nd-core.h | 1 - drivers/nvdimm/region_devs.c | 13 ++++--------- include/linux/memregion.h | 6 ++++++ lib/Kconfig | 6 ++++++ lib/Makefile | 1 + lib/memregion.c | 22 ++++++++++++++++++++++ 8 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 include/linux/memregion.h create mode 100644 lib/memregion.c diff --git a/drivers/nvdimm/Kconfig b/drivers/nvdimm/Kconfig index 5e27918e4624..bf26cc5f6d67 100644 --- a/drivers/nvdimm/Kconfig +++ b/drivers/nvdimm/Kconfig @@ -3,6 +3,7 @@ menuconfig LIBNVDIMM depends on PHYS_ADDR_T_64BIT depends on HAS_IOMEM depends on BLK_DEV + select MEMREGION help Generic support for non-volatile memory devices including ACPI-6-NFIT defined resources. On platforms that define an diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c index acce050856a8..75fe651d327d 100644 --- a/drivers/nvdimm/core.c +++ b/drivers/nvdimm/core.c @@ -463,7 +463,6 @@ static __exit void libnvdimm_exit(void) nd_region_exit(); nvdimm_exit(); nvdimm_bus_exit(); - nd_region_devs_exit(); nvdimm_devs_exit(); } diff --git a/drivers/nvdimm/nd-core.h b/drivers/nvdimm/nd-core.h index e5ffd5733540..17561302dfec 100644 --- a/drivers/nvdimm/nd-core.h +++ b/drivers/nvdimm/nd-core.h @@ -133,7 +133,6 @@ struct nvdimm_bus *walk_to_nvdimm_bus(struct device *nd_dev); int __init nvdimm_bus_init(void); void nvdimm_bus_exit(void); void nvdimm_devs_exit(void); -void nd_region_devs_exit(void); void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev); struct nd_region; void nd_region_create_ns_seed(struct nd_region *nd_region); diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index b4ef7d9ff22e..eefdfd2565dd 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c @@ -11,6 +11,7 @@ * General Public License for more details. */ #include <linux/scatterlist.h> +#include <linux/memregion.h> #include <linux/highmem.h> #include <linux/sched.h> #include <linux/slab.h> @@ -27,7 +28,6 @@ */ #include <linux/io-64-nonatomic-hi-lo.h> -static DEFINE_IDA(region_ida); static DEFINE_PER_CPU(int, flush_idx); static int nvdimm_map_flush(struct device *dev, struct nvdimm *nvdimm, int dimm, @@ -141,7 +141,7 @@ static void nd_region_release(struct device *dev) put_device(&nvdimm->dev); } free_percpu(nd_region->lane); - ida_simple_remove(®ion_ida, nd_region->id); + memregion_free(nd_region->id); if (is_nd_blk(dev)) kfree(to_nd_blk_region(dev)); else @@ -1036,7 +1036,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus, if (!region_buf) return NULL; - nd_region->id = ida_simple_get(®ion_ida, 0, 0, GFP_KERNEL); + nd_region->id = memregion_alloc(); if (nd_region->id < 0) goto err_id; @@ -1090,7 +1090,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus, return nd_region; err_percpu: - ida_simple_remove(®ion_ida, nd_region->id); + memregion_free(nd_region->id); err_id: kfree(region_buf); return NULL; @@ -1237,8 +1237,3 @@ int nd_region_conflict(struct nd_region *nd_region, resource_size_t start, return device_for_each_child(&nvdimm_bus->dev, &ctx, region_conflict); } - -void __exit nd_region_devs_exit(void) -{ - ida_destroy(®ion_ida); -} diff --git a/include/linux/memregion.h b/include/linux/memregion.h new file mode 100644 index 000000000000..99fa47793b49 --- /dev/null +++ b/include/linux/memregion.h @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef _MEMREGION_H_ +#define _MEMREGION_H_ +int memregion_alloc(void); +void memregion_free(int id); +#endif /* _MEMREGION_H_ */ diff --git a/lib/Kconfig b/lib/Kconfig index a9e56539bd11..0b765d9a1145 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -318,6 +318,12 @@ config DECOMPRESS_LZ4 config GENERIC_ALLOCATOR bool +# +# Generic IDA for memory regions +# +config MEMREGION + bool + # # reed solomon support is select'ed if needed # diff --git a/lib/Makefile b/lib/Makefile index 3b08673e8881..6e237c4071af 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -122,6 +122,7 @@ obj-$(CONFIG_LIBCRC32C) += libcrc32c.o obj-$(CONFIG_CRC8) += crc8.o obj-$(CONFIG_XXHASH) += xxhash.o obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o +obj-$(CONFIG_MEMREGION) += memregion.o obj-$(CONFIG_842_COMPRESS) += 842/ obj-$(CONFIG_842_DECOMPRESS) += 842/ diff --git a/lib/memregion.c b/lib/memregion.c new file mode 100644 index 000000000000..21f5ff96c2eb --- /dev/null +++ b/lib/memregion.c @@ -0,0 +1,22 @@ +#include <linux/idr.h> +#include <linux/module.h> + +static DEFINE_IDA(region_ida); + +int memregion_alloc(void) +{ + return ida_simple_get(®ion_ida, 0, 0, GFP_KERNEL); +} +EXPORT_SYMBOL(memregion_alloc); + +void memregion_free(int id) +{ + ida_simple_remove(®ion_ida, id); +} +EXPORT_SYMBOL(memregion_free); + +static void __exit memregion_exit(void) +{ + ida_destroy(®ion_ida); +} +module_exit(memregion_exit);
next prev parent reply other threads:[~2019-04-04 19:21 UTC|newest] Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-04 19:08 [RFC PATCH 0/5] EFI Special Purpose Memory Support Dan Williams 2019-04-04 19:08 ` Dan Williams 2019-04-04 19:08 ` [RFC PATCH 1/5] efi: Detect UEFI 2.8 Special Purpose Memory Dan Williams 2019-04-04 19:08 ` Dan Williams 2019-04-06 4:21 ` Ard Biesheuvel 2019-04-06 4:21 ` Ard Biesheuvel 2019-04-06 4:21 ` Ard Biesheuvel 2019-04-09 16:43 ` Dan Williams 2019-04-09 16:43 ` Dan Williams 2019-04-09 16:43 ` Dan Williams 2019-04-09 17:21 ` Ard Biesheuvel 2019-04-09 17:21 ` Ard Biesheuvel 2019-04-09 17:21 ` Ard Biesheuvel 2019-04-10 2:10 ` Dan Williams 2019-04-10 2:10 ` Dan Williams 2019-04-12 20:43 ` Ard Biesheuvel 2019-04-12 20:43 ` Ard Biesheuvel 2019-04-12 20:43 ` Ard Biesheuvel 2019-04-12 21:18 ` Dan Williams 2019-04-12 21:18 ` Dan Williams 2019-04-12 21:18 ` Dan Williams 2019-04-15 11:43 ` Enrico Weigelt, metux IT consult 2019-04-04 19:08 ` Dan Williams [this message] 2019-04-04 19:08 ` [RFC PATCH 2/5] lib/memregion: Uplevel the pmem "region" ida to a global allocator Dan Williams 2019-04-04 19:32 ` Matthew Wilcox 2019-04-04 21:02 ` Dan Williams 2019-04-04 21:02 ` Dan Williams 2019-04-04 21:02 ` Dan Williams 2019-04-04 19:08 ` [RFC PATCH 3/5] acpi/hmat: Track target address ranges Dan Williams 2019-04-04 19:08 ` Dan Williams 2019-04-04 20:58 ` Keith Busch 2019-04-04 20:58 ` Keith Busch 2019-04-04 20:58 ` Dan Williams 2019-04-04 20:58 ` Dan Williams 2019-04-04 20:58 ` Dan Williams 2019-04-04 19:08 ` [RFC PATCH 4/5] acpi/hmat: Register special purpose memory as a device Dan Williams 2019-04-04 19:08 ` Dan Williams 2019-04-05 11:18 ` Jonathan Cameron 2019-04-05 11:18 ` Jonathan Cameron 2019-04-05 15:43 ` Dan Williams 2019-04-05 15:43 ` Dan Williams 2019-04-05 15:43 ` Dan Williams 2019-04-05 16:23 ` Jonathan Cameron 2019-04-05 16:56 ` Dan Williams 2019-04-05 16:56 ` Dan Williams 2019-04-05 16:56 ` Dan Williams [not found] ` <CAPcyv4hxBFcJKbVVgNiE4UYXZS4XY9hfE8W9mN+VrcWS9AvJLw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2019-04-05 17:39 ` Jonathan Cameron 2019-04-05 17:39 ` Jonathan Cameron 2019-04-09 12:13 ` Christoph Hellwig 2019-04-09 12:13 ` Christoph Hellwig 2019-04-09 14:49 ` Dan Williams 2019-04-09 14:49 ` Dan Williams 2019-04-09 14:49 ` Dan Williams 2019-04-04 19:08 ` [RFC PATCH 5/5] device-dax: Add a driver for "hmem" devices Dan Williams 2019-04-04 19:08 ` Dan Williams
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=155440491849.3190322.17551464505265122881.stgit@dwillia2-desk3.amr.corp.intel.com \ --to=dan.j.williams@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ --cc=x86@kernel.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.