• Alison Schofield's avatar
    x86/numa: Introduce numa_fill_memblks() · 8f012db2
    Alison Schofield authored
    numa_fill_memblks() fills in the gaps in numa_meminfo memblks
    over an physical address range.
    
    The ACPI driver will use numa_fill_memblks() to implement a new Linux
    policy that prescribes extending proximity domains in a portion of a
    CFMWS window to the entire window.
    
    Dan Williams offered this explanation of the policy:
    A CFWMS is an ACPI data structure that indicates *potential* locations
    where CXL memory can be placed. It is the playground where the CXL
    driver has free reign to establish regions. That space can be populated
    by BIOS created regions, or driver created regions, after hotplug or
    other reconfiguration.
    
    When BIOS creates a region in a CXL Window it additionally describes
    that subset of the Window range in the other typical ACPI tables SRAT,
    SLIT, and HMAT. The rationale for BIOS not pre-describing the entire
    CXL Window in SRAT, SLIT, and HMAT is that it can not predict the
    future. I.e. there is nothing stopping higher or lower performance
    devices being placed in the same Window. Compare that to ACPI memory
    hotplug that just onlines additional capacity in the proximity domain
    with little freedom for dynamic performance differentiation.
    
    That leaves the OS with a choice, should unpopulated window capacity
    match the proximity domain of an existing region, or should it allocate
    a new one? This patch takes the simple position of minimizing proximity
    domain proliferation by reusing any proximity domain intersection for
    the entire Window. If the Window has no intersections then allocate a
    new proximity domain. Note that SRAT, SLIT and HMAT information can be
    enumerated dynamically in a standard way from device provided data.
    Think of CXL as the end of ACPI needing to describe memory attributes,
    CXL offers a standard discovery model for performance attributes, but
    Linux still needs to interoperate with the old regime.
    Reported-by: default avatarDerick Marks <derick.w.marks@intel.com>
    Suggested-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarAlison Schofield <alison.schofield@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
    Tested-by: default avatarDerick Marks <derick.w.marks@intel.com>
    Link: https://lore.kernel.org/all/ef078a6f056ca974e5af85997013c0fda9e3326d.1689018477.git.alison.schofield%40intel.com
    8f012db2
sparsemem.h 1.19 KB