• Li Zefan's avatar
    cgroup: remove synchronize_rcu() from cgroup_attach_{task|proc}() · 5d65bc0c
    Li Zefan authored
    These 2 syncronize_rcu()s make attaching a task to a cgroup
    quite slow, and it can't be ignored in some situations.
    
    A real case from Colin Cross: Android uses cgroups heavily to
    manage thread priorities, putting threads in a background group
    with reduced cpu.shares when they are not visible to the user,
    and in a foreground group when they are. Some RPCs from foreground
    threads to background threads will temporarily move the background
    thread into the foreground group for the duration of the RPC.
    This results in many calls to cgroup_attach_task.
    
    In cgroup_attach_task() it's task->cgroups that is protected by RCU,
    and put_css_set() calls kfree_rcu() to free it.
    
    If we remove this synchronize_rcu(), there can be threads in RCU-read
    sections accessing their old cgroup via current->cgroups with
    concurrent rmdir operation, but this is safe.
    
     # time for ((i=0; i<50; i++)) { echo $$ > /mnt/sub/tasks; echo $$ > /mnt/tasks; }
    
    real    0m2.524s
    user    0m0.008s
    sys     0m0.004s
    
    With this patch:
    
    real    0m0.004s
    user    0m0.004s
    sys     0m0.000s
    
    tj: These synchronize_rcu()s are utterly confused.  synchornize_rcu()
        necessarily has to come between two operations to guarantee that
        the changes made by the former operation are visible to all rcu
        readers before proceeding to the latter operation.  Here,
        synchornize_rcu() are at the end of attach operations with nothing
        beyond it.  Its only effect would be delaying completion of
        write(2) to sysfs tasks/procs files until all rcu readers see the
        change, which doesn't mean anything.
    Signed-off-by: default avatarLi Zefan <lizefan@huawei.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarColin Cross <ccross@google.com>
    5d65bc0c
cgroup.c 148 KB