Messages in this thread | | | Date | Sat, 13 Dec 2014 14:59:43 -0800 | Subject | Re: frequent lockups in 3.18rc4 | From | Linus Torvalds <> |
| |
Side note: I think I've found a real potential lockup bug in fs/namespace.c, but afaik it could only trigger with the RT patches.
I'm looking at what lxsetattr() does, since you had that lxsetattr-only lockup. I doubt it's really related to lxsetattr(), but whatever. 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. It's waitingo for mnt_make_readonly() to go away if it is racing with it.
But mnt_make_readonly() doesn't actually explicitly disable preemption while it sets that MNT_WRITE_HOLD bit. Instead, it depends on lock_mount_hash() to disable preemption for it. Which it does, because it is a seq-writelock, which uses a spinlock, which will disable preemption.
Except it won't with the RT patches, I guess. So it looks like you could have:\
- mnt_make_readonly() sets that bit - gets preempted with the RT patches - we run mnt_want_write() on all CPU's, which disables preemption and waits for the bit to be cleared - nothing happens.
This is clearly not what happens in your lockup, but it does seem to be a potential issue for the RT kernel.
Added Al and Thomas to the cc, for fs/namespace.c and RT kernel respectively. Maybe the RT patches already fix this, I didn't actually check.
Linus
| |