jbd2: Make state lock a spinlock
Bit-spinlocks are problematic on PREEMPT_RT if functions which might sleep on RT, e.g. spin_lock(), alloc/free(), are invoked inside the lock held region because bit spinlocks disable preemption even on RT. A first attempt was to replace state lock with a spinlock placed in struct buffer_head and make the locking conditional on PREEMPT_RT and DEBUG_BIT_SPINLOCKS. Jan pointed out that there is a 4 byte hole in struct journal_head where a regular spinlock fits in and he would not object to convert the state lock to a spinlock unconditionally. Aside of solving the RT problem, this also gains lockdep coverage for the journal head state lock (bit-spinlocks are not covered by lockdep as it's hard to fit a lockdep map into a single bit). The trivial change would have been to convert the jbd_*lock_bh_state() inlines, but that comes with the downside that these functions take a buffer head pointer which needs to be converted to a journal head pointer which adds another level of indirection. As almost all functions which use this lock have a journal head pointer readily available, it makes more sense to remove the lock helper inlines and write out spin_*lock() at all call sites. Fixup all locking comments as well. Suggested-by:Jan Kara <jack@suse.com> Signed-off-by:
Thomas Gleixner <tglx@linutronix.de> Signed-off-by:
Jan Kara <jack@suse.cz> Cc: "Theodore Ts'o" <tytso@mit.edu> Cc: Mark Fasheh <mark@fasheh.com> Cc: Joseph Qi <joseph.qi@linux.alibaba.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Jan Kara <jack@suse.com> Cc: linux-ext4@vger.kernel.org Link: https://lore.kernel.org/r/20190809124233.13277-7-jack@suse.cz Signed-off-by:
Theodore Ts'o <tytso@mit.edu>
Showing
- fs/jbd2/commit.c 4 additions, 4 deletionsfs/jbd2/commit.c
- fs/jbd2/journal.c 6 additions, 4 deletionsfs/jbd2/journal.c
- fs/jbd2/transaction.c 47 additions, 53 deletionsfs/jbd2/transaction.c
- fs/ocfs2/suballoc.c 11 additions, 8 deletionsfs/ocfs2/suballoc.c
- include/linux/jbd2.h 2 additions, 18 deletionsinclude/linux/jbd2.h
- include/linux/journal-head.h 14 additions, 7 deletionsinclude/linux/journal-head.h
Please register or sign in to comment