Messages in this thread | | | Date | Fri, 18 Sep 2015 16:41:15 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH] kernel: fix data race in put_pid |
| |
On 09/18, Dmitry Vyukov wrote: > > On Fri, Sep 18, 2015 at 3:44 PM, Oleg Nesterov <oleg@redhat.com> wrote: > > So I assume that if we have > > > > int X = 0; > > atomic_t Y = ATOMIC_INIT(0); > > > > void w(void) > > { > > X = 1; > > atomic_inc_return(&Y); > > } > > > > then > > > > void r(void) > > { > > if (atomic_read_ctrl(&Y)) > > BUG_ON(X == 0); > > } > > > > should be correct? Why? > > > > If not then I am even more confused. > > This not correct,
Good. because I wasn't able to understand why this could work.
> // thread 1 > X = 1; > atomic_inc_return(&Y); > > // thread 2 > if (atomic_read_ctrl(&Y)) { > X = 2; > BUG_ON(X == 2); > }
Thanks. This makes perfect sense to me.
And then I agree, atomic_read_ctrl() in put_pid() should fix the theoretical problem.
Perhaps we can add this example to memory-barriers.txt... Although perhaps it already explains/documents this case. I am afraid to open it, it is huge and changes too often so every time it looks like a new document to me ;)
Oleg.
| |