• Michal Hocko's avatar
    memcg: remove tasks/children test from mem_cgroup_force_empty() · f61c42a7
    Michal Hocko authored
    Tejun has correctly pointed out that tasks/children test in
    mem_cgroup_force_empty is not correct because there is no other locking
    which preserves this state throughout the rest of the function so both
    new tasks can join the group or new children groups can be added while
    somebody is writing to memory.force_empty. A new task would break
    mem_cgroup_reparent_charges expectation that all failures as described
    by mem_cgroup_force_empty_list are temporal and there is no way out.
    
    The main use case for the knob as described by
    Documentation/cgroups/memory.txt is to:
    "
      The typical use case for this interface is before calling rmdir().
      Because rmdir() moves all pages to parent, some out-of-use page caches can be
      moved to the parent. If you want to avoid that, force_empty will be useful.
    "
    
    This means that reparenting is not really required as rmdir will
    reparent pages implicitly from the safe context. If we remove it from
    mem_cgroup_force_empty then we are safe even with existing tasks because
    the number of reclaim attempts is bounded. Moreover the knob still does
    what the documentation claims (modulo reparenting which doesn't make any
    difference) and users might expect. Longterm we want to deprecate the
    whole knob and put the reparented pages to the tail of parent LRU during
    cgroup removal.
    
    tj: Removed unused variable @cgrp from mem_cgroup_force_empty()
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    f61c42a7
memory.txt 35.8 KB