lkml.org 
[lkml]   [2021]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH -v3 5/9] workqueue: Tag bound workers with KTHREAD_IS_PER_CPU
    Mark the per-cpu workqueue workers as KTHREAD_IS_PER_CPU.

    Workqueues have unfortunate semantics in that per-cpu workers are not
    default flushed and parked during hotplug, however a subset does
    manual flush on hotplug and hard relies on them for correctness.

    Therefore play silly games..

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/workqueue.c | 11 +++++++++--
    1 file changed, 9 insertions(+), 2 deletions(-)

    --- a/kernel/workqueue.c
    +++ b/kernel/workqueue.c
    @@ -1861,6 +1861,8 @@ static void worker_attach_to_pool(struct
    */
    if (pool->flags & POOL_DISASSOCIATED)
    worker->flags |= WORKER_UNBOUND;
    + else
    + kthread_set_per_cpu(worker->task, pool->cpu);

    list_add_tail(&worker->node, &pool->workers);
    worker->pool = pool;
    @@ -1883,6 +1885,7 @@ static void worker_detach_from_pool(stru

    mutex_lock(&wq_pool_attach_mutex);

    + kthread_set_per_cpu(worker->task, -1);
    list_del(&worker->node);
    worker->pool = NULL;

    @@ -4919,8 +4922,10 @@ static void unbind_workers(int cpu)

    raw_spin_unlock_irq(&pool->lock);

    - for_each_pool_worker(worker, pool)
    + for_each_pool_worker(worker, pool) {
    + kthread_set_per_cpu(worker->task, -1);
    WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
    + }

    mutex_unlock(&wq_pool_attach_mutex);

    @@ -4972,9 +4977,11 @@ static void rebind_workers(struct worker
    * of all workers first and then clear UNBOUND. As we're called
    * from CPU_ONLINE, the following shouldn't fail.
    */
    - for_each_pool_worker(worker, pool)
    + for_each_pool_worker(worker, pool) {
    + kthread_set_per_cpu(worker->task, pool->cpu);
    WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
    pool->attrs->cpumask) < 0);
    + }

    raw_spin_lock_irq(&pool->lock);


    \
     
     \ /
      Last update: 2021-01-21 11:41    [W:2.456 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site