Message ID | 20241101134706.1185-3-gourry@gourry.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | memory,x86,acpi: hotplug memory alignment advisement | expand |
On 11/1/24 06:47, 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. It's too bad this doesn't simplify any of the arch code, but it's also not making it much worse. I assume this is something that will go through the mm tree, so: Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
On Fri, Nov 01, 2024 at 09:47:04AM -0400, 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. > > Suggested-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Gregory Price <gourry@gourry.net> > Acked-by: David Hildenbrand <david@redhat.com> > --- > arch/x86/mm/init_64.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > index ff253648706f..f1a495e998ce 100644 > --- a/arch/x86/mm/init_64.c > +++ b/arch/x86/mm/init_64.c > @@ -1452,16 +1452,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 (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) s/boot_cpu_has/cpu_feature_enabled/ while at it.
On Fri, Nov 01, 2024 at 09:47:04AM -0400, 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. > > Suggested-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Gregory Price <gourry@gourry.net> > Acked-by: David Hildenbrand <david@redhat.com> Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > --- > arch/x86/mm/init_64.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > index ff253648706f..f1a495e998ce 100644 > --- a/arch/x86/mm/init_64.c > +++ b/arch/x86/mm/init_64.c > @@ -1452,16 +1452,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 (!boot_cpu_has(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; > } > -- > 2.43.0 >
On Fri, Nov 01, 2024 at 04:51:47PM +0100, Borislav Petkov wrote: > On Fri, Nov 01, 2024 at 09:47:04AM -0400, 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. > > > > Suggested-by: David Hildenbrand <david@redhat.com> > > Signed-off-by: Gregory Price <gourry@gourry.net> > > Acked-by: David Hildenbrand <david@redhat.com> > > --- > > arch/x86/mm/init_64.c | 15 ++++++++++----- > > 1 file changed, 10 insertions(+), 5 deletions(-) > > > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > > index ff253648706f..f1a495e998ce 100644 > > --- a/arch/x86/mm/init_64.c > > +++ b/arch/x86/mm/init_64.c > > @@ -1452,16 +1452,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 (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) > > s/boot_cpu_has/cpu_feature_enabled/ > > while at it. > I don't personally understand the implications of this switch off hand, probably warrants a separate patch submission if you think it's important given the original logic is boot_cpu_has and I don't want to increase scope change here. ~Gregory > -- > Regards/Gruss, > Boris. > > https://people.kernel.org/tglx/notes-about-netiquette
On Fri, Nov 01, 2024 at 12:19:08PM -0400, Gregory Price wrote: > I don't personally understand the implications of this switch off hand, > probably warrants a separate patch submission if you think it's important > given the original logic is boot_cpu_has and I don't want to increase > scope change here. We want to switch the code to cpu_feature_enabled(): https://lore.kernel.org/r/20241031103401.GBZyNdGQ-ZyXKyzC_z@fat_crate.local and it is not increasing the scope at all. You can simply say: "Convert to cpu_feature_enabled() while at it." in the commit message. Thx.
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index ff253648706f..f1a495e998ce 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1452,16 +1452,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 (!boot_cpu_has(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; }