[PATCH v3 00/24] locking/lockdep: Add support for dynamic keys
From: Bart Van Assche
Date: Thu Dec 06 2018 - 20:15:13 EST
Hi Ingo and Peter,
A known shortcoming of the current lockdep implementation is that it requires
lock keys to be allocated statically. This forces certain unrelated
synchronization objects to share keys and this key sharing can cause false
positive deadlock reports. This patch series adds support for dynamic keys in
the lockdep code and eliminates a class of false positive reports from the
workqueue implementation.
The changes compared to v2 are:
- Made sure that all schedule_free_zapped_classes() calls are protected
with the graph lock.
- When removing a lock class, only recalculate lock chains that have been
modified.
- Combine a list_del() and list_add_tail() call into a list_move_tail()
call in register_lock_class().
- Use an RCU read lock instead of the graph lock inside is_dynamic_key().
The changes compared to v1 are:
- Addressed Peter's review comments: remove the list_head that I had added
to struct lock_list again, replaced all_list_entries and free_list_entries
by two bitmaps, use call_rcu() to free lockdep objects, add a BUILD_BUG_ON()
that compares the size of struct lock_class_key and raw_spin_lock_t.
- Addressed the "unknown symbol" errors reported by the build bot by adding a
few #ifdef / #endif directives. Addressed the 32-bit warnings by using %d
instead of %ld for array indices and by casting the array indices to
unsigned int.
- Removed several WARN_ON_ONCE(!class->hash_entry.pprev) statements since
these duplicate the code in check_data_structures().
- Left out the patch that causes lockdep to complain if no name has been
assigned to a lock object. That patch namely causes the build bot to
complain about certain lock objects but I have not yet had the time to
figure out the identity of these lock objects.
Bart.
Bart Van Assche (24):
lockdep tests: Display compiler warning and error messages
lockdep tests: Fix shellcheck warnings
lockdep tests: Improve testing accuracy
lockdep tests: Run lockdep tests a second time under Valgrind
liblockdep: Rename "trywlock" into "trywrlock"
liblockdep: Add dummy print_irqtrace_events() implementation
lockdep tests: Test the lockdep_reset_lock() implementation
locking/lockdep: Declare local symbols static
locking/lockdep: Inline __lockdep_init_map()
locking/lockdep: Introduce lock_class_cache_is_registered()
locking/lockdep: Remove a superfluous INIT_LIST_HEAD() statement
locking/lockdep: Make concurrent lockdep_reset_lock() calls safe
locking/lockdep: Stop using RCU primitives to access all_lock_classes
locking/lockdep: Make zap_class() remove all matching lock order
entries
locking/lockdep: Reorder struct lock_class members
locking/lockdep: Retain the class key and name while freeing a lock
class
locking/lockdep: Free lock classes that are no longer in use
locking/lockdep: Reuse list entries that are no longer in use
locking/lockdep: Check data structure consistency
locking/lockdep: Introduce __lockdep_free_key_range()
locking/lockdep: Verify whether lock objects are small enough to be
used as class keys
locking/lockdep: Add support for dynamic keys
kernel/workqueue: Use dynamic lockdep keys for workqueues
lockdep tests: Test dynamic key registration
include/linux/lockdep.h | 37 +-
include/linux/workqueue.h | 28 +-
kernel/locking/lockdep.c | 647 +++++++++++++++---
kernel/workqueue.c | 60 +-
tools/lib/lockdep/include/liblockdep/common.h | 3 +
tools/lib/lockdep/include/liblockdep/mutex.h | 12 +-
tools/lib/lockdep/include/liblockdep/rwlock.h | 6 +-
tools/lib/lockdep/lockdep.c | 5 +
tools/lib/lockdep/run_tests.sh | 39 +-
tools/lib/lockdep/tests/AA.sh | 2 +
tools/lib/lockdep/tests/ABA.sh | 2 +
tools/lib/lockdep/tests/ABBA.c | 12 +
tools/lib/lockdep/tests/ABBA.sh | 2 +
tools/lib/lockdep/tests/ABBA_2threads.sh | 2 +
tools/lib/lockdep/tests/ABBCCA.c | 4 +
tools/lib/lockdep/tests/ABBCCA.sh | 2 +
tools/lib/lockdep/tests/ABBCCDDA.c | 5 +
tools/lib/lockdep/tests/ABBCCDDA.sh | 2 +
tools/lib/lockdep/tests/ABCABC.c | 4 +
tools/lib/lockdep/tests/ABCABC.sh | 2 +
tools/lib/lockdep/tests/ABCDBCDA.c | 5 +
tools/lib/lockdep/tests/ABCDBCDA.sh | 2 +
tools/lib/lockdep/tests/ABCDBDDA.c | 5 +
tools/lib/lockdep/tests/ABCDBDDA.sh | 2 +
tools/lib/lockdep/tests/WW.sh | 2 +
tools/lib/lockdep/tests/unlock_balance.c | 2 +
tools/lib/lockdep/tests/unlock_balance.sh | 2 +
27 files changed, 731 insertions(+), 165 deletions(-)
create mode 100755 tools/lib/lockdep/tests/AA.sh
create mode 100755 tools/lib/lockdep/tests/ABA.sh
create mode 100755 tools/lib/lockdep/tests/ABBA.sh
create mode 100755 tools/lib/lockdep/tests/ABBA_2threads.sh
create mode 100755 tools/lib/lockdep/tests/ABBCCA.sh
create mode 100755 tools/lib/lockdep/tests/ABBCCDDA.sh
create mode 100755 tools/lib/lockdep/tests/ABCABC.sh
create mode 100755 tools/lib/lockdep/tests/ABCDBCDA.sh
create mode 100755 tools/lib/lockdep/tests/ABCDBDDA.sh
create mode 100755 tools/lib/lockdep/tests/WW.sh
create mode 100755 tools/lib/lockdep/tests/unlock_balance.sh
--
2.20.0.rc2.403.gdbc3b29805-goog