Message ID | 20250113174439.1965168-3-gourry@gourry.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | memory,x86,acpi: hotplug memory alignment advisement | expand |
Gregory Price wrote: > Systems with hotplug may provide an advisement value on what the > memblock size should be. Probe this value when the rest of the > configuration values are considered. > > The new heuristic is as follows > > 1) set_memory_block_size_order value if already set (cmdline param) > 2) minimum block size if memory is less than large block limit > 3) if no hotplug advice: Max block size if system is bare-metal, > otherwise use end of memory alignment. > 4) if hotplug advice: lesser of advice and end of memory alignment. > > Convert to cpu_feature_enabled() while at it.[1] > > [1] https://lore.kernel.org/all/20241031103401.GBZyNdGQ-ZyXKyzC_z@fat_crate.local/ > > Suggested-by: Borislav Petkov <bp@alien8.de> > Suggested-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Gregory Price <gourry@gourry.net> > Acked-by: David Hildenbrand <david@redhat.com> > Acked-by: Dave Hansen <dave.hansen@linux.intel.com> > Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > Acked-by: Dan Williams <dan.j.williams@intel.com> > Tested-by: Fan Ni <fan.ni@samsung.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> [snip]
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 01ea7c6df303..58ace82874eb 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1462,16 +1462,21 @@ static unsigned long probe_memory_block_size(void) } /* - * Use max block size to minimize overhead on bare metal, where - * alignment for memory hotplug isn't a concern. + * When hotplug alignment is not a concern, maximize blocksize + * to minimize overhead. Otherwise, align to the lesser of advice + * alignment and end of memory alignment. */ - if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) { + bz = memory_block_advised_max_size(); + if (!bz) { bz = MAX_BLOCK_SIZE; - goto done; + if (!cpu_feature_enabled(X86_FEATURE_HYPERVISOR)) + goto done; + } else { + bz = max(min(bz, MAX_BLOCK_SIZE), MIN_MEMORY_BLOCK_SIZE); } /* Find the largest allowed block size that aligns to memory end */ - for (bz = MAX_BLOCK_SIZE; bz > MIN_MEMORY_BLOCK_SIZE; bz >>= 1) { + for (; bz > MIN_MEMORY_BLOCK_SIZE; bz >>= 1) { if (IS_ALIGNED(boot_mem_end, bz)) break; }