• Tejun Heo's avatar
    cgroup, cpuset: replace cpuset_post_attach_flush() with cgroup_subsys->post_attach callback · 5cf1cacb
    Tejun Heo authored
    Since e93ad19d ("cpuset: make mm migration asynchronous"), cpuset
    kicks off asynchronous NUMA node migration if necessary during task
    migration and flushes it from cpuset_post_attach_flush() which is
    called at the end of __cgroup_procs_write().  This is to avoid
    performing migration with cgroup_threadgroup_rwsem write-locked which
    can lead to deadlock through dependency on kworker creation.
    
    memcg has a similar issue with charge moving, so let's convert it to
    an official callback rather than the current one-off cpuset specific
    function.  This patch adds cgroup_subsys->post_attach callback and
    makes cpuset register cpuset_post_attach_flush() as its ->post_attach.
    
    The conversion is mostly one-to-one except that the new callback is
    called under cgroup_mutex.  This is to guarantee that no other
    migration operations are started before ->post_attach callbacks are
    finished.  cgroup_mutex is one of the outermost mutex in the system
    and has never been and shouldn't be a problem.  We can add specialized
    synchronization around __cgroup_procs_write() but I don't think
    there's any noticeable benefit.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: <stable@vger.kernel.org> # 4.4+ prerequisite for the next patch
    5cf1cacb
cgroup.c 172 KB