• Tejun Heo's avatar
    cgroup: fix CSS_TASK_ITER_PROCS · e9d81a1b
    Tejun Heo authored
    CSS_TASK_ITER_PROCS implements process-only iteration by making
    css_task_iter_advance() skip tasks which aren't threadgroup leaders;
    however, when an iteration is started css_task_iter_start() calls the
    inner helper function css_task_iter_advance_css_set() instead of
    css_task_iter_advance().  As the helper doesn't have the skip logic,
    when the first task to visit is a non-leader thread, it doesn't get
    skipped correctly as shown in the following example.
    
      # ps -L 2030
        PID   LWP TTY      STAT   TIME COMMAND
       2030  2030 pts/0    Sl+    0:00 ./test-thread
       2030  2031 pts/0    Sl+    0:00 ./test-thread
      # mkdir -p /sys/fs/cgroup/x/a/b
      # echo threaded > /sys/fs/cgroup/x/a/cgroup.type
      # echo threaded > /sys/fs/cgroup/x/a/b/cgroup.type
      # echo 2030 > /sys/fs/cgroup/x/a/cgroup.procs
      # cat /sys/fs/cgroup/x/a/cgroup.threads
      2030
      2031
      # cat /sys/fs/cgroup/x/cgroup.procs
      2030
      # echo 2030 > /sys/fs/cgroup/x/a/b/cgroup.threads
      # cat /sys/fs/cgroup/x/cgroup.procs
      2031
      2030
    
    The last read of cgroup.procs is incorrectly showing non-leader 2031
    in cgroup.procs output.
    
    This can be fixed by updating css_task_iter_advance() to handle the
    first advance and css_task_iters_tart() to call
    css_task_iter_advance() instead of the inner helper.  After the fix,
    the same commands result in the following (correct) result:
    
      # ps -L 2062
        PID   LWP TTY      STAT   TIME COMMAND
       2062  2062 pts/0    Sl+    0:00 ./test-thread
       2062  2063 pts/0    Sl+    0:00 ./test-thread
      # mkdir -p /sys/fs/cgroup/x/a/b
      # echo threaded > /sys/fs/cgroup/x/a/cgroup.type
      # echo threaded > /sys/fs/cgroup/x/a/b/cgroup.type
      # echo 2062 > /sys/fs/cgroup/x/a/cgroup.procs
      # cat /sys/fs/cgroup/x/a/cgroup.threads
      2062
      2063
      # cat /sys/fs/cgroup/x/cgroup.procs
      2062
      # echo 2062 > /sys/fs/cgroup/x/a/b/cgroup.threads
      # cat /sys/fs/cgroup/x/cgroup.procs
      2062
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatar"Michael Kerrisk (man-pages)" <mtk.manpages@gmail.com>
    Fixes: 8cfd8147 ("cgroup: implement cgroup v2 thread support")
    Cc: stable@vger.kernel.org # v4.14+
    e9d81a1b
cgroup.c 159 KB