workqueue: keep track of the flushing task and pool manager
authorTejun Heo <tj@kernel.org>
Mon, 9 Mar 2015 13:22:28 +0000 (09:22 -0400)
committerTejun Heo <tj@kernel.org>
Mon, 9 Mar 2015 13:22:28 +0000 (09:22 -0400)
Add wq_barrier->task and worker_pool->manager to keep track of the
flushing task and pool manager respectively.  These are purely
informational and will be used to implement sysrq dump of workqueues.

Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c

index 6b9b0dc3dea50269a85266509687ad9e69c5392f..0c329a6f0c5187d10f460d0c98d8f8325c427190 100644 (file)
@@ -159,6 +159,7 @@ struct worker_pool {
 
        /* see manage_workers() for details on the two manager mutexes */
        struct mutex            manager_arb;    /* manager arbitration */
+       struct worker           *manager;       /* L: purely informational */
        struct mutex            attach_mutex;   /* attach/detach exclusion */
        struct list_head        workers;        /* A: attached workers */
        struct completion       *detach_completion; /* all workers detached */
@@ -1918,9 +1919,11 @@ static bool manage_workers(struct worker *worker)
         */
        if (!mutex_trylock(&pool->manager_arb))
                return false;
+       pool->manager = worker;
 
        maybe_create_worker(pool);
 
+       pool->manager = NULL;
        mutex_unlock(&pool->manager_arb);
        return true;
 }
@@ -2310,6 +2313,7 @@ repeat:
 struct wq_barrier {
        struct work_struct      work;
        struct completion       done;
+       struct task_struct      *task;  /* purely informational */
 };
 
 static void wq_barrier_func(struct work_struct *work)
@@ -2358,6 +2362,7 @@ static void insert_wq_barrier(struct pool_workqueue *pwq,
        INIT_WORK_ONSTACK(&barr->work, wq_barrier_func);
        __set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work));
        init_completion(&barr->done);
+       barr->task = current;
 
        /*
         * If @target is currently being executed, schedule the