• Daniel Xu's avatar
    cgroupfs: Support user xattrs · 38aca307
    Daniel Xu authored
    This patch turns on xattr support for cgroupfs. This is useful for
    letting non-root owners of delegated subtrees attach metadata to
    cgroups.
    
    One use case is for subtree owners to tell a userspace out of memory
    killer to bias away from killing specific subtrees.
    
    Tests:
    
        [/sys/fs/cgroup]# for i in $(seq 0 130); \
            do setfattr workload.slice -n user.name$i -v wow; done
        setfattr: workload.slice: No space left on device
        setfattr: workload.slice: No space left on device
        setfattr: workload.slice: No space left on device
    
        [/sys/fs/cgroup]# for i in $(seq 0 130); \
            do setfattr workload.slice --remove user.name$i; done
        setfattr: workload.slice: No such attribute
        setfattr: workload.slice: No such attribute
        setfattr: workload.slice: No such attribute
    
        [/sys/fs/cgroup]# for i in $(seq 0 130); \
            do setfattr workload.slice -n user.name$i -v wow; done
        setfattr: workload.slice: No space left on device
        setfattr: workload.slice: No space left on device
        setfattr: workload.slice: No space left on device
    
    `seq 0 130` is inclusive, and 131 - 128 = 3, which is the number of
    errors we expect to see.
    
        [/data]# cat testxattr.c
        #include <sys/types.h>
        #include <sys/xattr.h>
        #include <stdio.h>
        #include <stdlib.h>
    
        int main() {
          char name[256];
          char *buf = malloc(64 << 10);
          if (!buf) {
            perror("malloc");
            return 1;
          }
    
          for (int i = 0; i < 4; ++i) {
            snprintf(name, 256, "user.bigone%d", i);
            if (setxattr("/sys/fs/cgroup/system.slice", name, buf,
                         64 << 10, 0)) {
              printf("setxattr failed on iteration=%d\n", i);
              return 1;
            }
          }
    
          return 0;
        }
    
        [/data]# ./a.out
        setxattr failed on iteration=2
    
        [/data]# ./a.out
        setxattr failed on iteration=0
    
        [/sys/fs/cgroup]# setfattr -x user.bigone0 system.slice/
        [/sys/fs/cgroup]# setfattr -x user.bigone1 system.slice/
    
        [/data]# ./a.out
        setxattr failed on iteration=2
    Signed-off-by: default avatarDaniel Xu <dxu@dxuuu.xyz>
    Acked-by: default avatarChris Down <chris@chrisdown.name>
    Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    38aca307
cgroup.c 171 KB