ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window
authorAlison Schofield <alison.schofield@intel.com>
Mon, 10 Jul 2023 20:02:59 +0000 (13:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:58:53 +0000 (11:58 +0100)
[ Upstream commit 8f1004679987302b155f14b966ca6d4335814fcb ]

Commit fd49f99c1809 ("ACPI: NUMA: Add a node and memblk for each
CFMWS not in SRAT") did not account for the case where the BIOS
only partially describes a CFMWS Window in the SRAT. That means
the omitted address ranges, of a partially described CFMWS Window,
do not get assigned to a NUMA node.

Replace the call to phys_to_target_node() with numa_add_memblks().
Numa_add_memblks() searches an HPA range for existing memblk(s)
and extends those memblk(s) to fill the entire CFMWS Window.

Extending the existing memblks is a simple strategy that reuses
SRAT defined proximity domains from part of a window to fill out
the entire window, based on the knowledge* that all of a CFMWS
window is of a similar performance class.

*Note that this heuristic will evolve when CFMWS Windows present
a wider range of characteristics. The extension of the proximity
domain, implemented here, is likely a step in developing a more
sophisticated performance profile in the future.

There is no change in behavior when the SRAT does not describe
the CFMWS Window at all. In that case, a new NUMA node with a
single memblk covering the entire CFMWS Window is created.

Fixes: fd49f99c1809 ("ACPI: NUMA: Add a node and memblk for each CFMWS not in SRAT")
Reported-by: Derick Marks <derick.w.marks@intel.com>
Suggested-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Tested-by: Derick Marks <derick.w.marks@intel.com>
Link: https://lore.kernel.org/all/eaa0b7cffb0951a126223eef3cbe7b55b8300ad9.1689018477.git.alison.schofield%40intel.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/numa/srat.c

index 1f4fc5f..12f330b 100644 (file)
@@ -310,11 +310,16 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header,
        start = cfmws->base_hpa;
        end = cfmws->base_hpa + cfmws->window_size;
 
-       /* Skip if the SRAT already described the NUMA details for this HPA */
-       node = phys_to_target_node(start);
-       if (node != NUMA_NO_NODE)
+       /*
+        * The SRAT may have already described NUMA details for all,
+        * or a portion of, this CFMWS HPA range. Extend the memblks
+        * found for any portion of the window to cover the entire
+        * window.
+        */
+       if (!numa_fill_memblks(start, end))
                return 0;
 
+       /* No SRAT description. Create a new node. */
        node = acpi_map_pxm_to_node(*fake_pxm);
 
        if (node == NUMA_NO_NODE) {