Messages in this thread | | | Date | Sat, 13 Dec 2014 23:35:09 +0000 | From | Al Viro <> | Subject | Re: frequent lockups in 3.18rc4 |
| |
On Sat, Dec 13, 2014 at 03:09:59PM -0800, Linus Torvalds wrote: > On Sat, Dec 13, 2014 at 2:59 PM, Linus Torvalds > <torvalds@linux-foundation.org> wrote: > > The generic code does that mnt_want_write/mnt_drop_write > > dance adound the call to setxattr, and that in turn does > > > > while (ACCESS_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) > > cpu_relax(); > > > > with preemption explicitly disabled. > > Btw, I see no reason why mnt_want_write/mnt_drop_write disables > preemption. They don't care, they just care about the ordering of the > write counts and the MNT_WRITE_HOLD bit. It's the code that sets the > bit that should care, afaik. But maybe I'm missing something.
Er... There's much more direct reason - suppose we get a timer interrupt right in the middle of mnt_drop_write(). And lost the timeslice. On UP we have mnt->mnt_writers--, with no locks held. On SMP we have this_cpu_dec() instead, also without any locks. You really don't want to lose the timeslice in the middle of either...
| |