lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 633/862] cgroup/cpuset: Enable update_tasks_cpumask() on top_cpuset
    Date
    From: Waiman Long <longman@redhat.com>

    [ Upstream commit ec5fbdfb99d18482619ac42605cb80fbb56068ee ]

    Previously, update_tasks_cpumask() is not supposed to be called with
    top cpuset. With cpuset partition that takes CPUs away from the top
    cpuset, adjusting the cpus_mask of the tasks in the top cpuset is
    necessary. Percpu kthreads, however, are ignored.

    Fixes: ee8dde0cd2ce ("cpuset: Add new v2 cpuset.sched.partition flag")
    Signed-off-by: Waiman Long <longman@redhat.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/cgroup/cpuset.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
    index 1f3a55297f39..50bf837571ac 100644
    --- a/kernel/cgroup/cpuset.c
    +++ b/kernel/cgroup/cpuset.c
    @@ -33,6 +33,7 @@
    #include <linux/interrupt.h>
    #include <linux/kernel.h>
    #include <linux/kmod.h>
    +#include <linux/kthread.h>
    #include <linux/list.h>
    #include <linux/mempolicy.h>
    #include <linux/mm.h>
    @@ -1127,10 +1128,18 @@ static void update_tasks_cpumask(struct cpuset *cs)
    {
    struct css_task_iter it;
    struct task_struct *task;
    + bool top_cs = cs == &top_cpuset;

    css_task_iter_start(&cs->css, 0, &it);
    - while ((task = css_task_iter_next(&it)))
    + while ((task = css_task_iter_next(&it))) {
    + /*
    + * Percpu kthreads in top_cpuset are ignored
    + */
    + if (top_cs && (task->flags & PF_KTHREAD) &&
    + kthread_is_per_cpu(task))
    + continue;
    set_cpus_allowed_ptr(task, cs->effective_cpus);
    + }
    css_task_iter_end(&it);
    }

    @@ -2092,12 +2101,7 @@ static int update_prstate(struct cpuset *cs, int new_prs)
    update_flag(CS_CPU_EXCLUSIVE, cs, 0);
    }

    - /*
    - * Update cpumask of parent's tasks except when it is the top
    - * cpuset as some system daemons cannot be mapped to other CPUs.
    - */
    - if (parent != &top_cpuset)
    - update_tasks_cpumask(parent);
    + update_tasks_cpumask(parent);

    if (parent->child_ecpus_count)
    update_sibling_cpumasks(parent, cs, &tmpmask);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 15:34    [W:2.545 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site