• T
    cgroup: use css_set->mg_tasks to track target tasks during migration · b3dc094e
    Tejun Heo 提交于
    Currently, while migrating tasks from one cgroup to another,
    cgroup_attach_task() builds a flex array of all target tasks;
    unfortunately, this has a couple issues.
    
    * Flex array has size limit.  On 64bit, struct task_and_cgroup is
      24bytes making the flex element limit around 87k.  It is a high
      number but not impossible to hit.  This means that the current
      cgroup implementation can't migrate a process with more than 87k
      threads.
    
    * Process migration involves memory allocation whose size is dependent
      on the number of threads the process has.  This means that cgroup
      core can't guarantee success or failure of multi-process migrations
      as memory allocation failure can happen in the middle.  This is in
      part because cgroup can't grab threadgroup locks of multiple
      processes at the same time, so when there are multiple processes to
      migrate, it is imposible to tell how many tasks are to be migrated
      beforehand.
    
      Note that this already affects cgroup_transfer_tasks().  cgroup
      currently cannot guarantee atomic success or failure of the
      operation.  It may fail in the middle and after such failure cgroup
      doesn't have enough information to roll back properly.  It just
      aborts with some tasks migrated and others not.
    
    To resolve the situation, this patch updates the migration path to use
    task->cg_list to track target tasks.  The previous patch already added
    css_set->mg_tasks and updated iterations in non-migration paths to
    include them during task migration.  This patch updates migration path
    to actually make use of it.
    
    Instead of putting onto a flex_array, each target task is moved from
    its css_set->tasks list to css_set->mg_tasks and the migration path
    keeps trace of all the source css_sets and the associated cgroups.
    Once all source css_sets are determined, the destination css_set for
    each is determined, linked to the matching source css_set and put on a
    separate list.
    
    To iterate the target tasks, migration path just needs to iterat
    through either the source or target css_sets, depending on whether
    migration has been committed or not, and the tasks on their ->mg_tasks
    lists.  cgroup_taskset is updated to contain the list_heads for source
    and target css_sets and the iteration cursor.  cgroup_taskset_*() are
    accordingly updated to walk through css_sets and their ->mg_tasks.
    
    This resolves the above listed issues with moderate additional
    complexity.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NLi Zefan <lizefan@huawei.com>
    b3dc094e
cgroup.h 25.9 KB