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 a 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.
  */
 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);
        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:
         * 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);
 }