lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 221/593] sched/uclamp: Fix locking around cpu_util_update_eff()
    Date
    From: Qais Yousef <qais.yousef@arm.com>

    [ Upstream commit 93b73858701fd01de26a4a874eb95f9b7156fd4b ]

    cpu_cgroup_css_online() calls cpu_util_update_eff() without holding the
    uclamp_mutex or rcu_read_lock() like other call sites, which is
    a mistake.

    The uclamp_mutex is required to protect against concurrent reads and
    writes that could update the cgroup hierarchy.

    The rcu_read_lock() is required to traverse the cgroup data structures
    in cpu_util_update_eff().

    Surround the caller with the required locks and add some asserts to
    better document the dependency in cpu_util_update_eff().

    Fixes: 7226017ad37a ("sched/uclamp: Fix a bug in propagating uclamp value in new cgroups")
    Reported-by: Quentin Perret <qperret@google.com>
    Signed-off-by: Qais Yousef <qais.yousef@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210510145032.1934078-3-qais.yousef@arm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/sched/core.c | 7 +++++++
    1 file changed, 7 insertions(+)

    diff --git a/kernel/sched/core.c b/kernel/sched/core.c
    index c561c3b993b5..d4bbead59ad2 100644
    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -7620,7 +7620,11 @@ static int cpu_cgroup_css_online(struct cgroup_subsys_state *css)

    #ifdef CONFIG_UCLAMP_TASK_GROUP
    /* Propagate the effective uclamp value for the new group */
    + mutex_lock(&uclamp_mutex);
    + rcu_read_lock();
    cpu_util_update_eff(css);
    + rcu_read_unlock();
    + mutex_unlock(&uclamp_mutex);
    #endif

    return 0;
    @@ -7710,6 +7714,9 @@ static void cpu_util_update_eff(struct cgroup_subsys_state *css)
    enum uclamp_id clamp_id;
    unsigned int clamps;

    + lockdep_assert_held(&uclamp_mutex);
    + SCHED_WARN_ON(!rcu_read_lock_held());
    +
    css_for_each_descendant_pre(css, top_css) {
    uc_parent = css_tg(css)->parent
    ? css_tg(css)->parent->uclamp : NULL;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 09:09    [W:4.113 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site