|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/2] EFI: free unused boot mem in at least some cases
On Mon, Sep 14, 2020 at 05:26:57PM +0200, Jan Beulich wrote:
> On 14.09.2020 17:16, Roger Pau Monné wrote:
> > On Mon, Aug 24, 2020 at 02:08:11PM +0200, Jan Beulich wrote:
> >> Address at least the primary reason why 52bba67f8b87 ("efi/boot: Don't
> >> free ebmalloc area at all") was put in place: Make xen_in_range() aware
> >> of the freed range. This is in particular relevant for EFI-enabled
> >> builds not actually running on EFI, as the entire range will be unused
> >> in this case.
> >>
> >> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> >
> > Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>
> Thanks much.
>
> >> @@ -1145,7 +1146,8 @@ void __init noreturn __start_xen(unsigne
> >>
> >> /*
> >> * This needs to remain in sync with xen_in_range() and the
> >> - * respective reserve_e820_ram() invocation below.
> >> + * respective reserve_e820_ram() invocation below. No need to
> >> + * query efi_boot_mem_unused() here, though.
> >> */
> >> mod[mbi->mods_count].mod_start = virt_to_mfn(_stext);
> >> mod[mbi->mods_count].mod_end = __2M_rwdata_end - _stext;
> >
> > I find this extremely confusing, we reuse mod_start/mod_end to contain
> > a mfn and a size (in bytes) instead of a start and end address (not
> > something that should be fixed here, but seeing this I assumed it was
> > wrong).
>
> While perhaps somewhat confusing, I still think it was a fair thing
> to do in favor of introducing a completely new way of propagating
> respective information, and then having the consumer of this data
> look at two different places.
Maybe we could add a union there so that mod_end would alias with
mod_size or something.
> >> +bool efi_boot_mem_unused(unsigned long *start, unsigned long *end)
> >> +{
> >> + *start = (unsigned long)ebmalloc_mem + PAGE_ALIGN(ebmalloc_allocated);
> >> + *end = (unsigned long)ebmalloc_mem + sizeof(ebmalloc_mem);
> >> +
> >> + return *start < *end;
> >> +}
> >> +
> >> void __init free_ebmalloc_unused_mem(void)
> >> {
> >> -#if 0 /* FIXME: Putting a hole in the BSS breaks the IOMMU mappings for
> >> dom0. */
> >> unsigned long start, end;
> >>
> >> - start = (unsigned long)ebmalloc_mem + PAGE_ALIGN(ebmalloc_allocated);
> >> - end = (unsigned long)ebmalloc_mem + sizeof(ebmalloc_mem);
> >> +#ifdef CONFIG_X86
> >> + /* FIXME: Putting a hole in .bss would shatter the large page
> >> mapping. */
> >
> > Could you make the ebmalloc size (EBMALLOC_SIZE) 2MB (and aligned), so
> > that you would only shatter the malloc'ed pages but not the
> > surrounding mappings?
> >
> > That would be a good compromise IMO.
>
> Yes, that's what I've been considering as a compromise as well. In
> fact I was further thinking whether to allocate the space from the
> linker script instead of having a global/static object. Maybe by
> extending into the .pad section, which is already 2Mb aligned anyway.
We would have to adjust the calculations then, but would be fine IMO
as it won't require poking a hole in the bss section. I assume we
would need to then move _end to cover it.
> Another option is to not further align the whole blob at all and
> merely free whatever comes past the next 2Mb boundary (and is not
> in use). This would avoid having an up to 2Mb block of unused, not
> freed memory ahead of the ebmalloc one.
I would just place it at the end of the loaded image (after bss) as it
seems simpler.
Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |