Loading kernel/workqueue.c +18 −11 Original line number Diff line number Diff line Loading @@ -3437,6 +3437,23 @@ static int worker_thread(void *__worker) goto woke_up; } static bool assign_rescuer_work(struct pool_workqueue *pwq, struct worker *rescuer) { struct worker_pool *pool = pwq->pool; struct work_struct *work, *n; /* * Slurp in all works issued via this workqueue and * process'em. */ list_for_each_entry_safe(work, n, &pool->worklist, entry) { if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n)) pwq->stats[PWQ_STAT_RESCUED]++; } return !list_empty(&rescuer->scheduled); } /** * rescuer_thread - the rescuer thread function * @__rescuer: self Loading Loading @@ -3491,7 +3508,6 @@ static int rescuer_thread(void *__rescuer) struct pool_workqueue *pwq = list_first_entry(&wq->maydays, struct pool_workqueue, mayday_node); struct worker_pool *pool = pwq->pool; struct work_struct *work, *n; __set_current_state(TASK_RUNNING); list_del_init(&pwq->mayday_node); Loading @@ -3502,18 +3518,9 @@ static int rescuer_thread(void *__rescuer) raw_spin_lock_irq(&pool->lock); /* * Slurp in all works issued via this workqueue and * process'em. */ WARN_ON_ONCE(!list_empty(&rescuer->scheduled)); list_for_each_entry_safe(work, n, &pool->worklist, entry) { if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n)) pwq->stats[PWQ_STAT_RESCUED]++; } if (!list_empty(&rescuer->scheduled)) { if (assign_rescuer_work(pwq, rescuer)) { process_scheduled_works(rescuer); /* Loading Loading
kernel/workqueue.c +18 −11 Original line number Diff line number Diff line Loading @@ -3437,6 +3437,23 @@ static int worker_thread(void *__worker) goto woke_up; } static bool assign_rescuer_work(struct pool_workqueue *pwq, struct worker *rescuer) { struct worker_pool *pool = pwq->pool; struct work_struct *work, *n; /* * Slurp in all works issued via this workqueue and * process'em. */ list_for_each_entry_safe(work, n, &pool->worklist, entry) { if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n)) pwq->stats[PWQ_STAT_RESCUED]++; } return !list_empty(&rescuer->scheduled); } /** * rescuer_thread - the rescuer thread function * @__rescuer: self Loading Loading @@ -3491,7 +3508,6 @@ static int rescuer_thread(void *__rescuer) struct pool_workqueue *pwq = list_first_entry(&wq->maydays, struct pool_workqueue, mayday_node); struct worker_pool *pool = pwq->pool; struct work_struct *work, *n; __set_current_state(TASK_RUNNING); list_del_init(&pwq->mayday_node); Loading @@ -3502,18 +3518,9 @@ static int rescuer_thread(void *__rescuer) raw_spin_lock_irq(&pool->lock); /* * Slurp in all works issued via this workqueue and * process'em. */ WARN_ON_ONCE(!list_empty(&rescuer->scheduled)); list_for_each_entry_safe(work, n, &pool->worklist, entry) { if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n)) pwq->stats[PWQ_STAT_RESCUED]++; } if (!list_empty(&rescuer->scheduled)) { if (assign_rescuer_work(pwq, rescuer)) { process_scheduled_works(rescuer); /* Loading