Merge branches 'pm-sleep' and 'pm-tools'
[cascardo/linux.git] / kernel / workqueue.c
index 5f5068e..d12bd95 100644 (file)
@@ -433,54 +433,28 @@ static void *work_debug_hint(void *addr)
        return ((struct work_struct *) addr)->func;
 }
 
-/*
- * fixup_init is called when:
- * - an active object is initialized
- */
-static int work_fixup_init(void *addr, enum debug_obj_state state)
+static bool work_is_static_object(void *addr)
 {
        struct work_struct *work = addr;
 
-       switch (state) {
-       case ODEBUG_STATE_ACTIVE:
-               cancel_work_sync(work);
-               debug_object_init(work, &work_debug_descr);
-               return 1;
-       default:
-               return 0;
-       }
+       return test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work));
 }
 
 /*
- * fixup_activate is called when:
- * - an active object is activated
- * - an unknown object is activated (might be a statically initialized object)
+ * fixup_init is called when:
+ * - an active object is initialized
  */
-static int work_fixup_activate(void *addr, enum debug_obj_state state)
+static bool work_fixup_init(void *addr, enum debug_obj_state state)
 {
        struct work_struct *work = addr;
 
        switch (state) {
-
-       case ODEBUG_STATE_NOTAVAILABLE:
-               /*
-                * This is not really a fixup. The work struct was
-                * statically initialized. We just make sure that it
-                * is tracked in the object tracker.
-                */
-               if (test_bit(WORK_STRUCT_STATIC_BIT, work_data_bits(work))) {
-                       debug_object_init(work, &work_debug_descr);
-                       debug_object_activate(work, &work_debug_descr);
-                       return 0;
-               }
-               WARN_ON_ONCE(1);
-               return 0;
-
        case ODEBUG_STATE_ACTIVE:
-               WARN_ON(1);
-
+               cancel_work_sync(work);
+               debug_object_init(work, &work_debug_descr);
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
@@ -488,7 +462,7 @@ static int work_fixup_activate(void *addr, enum debug_obj_state state)
  * fixup_free is called when:
  * - an active object is freed
  */
-static int work_fixup_free(void *addr, enum debug_obj_state state)
+static bool work_fixup_free(void *addr, enum debug_obj_state state)
 {
        struct work_struct *work = addr;
 
@@ -496,17 +470,17 @@ static int work_fixup_free(void *addr, enum debug_obj_state state)
        case ODEBUG_STATE_ACTIVE:
                cancel_work_sync(work);
                debug_object_free(work, &work_debug_descr);
-               return 1;
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
 static struct debug_obj_descr work_debug_descr = {
        .name           = "work_struct",
        .debug_hint     = work_debug_hint,
+       .is_static_object = work_is_static_object,
        .fixup_init     = work_fixup_init,
-       .fixup_activate = work_fixup_activate,
        .fixup_free     = work_fixup_free,
 };
 
@@ -4395,8 +4369,8 @@ static void show_pwq(struct pool_workqueue *pwq)
 /**
  * show_workqueue_state - dump workqueue state
  *
- * Called from a sysrq handler and prints out all busy workqueues and
- * pools.
+ * Called from a sysrq handler or try_to_freeze_tasks() and prints out
+ * all busy workqueues and pools.
  */
 void show_workqueue_state(void)
 {
@@ -4626,15 +4600,11 @@ static void restore_unbound_workers_cpumask(struct worker_pool *pool, int cpu)
        if (!cpumask_test_cpu(cpu, pool->attrs->cpumask))
                return;
 
-       /* is @cpu the only online CPU? */
        cpumask_and(&cpumask, pool->attrs->cpumask, cpu_online_mask);
-       if (cpumask_weight(&cpumask) != 1)
-               return;
 
        /* as we're called from CPU_ONLINE, the following shouldn't fail */
        for_each_pool_worker(worker, pool)
-               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
-                                                 pool->attrs->cpumask) < 0);
+               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, &cpumask) < 0);
 }
 
 /*