lkml.org 
[lkml]   [2018]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 05/15] locking/lockdep: Split lockdep_free_key_range() and lockdep_reset_lock()
    Date
    This patch does not change the behavior of these functions but makes the
    patch that frees unused lock classes easier to read.

    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Waiman Long <longman@redhat.com>
    Cc: Johannes Berg <johannes@sipsolutions.net>
    Signed-off-by: Bart Van Assche <bvanassche@acm.org>
    ---
    kernel/locking/lockdep.c | 74 +++++++++++++++++++++-------------------
    1 file changed, 38 insertions(+), 36 deletions(-)

    diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
    index 9ab782378b3b..4fcc2a07bfb4 100644
    --- a/kernel/locking/lockdep.c
    +++ b/kernel/locking/lockdep.c
    @@ -4181,6 +4181,26 @@ static inline int within(const void *addr, void *start, unsigned long size)
    return addr >= start && addr < start + size;
    }

    +static void __lockdep_free_key_range(void *start, unsigned long size)
    +{
    + struct lock_class *class;
    + struct hlist_head *head;
    + int i;
    +
    + /*
    + * Unhash all classes that were created by this module:
    + */
    + for (i = 0; i < CLASSHASH_SIZE; i++) {
    + head = classhash_table + i;
    + hlist_for_each_entry_rcu(class, head, hash_entry) {
    + if (!within(class->key, start, size) &&
    + !within(class->name, start, size))
    + continue;
    + zap_class(class);
    + }
    + }
    +}
    +
    /*
    * Used in module.c to remove lock classes from memory that is going to be
    * freed; and possibly re-used by other modules.
    @@ -4191,30 +4211,14 @@ static inline int within(const void *addr, void *start, unsigned long size)
    */
    void lockdep_free_key_range(void *start, unsigned long size)
    {
    - struct lock_class *class;
    - struct hlist_head *head;
    unsigned long flags;
    - int i;
    int locked;

    init_data_structures_once();

    raw_local_irq_save(flags);
    locked = graph_lock();
    -
    - /*
    - * Unhash all classes that were created by this module:
    - */
    - for (i = 0; i < CLASSHASH_SIZE; i++) {
    - head = classhash_table + i;
    - hlist_for_each_entry_rcu(class, head, hash_entry) {
    - if (within(class->key, start, size))
    - zap_class(class);
    - else if (within(class->name, start, size))
    - zap_class(class);
    - }
    - }
    -
    + __lockdep_free_key_range(start, size);
    if (locked)
    graph_unlock();
    raw_local_irq_restore(flags);
    @@ -4256,16 +4260,11 @@ static bool lock_class_cache_is_registered(struct lockdep_map *lock)
    return false;
    }

    -void lockdep_reset_lock(struct lockdep_map *lock)
    +/* The caller must hold the graph lock. Does not sleep. */
    +static void __lockdep_reset_lock(struct lockdep_map *lock)
    {
    struct lock_class *class;
    - unsigned long flags;
    - int j, locked;
    -
    - init_data_structures_once();
    -
    - raw_local_irq_save(flags);
    - locked = graph_lock();
    + int j;

    /*
    * Remove all classes this lock might have:
    @@ -4282,19 +4281,22 @@ void lockdep_reset_lock(struct lockdep_map *lock)
    * Debug check: in the end all mapped classes should
    * be gone.
    */
    - if (unlikely(lock_class_cache_is_registered(lock))) {
    - if (debug_locks_off_graph_unlock()) {
    - /*
    - * We all just reset everything, how did it match?
    - */
    - WARN_ON(1);
    - }
    - goto out_restore;
    - }
    + if (WARN_ON_ONCE(lock_class_cache_is_registered(lock)))
    + debug_locks_off();
    +}
    +
    +void lockdep_reset_lock(struct lockdep_map *lock)
    +{
    + unsigned long flags;
    + int locked;
    +
    + init_data_structures_once();
    +
    + raw_local_irq_save(flags);
    + locked = graph_lock();
    + __lockdep_reset_lock(lock);
    if (locked)
    graph_unlock();
    -
    -out_restore:
    raw_local_irq_restore(flags);
    }

    --
    2.20.0.rc2.403.gdbc3b29805-goog
    \
     
     \ /
      Last update: 2018-12-11 23:16    [W:2.673 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site