|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v3 4/6] xen/x86: use arch_get_ram_range to get information from E820 map
Hi Jan,
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 2022年8月25日 20:14
> To: Wei Chen <Wei.Chen@xxxxxxx>
> Cc: nd <nd@xxxxxxx>; Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Roger Pau
> Monné <roger.pau@xxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; George Dunlap
> <george.dunlap@xxxxxxxxxx>; Julien Grall <julien@xxxxxxx>; Stefano
> Stabellini <sstabellini@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Subject: Re: [PATCH v3 4/6] xen/x86: use arch_get_ram_range to get
> information from E820 map
>
> On 22.08.2022 04:58, Wei Chen wrote:
> > @@ -96,3 +97,27 @@ unsigned int __init arch_get_dma_bitsize(void)
> > flsl(node_start_pfn(node) + node_spanned_pages(node) /
> 4 - 1)
> > + PAGE_SHIFT, 32);
> > }
> > +
> > +/*
> > + * This function provides the ability for caller to get one RAM entry
> > + * from architectural memory map by index.
> > + *
> > + * This function will return zero if it can return a proper RAM entry.
> > + * otherwise it will return -ENOENT for out of scope index, or return
> > + * -EINVAL for non-RAM type memory entry.
> > + *
> > + * Note: the range is exclusive at the end, e.g. [start, end).
> > + */
> > +int __init arch_get_ram_range(unsigned int idx, paddr_t *start, paddr_t
> *end)
>
> Since the comment is intended to apply to all architectures providing,
> I think it should go with the declaration (once) rather than the
> definition (at least one instance per arch).
>
Ok, I will move the comment to header file.
> > +{
> > + if ( idx >= e820.nr_map )
> > + return -ENOENT;
> > +
> > + if ( e820.map[idx].type != E820_RAM )
> > + return -EINVAL;
>
> EINVAL is so heavily (over)loaded that I'm inclined to ask to use e.g.
> -ENODATA here.
>
Ok.
> > --- a/xen/arch/x86/srat.c
> > +++ b/xen/arch/x86/srat.c
> > @@ -428,18 +428,22 @@ acpi_numa_memory_affinity_init(const struct
> acpi_srat_mem_affinity *ma)
> > Make sure the PXMs cover all memory. */
> > static int __init nodes_cover_memory(void)
> > {
> > - int i;
> > + unsigned int i;
> >
> > - for (i = 0; i < e820.nr_map; i++) {
> > + for (i = 0; ; i++) {
> > int j, found;
> > paddr_t start, end;
> >
> > - if (e820.map[i].type != E820_RAM) {
> > + /* Try to loop memory map from index 0 to end to get RAM
> ranges. */
> > + found = arch_get_ram_range(i, &start, &end);
> > +
> > + /* Index relate entry is not RAM, skip it. */
> > + if (found == -EINVAL)
> > continue;
> > - }
> >
> > - start = e820.map[i].addr;
> > - end = e820.map[i].addr + e820.map[i].size;
> > + /* Reach the end of arch's memory map */
> > + if (found == -ENOENT)
> > + break;
>
> What if an arch returns a 3rd error indicator? The way you've written
> it code below would assume success and use uninitialized data. I'd
> like to suggest to only special-case -ENOENT and treat all other
Yes, I hadn't taken the 3rd error case into account. I will follow your
Comment in next version.
> errors the same. But of course the variable (re)used doesn't really
> fit that:
>
> /* Reach the end of arch's memory map */
> if (found == -ENOENT)
> break;
>
> /* Index relate entry is not RAM, skip it. */
> if (found)
> continue;
>
> because here really you mean "not found". Since in fact "found" would
> want to be of "bool" type in the function, and "j" would want to be
> "unsigned int" just like "i" is, I recommend introducing a new local
> variable, e.g. "err".
>
Ok.
Cheers,
Wei Chen
> Jan
>
> > do {
> > found = 0;
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |