From: Hillf Danton <hdanton@sina.com>
To: Marco Elver <elver@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Alexander Potapenko <glider@google.com>,
Dmitry Vyukov <dvyukov@google.com>, Jann Horn <jannh@google.com>,
Mark Rutland <mark.rutland@arm.com>,
Hillf Danton <hdanton@sina.com>,
LKML <linux-kernel@vger.kernel.org>,
Linux Memory Management List <linux-mm@kvack.org>,
kasan-dev <kasan-dev@googlegroups.com>
Subject: Re: [PATCH 1/3] kfence: await for allocation using wait_event
Date: Wed, 21 Apr 2021 17:11:20 +0800 [thread overview]
Message-ID: <20210421091120.1244-1-hdanton@sina.com> (raw)
In-Reply-To: <CANpmjNNO3AgK3Fr07KXQhGpqt6-z7xNJFP=UoODg-Ft=u9cGfA@mail.gmail.com>
On Mon, 19 Apr 2021 11:49:04 Marco Elver wrote:
>On Mon, 19 Apr 2021 at 11:44, Marco Elver <elver@google.com> wrote:
>> On Mon, 19 Apr 2021 at 11:41, Hillf Danton <hdanton@sina.com> wrote:
>> > On Mon, 19 Apr 2021 10:50:25 Marco Elver wrote:
>> > > +
>> > > + WRITE_ONCE(kfence_timer_waiting, true);
>> > > + smp_mb(); /* See comment in __kfence_alloc(). */
>> >
>> > This is not needed given task state change in wait_event().
>>
>> Yes it is. We want to avoid the unconditional irq_work in
>> __kfence_alloc(). When the system is under load doing frequent
>> allocations, at least in my tests this avoids the irq_work almost
>> always. Without the irq_work you'd be correct of course.
>
>And in case this is about the smp_mb() here, yes it definitely is
>required. We *must* order the write of kfence_timer_waiting *before*
>the check of kfence_allocation_gate, which wait_event() does before
>anything else (including changing the state).
One of the reasons why wait_event() checks the wait condition before anything
else is no waker can help waiter before waiter gets themselves on the
wait queue head list. Nor can waker without scheduling on the waiter
side, even if the waiter is sitting on the list. So the mb cannot make sense
without scheduling, let alone the mb in wait_event().
>Otherwise the write may
>be reordered after the read, and we could potentially never wake up
>because __kfence_alloc() not waking us.
>
>This is documented in __kfence_alloc().
>
>> > > + wait_event_timeout(allocation_wait, atomic_read(&kfence_allocation_gate), HZ);
>> > > + smp_store_release(&kfence_timer_waiting, false); /* Order after wait_event(). */
>> > > +
next prev parent reply other threads:[~2021-04-21 9:11 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-19 8:50 [PATCH 0/3] kfence: optimize timer scheduling Marco Elver
2021-04-19 8:50 ` [PATCH 1/3] kfence: await for allocation using wait_event Marco Elver
2021-04-19 9:40 ` Hillf Danton
2021-04-19 9:44 ` Marco Elver
2021-04-19 9:49 ` Marco Elver
2021-04-21 9:11 ` Hillf Danton [this message]
2021-04-21 10:27 ` Marco Elver
2021-04-19 8:50 ` [PATCH 2/3] kfence: maximize allocation wait timeout duration Marco Elver
2021-04-19 8:50 ` [PATCH 3/3] kfence: use power-efficient work queue to run delayed work Marco Elver
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=20210421091120.1244-1-hdanton@sina.com \
--to=hdanton@sina.com \
--cc=akpm@linux-foundation.org \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=glider@google.com \
--cc=jannh@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox