• Johannes Weiner's avatar
    psi: Optimize switching tasks inside shared cgroups · 36b238d5
    Johannes Weiner authored
    When switching tasks running on a CPU, the psi state of a cgroup
    containing both of these tasks does not change. Right now, we don't
    exploit that, and can perform many unnecessary state changes in nested
    hierarchies, especially when most activity comes from one leaf cgroup.
    
    This patch implements an optimization where we only update cgroups
    whose state actually changes during a task switch. These are all
    cgroups that contain one task but not the other, up to the first
    shared ancestor. When both tasks are in the same group, we don't need
    to update anything at all.
    
    We can identify the first shared ancestor by walking the groups of the
    incoming task until we see TSK_ONCPU set on the local CPU; that's the
    first group that also contains the outgoing task.
    
    The new psi_task_switch() is similar to psi_task_change(). To allow
    code reuse, move the task flag maintenance code into a new function
    and the poll/avg worker wakeups into the shared psi_group_change().
    Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200316191333.115523-3-hannes@cmpxchg.org
    36b238d5
psi.c 36.6 KB