Since bit spin locks are only a single bit, there's nowhere to put a lockdep map. Fortunately, all bit spin locks in the kernel are conceptually in only a few classes of lock, and by introducing the split_lock as somewhere to store the lockdep_map, we can track each bit spin lock's dependencies.
This split_lock would also give us somewhere to queue waiters, should we choose to do that. Or a centralised place to handle PREEMPT_RT mutexes. But I'll leave that for someone who knows what they're doing; for now this keeps the same implementation. Matthew Wilcox (Oracle) (17): x86: Rename split_lock_init to sld_init locking: Add split_lock bit_spinlock: Prepare for split_locks hlist_bl: Prepare for split_locks dm-snap: Add dm_exceptional_lock dcache: Add d_hash_lock fscache: Add cookie_hash_lock gfs2: Add qd_hash_lock mbcache: Add mb_cache_lock hlist_bl: Make the split_lock parameter mandatory s390: Add airq_iv_lock zram: Add zram_table_lock jbd2: Add jbd2_jh_lock slub: Add slab_page_lock zsmalloc: Add zs_pin_lock rhashtable: Convert to split_lock bit_spinlock: Track bit spin locks with lockdep arch/s390/include/asm/airq.h | 5 +++-- arch/x86/kernel/cpu/intel.c | 6 +++--- drivers/block/zram/zram_drv.c | 8 ++++--- drivers/md/dm-snap.c | 10 +++++---- drivers/s390/cio/airq.c | 3 +++ fs/dcache.c | 25 +++++++++++----------- fs/fscache/cookie.c | 13 ++++++------ fs/gfs2/quota.c | 5 +++-- fs/jbd2/journal.c | 18 +++++++++------- fs/mbcache.c | 25 +++++++++++----------- include/linux/bit_spinlock.h | 39 ++++++++++++++++++++++++++++++----- include/linux/jbd2.h | 10 +++++---- include/linux/list_bl.h | 15 ++++++++++---- include/linux/rhashtable.h | 20 +++++++----------- include/linux/split_lock.h | 37 +++++++++++++++++++++++++++++++++ lib/rhashtable.c | 5 +---- mm/slub.c | 6 ++++-- mm/zsmalloc.c | 11 +++++++--- 18 files changed, 174 insertions(+), 87 deletions(-) create mode 100644 include/linux/split_lock.h -- 2.30.2