Merge tag 'mmc-v4.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
[cascardo/linux.git] / lib / debugobjects.c
index 519b5a1..a8e1260 100644 (file)
@@ -269,16 +269,15 @@ static void debug_print_object(struct debug_obj *obj, char *msg)
  * Try to repair the damage, so we have a better chance to get useful
  * debug output.
  */
-static int
-debug_object_fixup(int (*fixup)(void *addr, enum debug_obj_state state),
+static bool
+debug_object_fixup(bool (*fixup)(void *addr, enum debug_obj_state state),
                   void * addr, enum debug_obj_state state)
 {
-       int fixed = 0;
-
-       if (fixup)
-               fixed = fixup(addr, state);
-       debug_objects_fixups += fixed;
-       return fixed;
+       if (fixup && fixup(addr, state)) {
+               debug_objects_fixups++;
+               return true;
+       }
+       return false;
 }
 
 static void debug_object_is_on_stack(void *addr, int onstack)
@@ -416,7 +415,7 @@ int debug_object_activate(void *addr, struct debug_obj_descr *descr)
                        state = obj->state;
                        raw_spin_unlock_irqrestore(&db->lock, flags);
                        ret = debug_object_fixup(descr->fixup_activate, addr, state);
-                       return ret ? -EINVAL : 0;
+                       return ret ? 0 : -EINVAL;
 
                case ODEBUG_STATE_DESTROYED:
                        debug_print_object(obj, "activate");
@@ -432,14 +431,21 @@ int debug_object_activate(void *addr, struct debug_obj_descr *descr)
 
        raw_spin_unlock_irqrestore(&db->lock, flags);
        /*
-        * This happens when a static object is activated. We
-        * let the type specific code decide whether this is
-        * true or not.
+        * We are here when a static object is activated. We
+        * let the type specific code confirm whether this is
+        * true or not. if true, we just make sure that the
+        * static object is tracked in the object tracker. If
+        * not, this must be a bug, so we try to fix it up.
         */
-       if (debug_object_fixup(descr->fixup_activate, addr,
-                          ODEBUG_STATE_NOTAVAILABLE)) {
+       if (descr->is_static_object && descr->is_static_object(addr)) {
+               /* track this static object */
+               debug_object_init(addr, descr);
+               debug_object_activate(addr, descr);
+       } else {
                debug_print_object(&o, "activate");
-               return -EINVAL;
+               ret = debug_object_fixup(descr->fixup_activate, addr,
+                                       ODEBUG_STATE_NOTAVAILABLE);
+               return ret ? 0 : -EINVAL;
        }
        return 0;
 }
@@ -603,12 +609,18 @@ void debug_object_assert_init(void *addr, struct debug_obj_descr *descr)
 
                raw_spin_unlock_irqrestore(&db->lock, flags);
                /*
-                * Maybe the object is static.  Let the type specific
-                * code decide what to do.
+                * Maybe the object is static, and we let the type specific
+                * code confirm. Track this static object if true, else invoke
+                * fixup.
                 */
-               if (debug_object_fixup(descr->fixup_assert_init, addr,
-                                      ODEBUG_STATE_NOTAVAILABLE))
+               if (descr->is_static_object && descr->is_static_object(addr)) {
+                       /* Track this static object */
+                       debug_object_init(addr, descr);
+               } else {
                        debug_print_object(&o, "assert_init");
+                       debug_object_fixup(descr->fixup_assert_init, addr,
+                                          ODEBUG_STATE_NOTAVAILABLE);
+               }
                return;
        }
 
@@ -793,11 +805,18 @@ struct self_test {
 
 static __initdata struct debug_obj_descr descr_type_test;
 
+static bool __init is_static_object(void *addr)
+{
+       struct self_test *obj = addr;
+
+       return obj->static_init;
+}
+
 /*
  * fixup_init is called when:
  * - an active object is initialized
  */
-static int __init fixup_init(void *addr, enum debug_obj_state state)
+static bool __init fixup_init(void *addr, enum debug_obj_state state)
 {
        struct self_test *obj = addr;
 
@@ -805,37 +824,31 @@ static int __init fixup_init(void *addr, enum debug_obj_state state)
        case ODEBUG_STATE_ACTIVE:
                debug_object_deactivate(obj, &descr_type_test);
                debug_object_init(obj, &descr_type_test);
-               return 1;
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
 /*
  * fixup_activate is called when:
  * - an active object is activated
- * - an unknown object is activated (might be a statically initialized object)
+ * - an unknown non-static object is activated
  */
-static int __init fixup_activate(void *addr, enum debug_obj_state state)
+static bool __init fixup_activate(void *addr, enum debug_obj_state state)
 {
        struct self_test *obj = addr;
 
        switch (state) {
        case ODEBUG_STATE_NOTAVAILABLE:
-               if (obj->static_init == 1) {
-                       debug_object_init(obj, &descr_type_test);
-                       debug_object_activate(obj, &descr_type_test);
-                       return 0;
-               }
-               return 1;
-
+               return true;
        case ODEBUG_STATE_ACTIVE:
                debug_object_deactivate(obj, &descr_type_test);
                debug_object_activate(obj, &descr_type_test);
-               return 1;
+               return true;
 
        default:
-               return 0;
+               return false;
        }
 }
 
@@ -843,7 +856,7 @@ static int __init fixup_activate(void *addr, enum debug_obj_state state)
  * fixup_destroy is called when:
  * - an active object is destroyed
  */
-static int __init fixup_destroy(void *addr, enum debug_obj_state state)
+static bool __init fixup_destroy(void *addr, enum debug_obj_state state)
 {
        struct self_test *obj = addr;
 
@@ -851,9 +864,9 @@ static int __init fixup_destroy(void *addr, enum debug_obj_state state)
        case ODEBUG_STATE_ACTIVE:
                debug_object_deactivate(obj, &descr_type_test);
                debug_object_destroy(obj, &descr_type_test);
-               return 1;
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
@@ -861,7 +874,7 @@ static int __init fixup_destroy(void *addr, enum debug_obj_state state)
  * fixup_free is called when:
  * - an active object is freed
  */
-static int __init fixup_free(void *addr, enum debug_obj_state state)
+static bool __init fixup_free(void *addr, enum debug_obj_state state)
 {
        struct self_test *obj = addr;
 
@@ -869,9 +882,9 @@ static int __init fixup_free(void *addr, enum debug_obj_state state)
        case ODEBUG_STATE_ACTIVE:
                debug_object_deactivate(obj, &descr_type_test);
                debug_object_free(obj, &descr_type_test);
-               return 1;
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
@@ -917,6 +930,7 @@ out:
 
 static __initdata struct debug_obj_descr descr_type_test = {
        .name                   = "selftest",
+       .is_static_object       = is_static_object,
        .fixup_init             = fixup_init,
        .fixup_activate         = fixup_activate,
        .fixup_destroy          = fixup_destroy,