[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190904163325.GA22421@lenoir>
Date: Wed, 4 Sep 2019 18:33:28 +0200
From: Frederic Weisbecker <frederic@...nel.org>
To: Oleg Nesterov <oleg@...hat.com>
Cc: "Eric W. Biederman" <ebiederm@...ssion.com>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Russell King - ARM Linux admin <linux@...linux.org.uk>,
Peter Zijlstra <peterz@...radead.org>,
Chris Metcalf <cmetcalf@...hip.com>,
Christoph Lameter <cl@...ux.com>,
Kirill Tkhai <tkhai@...dex.ru>, Mike Galbraith <efault@....de>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...nel.org>,
Linux List Kernel Mailing <linux-kernel@...r.kernel.org>,
Davidlohr Bueso <dave@...olabs.net>
Subject: Re: [PATCH 1/3] task: Add a count of task rcu users
On Wed, Sep 04, 2019 at 05:32:46PM +0200, Oleg Nesterov wrote:
> On 09/04, Frederic Weisbecker wrote:
> >
> > So what happens if, say:
> >
> >
> > CPU 1 CPU 2
> > --------------------------------------------------------------
> > rcu_read_lock()
> > p = rcu_dereference(rq->task)
> > if (refcount_inc_not_zero(p->rcu_users)) {
> > .....
> > release_task() {
> > put_task_struct_rcu_user() {
> > call_rcu() {
> > queue rcu_head
>
> in this particular case call_rcu() won't be called, so
Yeah I confused myself in finding the scenario but like you say below, release_task()
can simply happen between the p = rcu_dereference() and the refcount_inc to break things.
I thought the point of these rcu_users was to be able to do:
rcu_read_lock()
p = rcu_dereference(task)
if (!refcount_inc_not_zero(p->rcu_users)) {
rcu_read_unlock();
return -1;
}
rcu_read_unlock();
//do stuff with task
put_task_struct_rcu_user(p);
Thanks.
>
> > }
> > }
> > }
> > put_task_struct_rcu_user(); //here rcu_users has been overwritten
>
> rcu_users won't be overwritten.
>
> But nobody should try to increment ->rcu_users,
>
> rcu_read_lock();
> p = rcu_dereference(rq->task);
> refcount_inc_not_zero(p->rcu_users);
>
> is already wrong because both release_task/last-schedule can happen in
> between, before refcount_inc_not_zero().
>
> Oleg.
>
Powered by blists - more mailing lists