Message ID | 156140037770.2951909.3387200938880485927.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | EFI Specific Purpose Memory Support | expand |
On Mon, Jun 24, 2019 at 8:33 PM Dan Williams <dan.j.williams@intel.com> wrote: > > There are multiple scenarios where the HMAT may contain information > about proximity domains that are not currently online. Rather than fail > to report any HMAT data just elide those offline domains. > > If and when those domains are later onlined they can be added to the > HMEM reporting at that point. > > This was found while testing EFI_MEMORY_SP support which reserves > "specific purpose" memory from the general allocation pool. If that > reservation results in an empty numa-node then the node is not marked > online leading a spurious: > > "acpi/hmat: Ignoring HMAT: Invalid table" > > ...result for HMAT parsing. > > Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > drivers/acpi/numa/hmat.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c > index 96b7d39a97c6..2c220cb7b620 100644 > --- a/drivers/acpi/numa/hmat.c > +++ b/drivers/acpi/numa/hmat.c > @@ -96,9 +96,6 @@ static __init void alloc_memory_target(unsigned int mem_pxm) > { > struct memory_target *target; > > - if (pxm_to_node(mem_pxm) == NUMA_NO_NODE) > - return; > - > target = find_mem_target(mem_pxm); > if (target) > return; > @@ -588,6 +585,17 @@ static __init void hmat_register_targets(void) > struct memory_target *target; > > list_for_each_entry(target, &targets, node) { > + int nid = pxm_to_node(target->memory_pxm); > + > + /* > + * Skip offline nodes. This can happen when memory > + * marked EFI_MEMORY_SP, "specific purpose", is applied > + * to all the memory in a promixity domain leading to > + * the node being marked offline / unplugged, or if > + * memory-only "hotplug" node is offline. > + */ > + if (nid == NUMA_NO_NODE || !node_online(nid)) > + continue; > hmat_register_target_initiators(target); > hmat_register_target_perf(target); > } >
diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c index 96b7d39a97c6..2c220cb7b620 100644 --- a/drivers/acpi/numa/hmat.c +++ b/drivers/acpi/numa/hmat.c @@ -96,9 +96,6 @@ static __init void alloc_memory_target(unsigned int mem_pxm) { struct memory_target *target; - if (pxm_to_node(mem_pxm) == NUMA_NO_NODE) - return; - target = find_mem_target(mem_pxm); if (target) return; @@ -588,6 +585,17 @@ static __init void hmat_register_targets(void) struct memory_target *target; list_for_each_entry(target, &targets, node) { + int nid = pxm_to_node(target->memory_pxm); + + /* + * Skip offline nodes. This can happen when memory + * marked EFI_MEMORY_SP, "specific purpose", is applied + * to all the memory in a promixity domain leading to + * the node being marked offline / unplugged, or if + * memory-only "hotplug" node is offline. + */ + if (nid == NUMA_NO_NODE || !node_online(nid)) + continue; hmat_register_target_initiators(target); hmat_register_target_perf(target); }