diff --git a/arch/arm64/kernel/acpi_numa.c b/arch/arm64/kernel/acpi_numa.c index 7ff80004543460..6ed47b058d767d 100644 --- a/arch/arm64/kernel/acpi_numa.c +++ b/arch/arm64/kernel/acpi_numa.c @@ -107,7 +107,7 @@ void __init acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa) return; pxm = pa->proximity_domain; - node = acpi_map_pxm_to_node(pxm); + node = acpi_map_pxm_to_node(pxm, true); if (node == NUMA_NO_NODE || node >= MAX_NUMNODES) { pr_err("SRAT: Too many proximity domains %d\n", pxm); diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index a5636524af7693..760a468864b798 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c @@ -456,7 +456,7 @@ void __init acpi_numa_fixup(void) nodes_clear(node_online_map); for (i = 0; i < MAX_PXM_DOMAINS; i++) { if (pxm_bit_test(i)) { - int nid = acpi_map_pxm_to_node(i); + int nid = acpi_map_pxm_to_node(i, true); node_set_online(nid); } } diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index dac07e4f5834ea..6497d7c241ec8e 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c @@ -45,7 +45,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa) pxm, apic_id); return; } - node = acpi_map_pxm_to_node(pxm); + node = acpi_map_pxm_to_node(pxm, true); if (node < 0) { printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm); bad_srat(); @@ -80,7 +80,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) pxm = pa->proximity_domain_lo; if (acpi_srat_revision >= 2) pxm |= *((unsigned int*)pa->proximity_domain_hi) << 8; - node = acpi_map_pxm_to_node(pxm); + node = acpi_map_pxm_to_node(pxm, true); if (node < 0) { printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm); bad_srat(); diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 28a6b387e80e28..8133e7e6f9e3bc 100644 --- a/drivers/acpi/arm64/iort.c +++ b/drivers/acpi/arm64/iort.c @@ -1293,7 +1293,7 @@ static int __init arm_smmu_v3_set_proximity(struct device *dev, smmu = (struct acpi_iort_smmu_v3 *)node->node_data; if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) { - int dev_node = acpi_map_pxm_to_node(smmu->pxm); + int dev_node = acpi_map_pxm_to_node(smmu->pxm, false); if (dev_node != NUMA_NO_NODE && !node_online(dev_node)) return -EINVAL; diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index 7c138a4edc03eb..6cb44bbaa71fcf 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -2948,7 +2948,7 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc, ndr_desc->numa_node = acpi_map_pxm_to_online_node( spa->proximity_domain); ndr_desc->target_node = acpi_map_pxm_to_node( - spa->proximity_domain); + spa->proximity_domain, false); } else { ndr_desc->numa_node = NUMA_NO_NODE; ndr_desc->target_node = NUMA_NO_NODE; diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c index 2c32cfb7237012..3c041481677220 100644 --- a/drivers/acpi/numa/hmat.c +++ b/drivers/acpi/numa/hmat.c @@ -666,7 +666,7 @@ static void hmat_register_target_device(struct memory_target *target, pdev->dev.numa_node = acpi_map_pxm_to_online_node(target->memory_pxm); info = (struct memregion_info) { - .target_node = acpi_map_pxm_to_node(target->memory_pxm), + .target_node = acpi_map_pxm_to_node(target->memory_pxm, false), }; rc = platform_device_add_data(pdev, &info, sizeof(info)); if (rc < 0) { diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c index 5be5a977da1bfa..ed7d31795f4dca 100644 --- a/drivers/acpi/numa/srat.c +++ b/drivers/acpi/numa/srat.c @@ -52,7 +52,7 @@ static void __acpi_map_pxm_to_node(int pxm, int node) node_to_pxm_map[node] = pxm; } -int acpi_map_pxm_to_node(int pxm) +int acpi_map_pxm_to_node(int pxm, bool create) { int node; @@ -62,7 +62,7 @@ int acpi_map_pxm_to_node(int pxm) node = pxm_to_node_map[pxm]; if (node == NUMA_NO_NODE) { - if (nodes_weight(nodes_found_map) >= MAX_NUMNODES) + if (nodes_weight(nodes_found_map) >= MAX_NUMNODES || !create) return NUMA_NO_NODE; node = first_unset_node(nodes_found_map); __acpi_map_pxm_to_node(pxm, node); @@ -229,7 +229,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) if (acpi_srat_revision <= 1) pxm &= 0xff; - node = acpi_map_pxm_to_node(pxm); + node = acpi_map_pxm_to_node(pxm, true); if (node == NUMA_NO_NODE || node >= MAX_NUMNODES) { pr_err("SRAT: Too many proximity domains.\n"); goto out_err_bad_srat; @@ -444,6 +444,6 @@ int acpi_get_node(acpi_handle handle) pxm = acpi_get_pxm(handle); - return acpi_map_pxm_to_node(pxm); + return acpi_map_pxm_to_node(pxm, false); } EXPORT_SYMBOL(acpi_get_node); diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index cd685f521c77ac..0b11876d079978 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -5248,7 +5248,11 @@ static int __init gic_acpi_parse_srat_its(union acpi_subtable_headers *header, return -EINVAL; } - node = acpi_map_pxm_to_node(its_affinity->proximity_domain); + /* + * Note that in theory a new proximity node could be created by this + * entry as it is an SRAT resource allocation structure + */ + node = acpi_map_pxm_to_node(its_affinity->proximity_domain, false); if (node == NUMA_NO_NODE || node >= MAX_NUMNODES) { pr_err("SRAT: Invalid NUMA node %d in ITS affinity\n", node); diff --git a/include/acpi/acpi_numa.h b/include/acpi/acpi_numa.h index fdebcfc6c8df8a..6935c7516262cf 100644 --- a/include/acpi/acpi_numa.h +++ b/include/acpi/acpi_numa.h @@ -15,7 +15,7 @@ extern int pxm_to_node(int); extern int node_to_pxm(int); -extern int acpi_map_pxm_to_node(int); +extern int acpi_map_pxm_to_node(int, bool); extern unsigned char acpi_srat_revision; extern int acpi_numa __initdata; diff --git a/include/linux/acpi.h b/include/linux/acpi.h index d661cd0ee64db4..1414b7e0a486a3 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -416,7 +416,7 @@ extern void acpi_osi_setup(char *str); extern bool acpi_osi_is_win8(void); #ifdef CONFIG_ACPI_NUMA -int acpi_map_pxm_to_node(int pxm); +int acpi_map_pxm_to_node(int pxm, bool create); int acpi_get_node(acpi_handle handle); /** @@ -436,7 +436,7 @@ int acpi_get_node(acpi_handle handle); */ static inline int acpi_map_pxm_to_online_node(int pxm) { - int node = acpi_map_pxm_to_node(pxm); + int node = acpi_map_pxm_to_node(pxm, false); return numa_map_to_online_node(node); } @@ -445,7 +445,7 @@ static inline int acpi_map_pxm_to_online_node(int pxm) { return 0; } -static inline int acpi_map_pxm_to_node(int pxm) +static inline int acpi_map_pxm_to_node(int pxm, bool create) { return 0; }