grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/1] mm: Better handling of adding new regions


From: Daniel Kiper
Subject: Re: [PATCH v2 1/1] mm: Better handling of adding new regions
Date: Thu, 6 Oct 2022 15:07:28 +0200
User-agent: NeoMutt/20170113 (1.7.2)

On Sun, Sep 25, 2022 at 03:59:50PM +0200, Patrick Steinhardt wrote:
> On Tue, Sep 13, 2022 at 01:49:52AM +0800, Zhang Boyang wrote:
> > The code of dynamically adding new regions has two problems. First, it
> > always invalidate disk caches, which decreases performance severely.
> > Second, it request exactly "size" bytes for new region, ignoring region
> > management overheads.
> >
> > This patch makes adding new regions more priority than disk cache
> > invalidating. This patch also use "size + align + GRUB_MM_HEAP_GROW" as
> > the size of new region. GRUB_MM_HEAP_GROW is set to 1MiB. This value can
> > address the region overheads, and it can also improve the performance of
> > small allocations when default heap is full.
> >
> > Fixes: 887f98f0db43 (mm: Allow dynamically requesting additional memory 
> > regions)
>
> It might be sensible to split this up into two patches, one to change
> when we drop caches and one to round requested sizes more intelligently.

Yes, I agree with Patrick.

> > Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
> > ---
> >  grub-core/kern/mm.c | 27 +++++++++++++++------------
> >  include/grub/mm.h   |  2 ++
> >  2 files changed, 17 insertions(+), 12 deletions(-)
> >
> > diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
> > index 75f6eacbe..0836b9538 100644
> > --- a/grub-core/kern/mm.c
> > +++ b/grub-core/kern/mm.c
> > @@ -410,18 +410,21 @@ grub_memalign (grub_size_t align, grub_size_t size)
> >  {
> >    grub_mm_region_t r;
> >    grub_size_t n = ((size + GRUB_MM_ALIGN - 1) >> GRUB_MM_ALIGN_LOG2) + 1;
> > +  grub_size_t grow;
> >    int count = 0;
> >
> >    if (!grub_mm_base)
> >      goto fail;
> >
> > -  if (size > ~(grub_size_t) align)
> > +  if (size > ~(grub_size_t) align ||
> > +      (size + align) > ~(grub_size_t) GRUB_MM_HEAP_GROW)
> >      goto fail;
> >
> >    /* We currently assume at least a 32-bit grub_size_t,
> > -     so limiting allocations to <adress space size> - 1MiB
> > +     so limiting heap growth to <adress space size> - 1MiB
> >       in name of sanity is beneficial. */
> > -  if ((size + align) > ~(grub_size_t) 0x100000)
> > +  grow = size + align + GRUB_MM_HEAP_GROW;
> > +  if (grow > ~(grub_size_t) 0x100000)
> >      goto fail;
>
> I wonder whether we want to be a bit more intelligent. It feels like the
> wrong thing to do to always add 1MB to the request regardless of the
> requested size. It is probably sensible for small requests, but when you
> request hundreds of megabytes adding a single megabyte feels rather
> worthless to me.
>
> Maybe we could use some kind of buckets instead, e.g.:
>
>     - Up to 256kB: allocate 1MB.
>     - Up to 2048kB: allocate 8MB.
>     - Up to 16MB: allocate 64MB.
>
> I just make up these numbers, but they should help demonstrate what I
> mean.

Adding more than 1 MiB may lead to situation when we are not able to
boot machine which still has e.g. 64 MiB essentially free but allocated
for GRUB heap. So, I would stick with 1 MiB even if it is not very
efficient for larger sizes. Additionally, assuming large memory
allocations follow large allocations is not always (often?) true.
Though I would improve algorithm a bit:

grow = ALIGN_UP (size + GRUB_MM_HEAP_GROW, GRUB_MM_HEAP_GROW);

And more importantly this calculations should happen in switch below.

> >    align = (align >> GRUB_MM_ALIGN_LOG2);
> > @@ -443,22 +446,16 @@ grub_memalign (grub_size_t align, grub_size_t size)
> >    switch (count)
> >      {
> >      case 0:
> > -      /* Invalidate disk caches.  */
> > -      grub_disk_cache_invalidate_all ();
> > -      count++;
> > -      goto again;
> > -
> > -    case 1:
>
> It feels sensible to reverse the order here so that we end up trying to
> satisfy allocations by requesting new pages first. So only when we get
> into the situation where we really cannot satisfy the request we try to
> reclaim memory as a last-effort strategy.

Yes, I agree.

Daniel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]