From: Uladzislau Rezki <urezki@gmail.com>
To: Michal Hocko <mhocko@kernel.org>
Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Daniel Wagner <dwagner@suse.de>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Thomas Gleixner <tglx@linutronix.de>,
linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Hillf Danton <hdanton@sina.com>,
Matthew Wilcox <willy@infradead.org>,
Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>,
Steven Rostedt <rostedt@goodmis.org>
Subject: Re: [PATCH v2 1/1] mm/vmalloc: remove preempt_disable/enable when do preloading
Date: Mon, 14 Oct 2019 16:30:03 +0200 [thread overview]
Message-ID: <20191014143003.GB17874@pc636> (raw)
In-Reply-To: <20191014131308.GG317@dhcp22.suse.cz>
On Mon, Oct 14, 2019 at 03:13:08PM +0200, Michal Hocko wrote:
> On Fri 11-10-19 00:33:18, Uladzislau Rezki (Sony) wrote:
> > Get rid of preempt_disable() and preempt_enable() when the
> > preload is done for splitting purpose. The reason is that
> > calling spin_lock() with disabled preemtion is forbidden in
> > CONFIG_PREEMPT_RT kernel.
>
> I think it would be really helpful to describe why the preemption was
> disabled in that path. Some of that is explained in the comment but the
> changelog should mention that explicitly.
>
Will do that, makes sense.
> > Therefore, we do not guarantee that a CPU is preloaded, instead
> > we minimize the case when it is not with this change.
> >
> > For example i run the special test case that follows the preload
> > pattern and path. 20 "unbind" threads run it and each does
> > 1000000 allocations. Only 3.5 times among 1000000 a CPU was
> > not preloaded. So it can happen but the number is negligible.
> >
> > V1 -> V2:
> > - move __this_cpu_cmpxchg check when spin_lock is taken,
> > as proposed by Andrew Morton
> > - add more explanation in regard of preloading
> > - adjust and move some comments
> >
> > Fixes: 82dd23e84be3 ("mm/vmalloc.c: preload a CPU with one object for split purpose")
> > Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
> > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
> > ---
> > mm/vmalloc.c | 50 +++++++++++++++++++++++++++++++++-----------------
> > 1 file changed, 33 insertions(+), 17 deletions(-)
> >
> > diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> > index e92ff5f7dd8b..f48cd0711478 100644
> > --- a/mm/vmalloc.c
> > +++ b/mm/vmalloc.c
> > @@ -969,6 +969,19 @@ adjust_va_to_fit_type(struct vmap_area *va,
> > * There are a few exceptions though, as an example it is
> > * a first allocation (early boot up) when we have "one"
> > * big free space that has to be split.
> > + *
> > + * Also we can hit this path in case of regular "vmap"
> > + * allocations, if "this" current CPU was not preloaded.
> > + * See the comment in alloc_vmap_area() why. If so, then
> > + * GFP_NOWAIT is used instead to get an extra object for
> > + * split purpose. That is rare and most time does not
> > + * occur.
> > + *
> > + * What happens if an allocation gets failed. Basically,
> > + * an "overflow" path is triggered to purge lazily freed
> > + * areas to free some memory, then, the "retry" path is
> > + * triggered to repeat one more time. See more details
> > + * in alloc_vmap_area() function.
> > */
> > lva = kmem_cache_alloc(vmap_area_cachep, GFP_NOWAIT);
>
> This doesn't seem to have anything to do with the patch. Have you
> considered to make it a patch on its own? Btw. I find this comment very
> useful!
>
Makes sense, will make it as separate patch.
> > if (!lva)
> > @@ -1078,31 +1091,34 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
> >
> > retry:
> > /*
> > - * Preload this CPU with one extra vmap_area object to ensure
> > - * that we have it available when fit type of free area is
> > - * NE_FIT_TYPE.
> > + * Preload this CPU with one extra vmap_area object. It is used
> > + * when fit type of free area is NE_FIT_TYPE. Please note, it
> > + * does not guarantee that an allocation occurs on a CPU that
> > + * is preloaded, instead we minimize the case when it is not.
> > + * It can happen because of migration, because there is a race
> > + * until the below spinlock is taken.
>
> s@migration@cpu migration@ because migration without on its own is quite
> ambiguous, especially in the MM code where it usually refers to memory.
>
Thanks, will update it.
Thank you for the comments!
--
Vlad Rezki
prev parent reply other threads:[~2019-10-14 14:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-10 22:33 [PATCH v2 1/1] mm/vmalloc: remove preempt_disable/enable when do preloading Uladzislau Rezki (Sony)
2019-10-11 18:15 ` Sebastian Andrzej Siewior
2019-10-11 21:56 ` Daniel Wagner
2019-10-14 13:13 ` Michal Hocko
2019-10-14 14:30 ` Uladzislau Rezki [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191014143003.GB17874@pc636 \
--to=urezki@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=bigeasy@linutronix.de \
--cc=dwagner@suse.de \
--cc=hdanton@sina.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=oleksiy.avramchenko@sonymobile.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.