• Konstantin Khlebnikov's avatar
    sched/rt: Optimize checking group RT scheduler constraints · b4fb015e
    Konstantin Khlebnikov authored
    Group RT scheduler contains protection against setting zero runtime for
    cgroup with RT tasks. Right now function tg_set_rt_bandwidth() iterates
    over all CPU cgroups and calls tg_has_rt_tasks() for any cgroup which
    runtime is zero (not only for changed one). Default RT runtime is zero,
    thus tg_has_rt_tasks() will is called for almost at CPU cgroups.
    
    This protection already is slightly racy: runtime limit could be changed
    between cpu_cgroup_can_attach() and cpu_cgroup_attach() because changing
    cgroup attribute does not lock cgroup_mutex while attach does not lock
    rt_constraints_mutex. Changing task scheduler class also races with
    changing rt runtime: check in __sched_setscheduler() isn't protected.
    
    Function tg_has_rt_tasks() iterates over all threads in the system.
    This gives NR_CGROUPS * NR_TASKS operations under single tasklist_lock
    locked for read tg_set_rt_bandwidth(). Any concurrent attempt of locking
    tasklist_lock for write (for example fork) will stuck with disabled irqs.
    
    This patch makes two optimizations:
    1) Remove locking tasklist_lock and iterate only tasks in cgroup
    2) Call tg_has_rt_tasks() iff rt runtime changes from non-zero to zero
    
    All changed code is under CONFIG_RT_GROUP_SCHED.
    
    Testcase:
    
     # mkdir /sys/fs/cgroup/cpu/test{1..10000}
     # echo 0 | tee /sys/fs/cgroup/cpu/test*/cpu.rt_runtime_us
    
    At the same time without patch fork time will be >100ms:
    
     # perf trace -e clone --duration 100 stress-ng --fork 1
    
    Also remote ping will show timings >100ms caused by irq latency.
    Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Link: https://lkml.kernel.org/r/157996383820.4651.11292439232549211693.stgit@buzz
    b4fb015e
rt.c 64.7 KB