• T
    cgroup: Implement css_task_iter_skip() · 370b9e63
    Tejun Heo 提交于
    commit b636fd38dc40113f853337a7d2a6885ad23b8811 upstream.
    
    When a task is moved out of a cset, task iterators pointing to the
    task are advanced using the normal css_task_iter_advance() call.  This
    is fine but we'll be tracking dying tasks on csets and thus moving
    tasks from cset->tasks to (to be added) cset->dying_tasks.  When we
    remove a task from cset->tasks, if we advance the iterators, they may
    move over to the next cset before we had the chance to add the task
    back on the dying list, which can allow the task to escape iteration.
    
    This patch separates out skipping from advancing.  Skipping only moves
    the affected iterators to the next pointer rather than fully advancing
    it and the following advancing will recognize that the cursor has
    already been moved forward and do the rest of advancing.  This ensures
    that when a task moves from one list to another in its cset, as long
    as it moves in the right direction, it's always visible to iteration.
    
    This doesn't cause any visible behavior changes.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    370b9e63
cgroup.c 158.6 KB