Please try this one instead.  Thanks.

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index a2dccfc..75cdbc2 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -1224,6 +1224,8 @@ __acquires(&gcwq->lock)
 {
        struct global_cwq *gcwq = worker->gcwq;
        struct task_struct *task = worker->task;
+       static unsigned int cnt;
+       int rc;

        while (true) {
                /*
@@ -1232,8 +1234,11 @@ __acquires(&gcwq->lock)
                 * it races with cpu hotunplug operation.  Verify
                 * against GCWQ_DISASSOCIATED.
                 */
-               if (!(gcwq->flags & GCWQ_DISASSOCIATED))
-                       set_cpus_allowed_ptr(task, get_cpu_mask(gcwq->cpu));
+               if (!(gcwq->flags & GCWQ_DISASSOCIATED)) {
+                       rc = set_cpus_allowed_ptr(task, 
get_cpu_mask(gcwq->cpu));
+                       if (rc && ++cnt < 10)
+                               printk("XXX set_cpus_allowed_ptr() failed w/ 
%d\n", rc);
+               }

                spin_lock_irq(&gcwq->lock);
                if (gcwq->flags & GCWQ_DISASSOCIATED)
@@ -1985,13 +1990,16 @@ repeat:
                struct cpu_workqueue_struct *cwq = get_cwq(tcpu, wq);
                struct global_cwq *gcwq = cwq->gcwq;
                struct work_struct *work, *n;
+               bool bound;

                __set_current_state(TASK_RUNNING);
                mayday_clear_cpu(cpu, wq->mayday_mask);

                /* migrate to the target cpu if possible */
                rescuer->gcwq = gcwq;
-               worker_maybe_bind_and_lock(rescuer);
+               printk("XXX %s: rescuer dispatching to cpu%u\n", wq->name, 
gcwq->cpu);
+               bound = worker_maybe_bind_and_lock(rescuer);
+               printk("XXX %s: rescuer done binding, bound=%d\n", wq->name, 
bound);

                /*
                 * Slurp in all works issued via this workqueue and
@@ -3558,8 +3566,7 @@ static int __init init_workqueues(void)
                spin_lock_init(&gcwq->lock);
                INIT_LIST_HEAD(&gcwq->worklist);
                gcwq->cpu = cpu;
-               if (cpu == WORK_CPU_UNBOUND)
-                       gcwq->flags |= GCWQ_DISASSOCIATED;
+               gcwq->flags |= GCWQ_DISASSOCIATED;

                INIT_LIST_HEAD(&gcwq->idle_list);
                for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)
@@ -3583,6 +3590,8 @@ static int __init init_workqueues(void)
                struct global_cwq *gcwq = get_gcwq(cpu);
                struct worker *worker;

+               if (cpu != WORK_CPU_UNBOUND)
+                       gcwq->flags &= ~GCWQ_DISASSOCIATED;
                worker = create_worker(gcwq, true);
                BUG_ON(!worker);
                spin_lock_irq(&gcwq->lock);

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to