Message ID | 20250113174439.1965168-4-gourry@gourry.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | memory,x86,acpi: hotplug memory alignment advisement | expand |
On Mon, Jan 13, 2025 at 6:44 PM Gregory Price <gourry@gourry.net> wrote: > > Capacity is stranded when CFMWS regions are not aligned to block size. > On x86, block size increases with capacity (2G blocks @ 64G capacity). > > Use CFMWS base/size to report memory block size alignment advice. > > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Signed-off-by: Gregory Price <gourry@gourry.net> > Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > Acked-by: David Hildenbrand <david@redhat.com> > Acked-by: Dan Williams <dan.j.williams@intel.com> > Tested-by: Fan Ni <fan.ni@samsung.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > drivers/acpi/numa/srat.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c > index 59fffe34c9d0..7526119fe945 100644 > --- a/drivers/acpi/numa/srat.c > +++ b/drivers/acpi/numa/srat.c > @@ -14,6 +14,7 @@ > #include <linux/errno.h> > #include <linux/acpi.h> > #include <linux/memblock.h> > +#include <linux/memory.h> > #include <linux/numa.h> > #include <linux/nodemask.h> > #include <linux/topology.h> > @@ -425,13 +426,22 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header, > { > struct acpi_cedt_cfmws *cfmws; > int *fake_pxm = arg; > - u64 start, end; > + u64 start, end, align; > int node; > > cfmws = (struct acpi_cedt_cfmws *)header; > start = cfmws->base_hpa; > end = cfmws->base_hpa + cfmws->window_size; > > + /* Align memblock size to CFMW regions if possible */ > + align = 1UL << __ffs(start | end); > + if (align >= SZ_256M) { > + if (memory_block_advise_max_size(align) < 0) > + pr_warn("CFMWS: memblock size advise failed\n"); > + } else { > + pr_err("CFMWS: [BIOS BUG] base/size alignment violates spec\n"); > + } > + > /* > * The SRAT may have already described NUMA details for all, > * or a portion of, this CFMWS HPA range. Extend the memblks > -- > 2.47.1 >
Gregory Price wrote: > Capacity is stranded when CFMWS regions are not aligned to block size. > On x86, block size increases with capacity (2G blocks @ 64G capacity). > > Use CFMWS base/size to report memory block size alignment advice. > > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Signed-off-by: Gregory Price <gourry@gourry.net> > Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > Acked-by: David Hildenbrand <david@redhat.com> > Acked-by: Dan Williams <dan.j.williams@intel.com> > Tested-by: Fan Ni <fan.ni@samsung.com> > --- > drivers/acpi/numa/srat.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c > index 59fffe34c9d0..7526119fe945 100644 > --- a/drivers/acpi/numa/srat.c > +++ b/drivers/acpi/numa/srat.c > @@ -14,6 +14,7 @@ > #include <linux/errno.h> > #include <linux/acpi.h> > #include <linux/memblock.h> > +#include <linux/memory.h> > #include <linux/numa.h> > #include <linux/nodemask.h> > #include <linux/topology.h> > @@ -425,13 +426,22 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header, > { > struct acpi_cedt_cfmws *cfmws; > int *fake_pxm = arg; > - u64 start, end; > + u64 start, end, align; > int node; > > cfmws = (struct acpi_cedt_cfmws *)header; > start = cfmws->base_hpa; > end = cfmws->base_hpa + cfmws->window_size; > > + /* Align memblock size to CFMW regions if possible */ > + align = 1UL << __ffs(start | end); > + if (align >= SZ_256M) { > + if (memory_block_advise_max_size(align) < 0) > + pr_warn("CFMWS: memblock size advise failed\n"); I wonder if it would be good to print the return value here so the user knows why this failed? But either way. Reviewed-by: Ira Weiny <ira.weiny@intel.com> > + } else { > + pr_err("CFMWS: [BIOS BUG] base/size alignment violates spec\n"); > + } > + > /* > * The SRAT may have already described NUMA details for all, > * or a portion of, this CFMWS HPA range. Extend the memblks > -- > 2.47.1 > >
On Mon, Jan 13, 2025 at 02:59:22PM -0600, Ira Weiny wrote: > Gregory Price wrote: > > + /* Align memblock size to CFMW regions if possible */ > > + align = 1UL << __ffs(start | end); > > + if (align >= SZ_256M) { > > + if (memory_block_advise_max_size(align) < 0) > > + pr_warn("CFMWS: memblock size advise failed\n"); > > I wonder if it would be good to print the return value here so the user > knows why this failed? > As someone who is often annoyed by this exact pattern, I am apparently just as guilty at producing it *facepalm* I'll pick this up and push it tomorrow. > But either way. > > Reviewed-by: Ira Weiny <ira.weiny@intel.com> > > > + } else { > > + pr_err("CFMWS: [BIOS BUG] base/size alignment violates spec\n"); > > + } > > + > > /* > > * The SRAT may have already described NUMA details for all, > > * or a portion of, this CFMWS HPA range. Extend the memblks > > -- > > 2.47.1 > > > > > >
diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c index 59fffe34c9d0..7526119fe945 100644 --- a/drivers/acpi/numa/srat.c +++ b/drivers/acpi/numa/srat.c @@ -14,6 +14,7 @@ #include <linux/errno.h> #include <linux/acpi.h> #include <linux/memblock.h> +#include <linux/memory.h> #include <linux/numa.h> #include <linux/nodemask.h> #include <linux/topology.h> @@ -425,13 +426,22 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header, { struct acpi_cedt_cfmws *cfmws; int *fake_pxm = arg; - u64 start, end; + u64 start, end, align; int node; cfmws = (struct acpi_cedt_cfmws *)header; start = cfmws->base_hpa; end = cfmws->base_hpa + cfmws->window_size; + /* Align memblock size to CFMW regions if possible */ + align = 1UL << __ffs(start | end); + if (align >= SZ_256M) { + if (memory_block_advise_max_size(align) < 0) + pr_warn("CFMWS: memblock size advise failed\n"); + } else { + pr_err("CFMWS: [BIOS BUG] base/size alignment violates spec\n"); + } + /* * The SRAT may have already described NUMA details for all, * or a portion of, this CFMWS HPA range. Extend the memblks