diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/acpi/nfit/core.c | 8 | ||||
| -rw-r--r-- | drivers/acpi/numa.c | 1 | ||||
| -rw-r--r-- | drivers/dax/bus.c | 4 | ||||
| -rw-r--r-- | drivers/dax/bus.h | 3 | ||||
| -rw-r--r-- | drivers/dax/dax-private.h | 4 | ||||
| -rw-r--r-- | drivers/dax/pmem/core.c | 4 | ||||
| -rw-r--r-- | drivers/nvdimm/e820.c | 1 | ||||
| -rw-r--r-- | drivers/nvdimm/nd.h | 2 | ||||
| -rw-r--r-- | drivers/nvdimm/of_pmem.c | 1 | ||||
| -rw-r--r-- | drivers/nvdimm/region_devs.c | 1 |
10 files changed, 23 insertions, 6 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index 011d3db19c80..475899974c70 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c | |||
| @@ -2869,11 +2869,15 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc, | |||
| 2869 | ndr_desc->res = &res; | 2869 | ndr_desc->res = &res; |
| 2870 | ndr_desc->provider_data = nfit_spa; | 2870 | ndr_desc->provider_data = nfit_spa; |
| 2871 | ndr_desc->attr_groups = acpi_nfit_region_attribute_groups; | 2871 | ndr_desc->attr_groups = acpi_nfit_region_attribute_groups; |
| 2872 | if (spa->flags & ACPI_NFIT_PROXIMITY_VALID) | 2872 | if (spa->flags & ACPI_NFIT_PROXIMITY_VALID) { |
| 2873 | ndr_desc->numa_node = acpi_map_pxm_to_online_node( | 2873 | ndr_desc->numa_node = acpi_map_pxm_to_online_node( |
| 2874 | spa->proximity_domain); | 2874 | spa->proximity_domain); |
| 2875 | else | 2875 | ndr_desc->target_node = acpi_map_pxm_to_node( |
| 2876 | spa->proximity_domain); | ||
| 2877 | } else { | ||
| 2876 | ndr_desc->numa_node = NUMA_NO_NODE; | 2878 | ndr_desc->numa_node = NUMA_NO_NODE; |
| 2879 | ndr_desc->target_node = NUMA_NO_NODE; | ||
| 2880 | } | ||
| 2877 | 2881 | ||
| 2878 | /* | 2882 | /* |
| 2879 | * Persistence domain bits are hierarchical, if | 2883 | * Persistence domain bits are hierarchical, if |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 274699463b4f..b9d86babb13a 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
| @@ -84,6 +84,7 @@ int acpi_map_pxm_to_node(int pxm) | |||
| 84 | 84 | ||
| 85 | return node; | 85 | return node; |
| 86 | } | 86 | } |
| 87 | EXPORT_SYMBOL(acpi_map_pxm_to_node); | ||
| 87 | 88 | ||
| 88 | /** | 89 | /** |
| 89 | * acpi_map_pxm_to_online_node - Map proximity ID to online node | 90 | * acpi_map_pxm_to_online_node - Map proximity ID to online node |
diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c index 568168500217..c620ad52d7e5 100644 --- a/drivers/dax/bus.c +++ b/drivers/dax/bus.c | |||
| @@ -214,7 +214,7 @@ static void dax_region_unregister(void *region) | |||
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | struct dax_region *alloc_dax_region(struct device *parent, int region_id, | 216 | struct dax_region *alloc_dax_region(struct device *parent, int region_id, |
| 217 | struct resource *res, unsigned int align, | 217 | struct resource *res, int target_node, unsigned int align, |
| 218 | unsigned long pfn_flags) | 218 | unsigned long pfn_flags) |
| 219 | { | 219 | { |
| 220 | struct dax_region *dax_region; | 220 | struct dax_region *dax_region; |
| @@ -244,6 +244,7 @@ struct dax_region *alloc_dax_region(struct device *parent, int region_id, | |||
| 244 | dax_region->id = region_id; | 244 | dax_region->id = region_id; |
| 245 | dax_region->align = align; | 245 | dax_region->align = align; |
| 246 | dax_region->dev = parent; | 246 | dax_region->dev = parent; |
| 247 | dax_region->target_node = target_node; | ||
| 247 | if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups)) { | 248 | if (sysfs_create_groups(&parent->kobj, dax_region_attribute_groups)) { |
| 248 | kfree(dax_region); | 249 | kfree(dax_region); |
| 249 | return NULL; | 250 | return NULL; |
| @@ -348,6 +349,7 @@ struct dev_dax *__devm_create_dev_dax(struct dax_region *dax_region, int id, | |||
| 348 | 349 | ||
| 349 | dev_dax->dax_dev = dax_dev; | 350 | dev_dax->dax_dev = dax_dev; |
| 350 | dev_dax->region = dax_region; | 351 | dev_dax->region = dax_region; |
| 352 | dev_dax->target_node = dax_region->target_node; | ||
| 351 | kref_get(&dax_region->kref); | 353 | kref_get(&dax_region->kref); |
| 352 | 354 | ||
| 353 | inode = dax_inode(dax_dev); | 355 | inode = dax_inode(dax_dev); |
diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h index ce977552ffb5..8619e3299943 100644 --- a/drivers/dax/bus.h +++ b/drivers/dax/bus.h | |||
| @@ -10,7 +10,8 @@ struct dax_device; | |||
| 10 | struct dax_region; | 10 | struct dax_region; |
| 11 | void dax_region_put(struct dax_region *dax_region); | 11 | void dax_region_put(struct dax_region *dax_region); |
| 12 | struct dax_region *alloc_dax_region(struct device *parent, int region_id, | 12 | struct dax_region *alloc_dax_region(struct device *parent, int region_id, |
| 13 | struct resource *res, unsigned int align, unsigned long flags); | 13 | struct resource *res, int target_node, unsigned int align, |
| 14 | unsigned long flags); | ||
| 14 | 15 | ||
| 15 | enum dev_dax_subsys { | 16 | enum dev_dax_subsys { |
| 16 | DEV_DAX_BUS, | 17 | DEV_DAX_BUS, |
diff --git a/drivers/dax/dax-private.h b/drivers/dax/dax-private.h index a82ce48f5884..a45612148ca0 100644 --- a/drivers/dax/dax-private.h +++ b/drivers/dax/dax-private.h | |||
| @@ -26,6 +26,7 @@ void dax_bus_exit(void); | |||
| 26 | /** | 26 | /** |
| 27 | * struct dax_region - mapping infrastructure for dax devices | 27 | * struct dax_region - mapping infrastructure for dax devices |
| 28 | * @id: kernel-wide unique region for a memory range | 28 | * @id: kernel-wide unique region for a memory range |
| 29 | * @target_node: effective numa node if this memory range is onlined | ||
| 29 | * @kref: to pin while other agents have a need to do lookups | 30 | * @kref: to pin while other agents have a need to do lookups |
| 30 | * @dev: parent device backing this region | 31 | * @dev: parent device backing this region |
| 31 | * @align: allocation and mapping alignment for child dax devices | 32 | * @align: allocation and mapping alignment for child dax devices |
| @@ -34,6 +35,7 @@ void dax_bus_exit(void); | |||
| 34 | */ | 35 | */ |
| 35 | struct dax_region { | 36 | struct dax_region { |
| 36 | int id; | 37 | int id; |
| 38 | int target_node; | ||
| 37 | struct kref kref; | 39 | struct kref kref; |
| 38 | struct device *dev; | 40 | struct device *dev; |
| 39 | unsigned int align; | 41 | unsigned int align; |
| @@ -46,6 +48,7 @@ struct dax_region { | |||
| 46 | * data while the device is activated in the driver. | 48 | * data while the device is activated in the driver. |
| 47 | * @region - parent region | 49 | * @region - parent region |
| 48 | * @dax_dev - core dax functionality | 50 | * @dax_dev - core dax functionality |
| 51 | * @target_node: effective numa node if dev_dax memory range is onlined | ||
| 49 | * @dev - device core | 52 | * @dev - device core |
| 50 | * @pgmap - pgmap for memmap setup / lifetime (driver owned) | 53 | * @pgmap - pgmap for memmap setup / lifetime (driver owned) |
| 51 | * @ref: pgmap reference count (driver owned) | 54 | * @ref: pgmap reference count (driver owned) |
| @@ -54,6 +57,7 @@ struct dax_region { | |||
| 54 | struct dev_dax { | 57 | struct dev_dax { |
| 55 | struct dax_region *region; | 58 | struct dax_region *region; |
| 56 | struct dax_device *dax_dev; | 59 | struct dax_device *dax_dev; |
| 60 | int target_node; | ||
| 57 | struct device dev; | 61 | struct device dev; |
| 58 | struct dev_pagemap pgmap; | 62 | struct dev_pagemap pgmap; |
| 59 | struct percpu_ref ref; | 63 | struct percpu_ref ref; |
diff --git a/drivers/dax/pmem/core.c b/drivers/dax/pmem/core.c index bdcff1b14e95..f71019ce0647 100644 --- a/drivers/dax/pmem/core.c +++ b/drivers/dax/pmem/core.c | |||
| @@ -20,6 +20,7 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, enum dev_dax_subsys subsys) | |||
| 20 | struct nd_namespace_common *ndns; | 20 | struct nd_namespace_common *ndns; |
| 21 | struct nd_dax *nd_dax = to_nd_dax(dev); | 21 | struct nd_dax *nd_dax = to_nd_dax(dev); |
| 22 | struct nd_pfn *nd_pfn = &nd_dax->nd_pfn; | 22 | struct nd_pfn *nd_pfn = &nd_dax->nd_pfn; |
| 23 | struct nd_region *nd_region = to_nd_region(dev->parent); | ||
| 23 | 24 | ||
| 24 | ndns = nvdimm_namespace_common_probe(dev); | 25 | ndns = nvdimm_namespace_common_probe(dev); |
| 25 | if (IS_ERR(ndns)) | 26 | if (IS_ERR(ndns)) |
| @@ -52,7 +53,8 @@ struct dev_dax *__dax_pmem_probe(struct device *dev, enum dev_dax_subsys subsys) | |||
| 52 | memcpy(&res, &pgmap.res, sizeof(res)); | 53 | memcpy(&res, &pgmap.res, sizeof(res)); |
| 53 | res.start += offset; | 54 | res.start += offset; |
| 54 | dax_region = alloc_dax_region(dev, region_id, &res, | 55 | dax_region = alloc_dax_region(dev, region_id, &res, |
| 55 | le32_to_cpu(pfn_sb->align), PFN_DEV|PFN_MAP); | 56 | nd_region->target_node, le32_to_cpu(pfn_sb->align), |
| 57 | PFN_DEV|PFN_MAP); | ||
| 56 | if (!dax_region) | 58 | if (!dax_region) |
| 57 | return ERR_PTR(-ENOMEM); | 59 | return ERR_PTR(-ENOMEM); |
| 58 | 60 | ||
diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c index 521eaf53a52a..36be9b619187 100644 --- a/drivers/nvdimm/e820.c +++ b/drivers/nvdimm/e820.c | |||
| @@ -47,6 +47,7 @@ static int e820_register_one(struct resource *res, void *data) | |||
| 47 | ndr_desc.res = res; | 47 | ndr_desc.res = res; |
| 48 | ndr_desc.attr_groups = e820_pmem_region_attribute_groups; | 48 | ndr_desc.attr_groups = e820_pmem_region_attribute_groups; |
| 49 | ndr_desc.numa_node = e820_range_to_nid(res->start); | 49 | ndr_desc.numa_node = e820_range_to_nid(res->start); |
| 50 | ndr_desc.target_node = ndr_desc.numa_node; | ||
| 50 | set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags); | 51 | set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags); |
| 51 | if (!nvdimm_pmem_region_create(nvdimm_bus, &ndr_desc)) | 52 | if (!nvdimm_pmem_region_create(nvdimm_bus, &ndr_desc)) |
| 52 | return -ENXIO; | 53 | return -ENXIO; |
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index cfde992684e7..0b3d7595b3cb 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h | |||
| @@ -153,7 +153,7 @@ struct nd_region { | |||
| 153 | u16 ndr_mappings; | 153 | u16 ndr_mappings; |
| 154 | u64 ndr_size; | 154 | u64 ndr_size; |
| 155 | u64 ndr_start; | 155 | u64 ndr_start; |
| 156 | int id, num_lanes, ro, numa_node; | 156 | int id, num_lanes, ro, numa_node, target_node; |
| 157 | void *provider_data; | 157 | void *provider_data; |
| 158 | struct kernfs_node *bb_state; | 158 | struct kernfs_node *bb_state; |
| 159 | struct badblocks bb; | 159 | struct badblocks bb; |
diff --git a/drivers/nvdimm/of_pmem.c b/drivers/nvdimm/of_pmem.c index 0a701837dfc0..ecaaa27438e2 100644 --- a/drivers/nvdimm/of_pmem.c +++ b/drivers/nvdimm/of_pmem.c | |||
| @@ -68,6 +68,7 @@ static int of_pmem_region_probe(struct platform_device *pdev) | |||
| 68 | memset(&ndr_desc, 0, sizeof(ndr_desc)); | 68 | memset(&ndr_desc, 0, sizeof(ndr_desc)); |
| 69 | ndr_desc.attr_groups = region_attr_groups; | 69 | ndr_desc.attr_groups = region_attr_groups; |
| 70 | ndr_desc.numa_node = dev_to_node(&pdev->dev); | 70 | ndr_desc.numa_node = dev_to_node(&pdev->dev); |
| 71 | ndr_desc.target_node = ndr_desc.numa_node; | ||
| 71 | ndr_desc.res = &pdev->resource[i]; | 72 | ndr_desc.res = &pdev->resource[i]; |
| 72 | ndr_desc.of_node = np; | 73 | ndr_desc.of_node = np; |
| 73 | set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags); | 74 | set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags); |
diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index e2818f94f292..caf2f3129ccd 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c | |||
| @@ -1065,6 +1065,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus, | |||
| 1065 | nd_region->flags = ndr_desc->flags; | 1065 | nd_region->flags = ndr_desc->flags; |
| 1066 | nd_region->ro = ro; | 1066 | nd_region->ro = ro; |
| 1067 | nd_region->numa_node = ndr_desc->numa_node; | 1067 | nd_region->numa_node = ndr_desc->numa_node; |
| 1068 | nd_region->target_node = ndr_desc->target_node; | ||
| 1068 | ida_init(&nd_region->ns_ida); | 1069 | ida_init(&nd_region->ns_ida); |
| 1069 | ida_init(&nd_region->btt_ida); | 1070 | ida_init(&nd_region->btt_ida); |
| 1070 | ida_init(&nd_region->pfn_ida); | 1071 | ida_init(&nd_region->pfn_ida); |
