Messages in this thread | | | From | Bart Van Assche <> | Subject | [PATCH v4 00/15] locking/lockdep: Add support for dynamic keys | Date | Tue, 11 Dec 2018 14:13:06 -0800 |
| |
Hi Peter and Ingo,
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 v3 are: - Rework the code that frees objects that are no longer used such that it is now guaranteed that a grace period elapses between last use and freeing. - The lockdep self tests pass again. - Avoid that the patch that removes all matching lock order entries can cause list corruption. Note: the change in this patch to realize that is removed again by a later patch. In other words, this change is only necessary to make the series bisectable.
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 (15): locking/lockdep: Fix required memory size reported if CONFIG_PROVE_LOCKING=n locking/lockdep: Make zap_class() remove all matching lock order entries locking/lockdep: Reorder struct lock_class members locking/lockdep: Initialize the locks_before and locks_after lists earlier locking/lockdep: Split lockdep_free_key_range() and lockdep_reset_lock() locking/lockdep: Make it easy to detect whether or not inside a selftest locking/lockdep: Free lock classes that are no longer in use locking/lockdep: Reuse list entries that are no longer in use locking/lockdep: Introduce lockdep_next_lockchain() and lock_chain_count() locking/lockdep: Reuse lock chains that have been freed locking/lockdep: Check data structure consistency 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 | 38 +- include/linux/workqueue.h | 28 +- kernel/locking/lockdep.c | 884 ++++++++++++++++-- kernel/locking/lockdep_internals.h | 3 +- kernel/locking/lockdep_proc.c | 12 +- kernel/workqueue.c | 60 +- lib/locking-selftest.c | 2 + tools/lib/lockdep/include/liblockdep/common.h | 2 + tools/lib/lockdep/include/liblockdep/mutex.h | 11 +- tools/lib/lockdep/tests/ABBA.c | 9 + 10 files changed, 893 insertions(+), 156 deletions(-)
-- 2.20.0.rc2.403.gdbc3b29805-goog
| |