• Yutian Yang's avatar
    memcg: charge fs_context and legacy_fs_context · bb902cb4
    Yutian Yang authored
    This patch adds accounting flags to fs_context and legacy_fs_context
    allocation sites so that kernel could correctly charge these objects.
    
    We have written a PoC to demonstrate the effect of the missing-charging
    bugs.  The PoC takes around 1,200MB unaccounted memory, while it is
    charged for only 362MB memory usage.  We evaluate the PoC on QEMU x86_64
    v5.2.90 + Linux kernel v5.10.19 + Debian buster.  All the limitations
    including ulimits and sysctl variables are set as default.  Specifically,
    the hard NOFILE limit and nr_open in sysctl are both 1,048,576.
    
    /*------------------------- POC code ----------------------------*/
    
    #define _GNU_SOURCE
    #include <sys/types.h>
    #include <sys/file.h>
    #include <time.h>
    #include <sys/wait.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <signal.h>
    #include <sched.h>
    #include <fcntl.h>
    #include <linux/mount.h>
    
    #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                            } while (0)
    
    #define STACK_SIZE (8 * 1024)
    #ifndef __NR_fsopen
    #define __NR_fsopen 430
    #endif
    static inline int fsopen(const char *fs_name, unsigned int flags)
    {
            return syscall(__NR_fsopen, fs_name, flags);
    }
    
    static char thread_stack[512][STACK_SIZE];
    
    int thread_fn(void* arg)
    {
      for (int i = 0; i< 800000; ++i) {
        int fsfd = fsopen("nfs", FSOPEN_CLOEXEC);
        if (fsfd == -1) {
          errExit("fsopen");
        }
      }
      while(1);
      return 0;
    }
    
    int main(int argc, char *argv[]) {
      int thread_pid;
      for (int i = 0; i < 1; ++i) {
        thread_pid = clone(thread_fn, thread_stack[i] + STACK_SIZE, \
          SIGCHLD, NULL);
      }
      while(1);
      return 0;
    }
    
    /*-------------------------- end --------------------------------*/
    
    Link: https://lkml.kernel.org/r/1626517201-24086-1-git-send-email-nglaive@gmail.comSigned-off-by: default avatarYutian Yang <nglaive@gmail.com>
    Reviewed-by: default avatarShakeel Butt <shakeelb@google.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: <shenwenbo@zju.edu.cn>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    bb902cb4
fs_context.c 17.7 KB