lkml.org 
[lkml]   [2021]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 285/323] sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain()
    Date
    From: Vincent Donnefort <vincent.donnefort@arm.com>

    [ Upstream commit 42dc938a590c96eeb429e1830123fef2366d9c80 ]

    Nothing protects the access to the per_cpu variable sd_llc_id. When testing
    the same CPU (i.e. this_cpu == that_cpu), a race condition exists with
    update_top_cache_domain(). One scenario being:

    CPU1 CPU2
    ==================================================================

    per_cpu(sd_llc_id, CPUX) => 0
    partition_sched_domains_locked()
    detach_destroy_domains()
    cpus_share_cache(CPUX, CPUX) update_top_cache_domain(CPUX)
    per_cpu(sd_llc_id, CPUX) => 0
    per_cpu(sd_llc_id, CPUX) = CPUX
    per_cpu(sd_llc_id, CPUX) => CPUX
    return false

    ttwu_queue_cond() wouldn't catch smp_processor_id() == cpu and the result
    is a warning triggered from ttwu_queue_wakelist().

    Avoid a such race in cpus_share_cache() by always returning true when
    this_cpu == that_cpu.

    Fixes: 518cd6234178 ("sched: Only queue remote wakeups when crossing cache boundaries")
    Reported-by: Jing-Ting Wu <jing-ting.wu@mediatek.com>
    Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Valentin Schneider <valentin.schneider@arm.com>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Link: https://lore.kernel.org/r/20211104175120.857087-1-vincent.donnefort@arm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/sched/core.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/kernel/sched/core.c b/kernel/sched/core.c
    index 013b1c6cb4ed9..32af895bd86b3 100644
    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -1821,6 +1821,9 @@ out:

    bool cpus_share_cache(int this_cpu, int that_cpu)
    {
    + if (this_cpu == that_cpu)
    + return true;
    +
    return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu);
    }
    #endif /* CONFIG_SMP */
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-24 14:14    [W:4.313 / U:1.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site