Merge tag 'clone3-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2019 17:09:44 +0000 (10:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2019 17:09:44 +0000 (10:09 -0700)
Pull clone3 system call from Christian Brauner:
 "This adds the clone3 syscall which is an extensible successor to clone
  after we snagged the last flag with CLONE_PIDFD during the 5.2 merge
  window for clone(). It cleanly supports all of the flags from clone()
  and thus all legacy workloads.

  There are few user visible differences between clone3 and clone.
  First, CLONE_DETACHED will cause EINVAL with clone3 so we can reuse
  this flag. Second, the CSIGNAL flag is deprecated and will cause
  EINVAL to be reported. It is superseeded by a dedicated "exit_signal"
  argument in struct clone_args thus freeing up even more flags. And
  third, clone3 gives CLONE_PIDFD a dedicated return argument in struct
  clone_args instead of abusing CLONE_PARENT_SETTID's parent_tidptr
  argument.

  The clone3 uapi is designed to be easy to handle on 32- and 64 bit:

    /* uapi */
    struct clone_args {
            __aligned_u64 flags;
            __aligned_u64 pidfd;
            __aligned_u64 child_tid;
            __aligned_u64 parent_tid;
            __aligned_u64 exit_signal;
            __aligned_u64 stack;
            __aligned_u64 stack_size;
            __aligned_u64 tls;
    };

  and a separate kernel struct is used that uses proper kernel typing:

    /* kernel internal */
    struct kernel_clone_args {
            u64 flags;
            int __user *pidfd;
            int __user *child_tid;
            int __user *parent_tid;
            int exit_signal;
            unsigned long stack;
            unsigned long stack_size;
            unsigned long tls;
    };

  The system call comes with a size argument which enables the kernel to
  detect what version of clone_args userspace is passing in. clone3
  validates that any additional bytes a given kernel does not know about
  are set to zero and that the size never exceeds a page.

  A nice feature is that this patchset allowed us to cleanup and
  simplify various core kernel codepaths in kernel/fork.c by making the
  internal _do_fork() function take struct kernel_clone_args even for
  legacy clone().

  This patch also unblocks the time namespace patchset which wants to
  introduce a new CLONE_TIMENS flag.

  Note, that clone3 has only been wired up for x86{_32,64}, arm{64}, and
  xtensa. These were the architectures that did not require special
  massaging.

  Other architectures treat fork-like system calls individually and
  after some back and forth neither Arnd nor I felt confident that we
  dared to add clone3 unconditionally to all architectures. We agreed to
  leave this up to individual architecture maintainers. This is why
  there's an additional patch that introduces __ARCH_WANT_SYS_CLONE3
  which any architecture can set once it has implemented support for
  clone3. The patch also adds a cond_syscall(clone3) for architectures
  such as nios2 or h8300 that generate their syscall table by simply
  including asm-generic/unistd.h. The hope is to get rid of
  __ARCH_WANT_SYS_CLONE3 and cond_syscall() rather soon"

* tag 'clone3-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux:
  arch: handle arches who do not yet define clone3
  arch: wire-up clone3() syscall
  fork: add clone3

12 files changed:
1  2 
arch/arm/include/asm/unistd.h
arch/arm/tools/syscall.tbl
arch/arm64/include/asm/unistd.h
arch/arm64/include/asm/unistd32.h
arch/microblaze/kernel/syscalls/syscall.tbl
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
arch/xtensa/kernel/syscalls/syscall.tbl
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
include/uapi/linux/sched.h
kernel/fork.c

Simple merge
index 81e6e1817c45070f600f7f5aa10636938a002f28,e99a82bdb93a66503e9ab33d63066c0fea92c968..6da7dc4d79cc40180886800a74ca4d475398be0f
  431   common  fsconfig                        sys_fsconfig
  432   common  fsmount                         sys_fsmount
  433   common  fspick                          sys_fspick
 -436   common  clone3                          sys_clone3
 +434   common  pidfd_open                      sys_pidfd_open
++435   common  clone3                          sys_clone3
index ede7b88d4f15ac08c62be79f9e381dd760cc35e8,e4e0523102e247958498c4a20ec4664b5921e4bc..2629a68b87244facd78a6ad5e9d4b18ca6ac18ad
@@@ -38,7 -44,7 +38,7 @@@
  #define __ARM_NR_compat_set_tls               (__ARM_NR_COMPAT_BASE + 5)
  #define __ARM_NR_COMPAT_END           (__ARM_NR_COMPAT_BASE + 0x800)
  
- #define __NR_compat_syscalls          435
 -#define __NR_compat_syscalls          437
++#define __NR_compat_syscalls          436
  #endif
  
  #define __ARCH_WANT_SYS_CLONE
index 52415923e08f87f491e3af1e6a4ce55238844c0e,b144ea675d70d0a1e739b396ba94a3d27ef7c2bf..94ab29cf4f00306d95d72f64a306445dbb062fb9
@@@ -875,8 -886,8 +875,10 @@@ __SYSCALL(__NR_fsconfig, sys_fsconfig
  __SYSCALL(__NR_fsmount, sys_fsmount)
  #define __NR_fspick 433
  __SYSCALL(__NR_fspick, sys_fspick)
 -#define __NR_clone3 436
 +#define __NR_pidfd_open 434
 +__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
++#define __NR_clone3 435
+ __SYSCALL(__NR_clone3, sys_clone3)
  
  /*
   * Please add new compat syscalls above this comment and update
index ad706f83c7553ca21261b423e84b865a76435780,3110440bcc310a121920f7d0804d9fc927a90472..09b0cd7dab0a6f009fa9b2d057791f1342e38330
  431   common  fsconfig                        sys_fsconfig
  432   common  fsmount                         sys_fsmount
  433   common  fspick                          sys_fspick
 -436   common  clone3                          sys_clone3
 +434   common  pidfd_open                      sys_pidfd_open
++435   common  clone3                          sys_clone3
index 43e4429a5272c531deaf98b697e7f3b75da59156,80e26211feffa10b77261769ad222cfa1ebc6156..c00019abd0769d60d7a142db83b611d076e9ab0b
  431   i386    fsconfig                sys_fsconfig                    __ia32_sys_fsconfig
  432   i386    fsmount                 sys_fsmount                     __ia32_sys_fsmount
  433   i386    fspick                  sys_fspick                      __ia32_sys_fspick
 -436   i386    clone3                  sys_clone3                      __ia32_sys_clone3
 +434   i386    pidfd_open              sys_pidfd_open                  __ia32_sys_pidfd_open
++435   i386    clone3                  sys_clone3                      __ia32_sys_clone3
index 1bee0a77fdd37d52d44c32ee305d4d0a3acf2c38,7968f0b5b5e855d9f2e7c0a7963aba8792f93826..c29976eca4a8a86bdd2fc062b3e521afc0338301
  431   common  fsconfig                __x64_sys_fsconfig
  432   common  fsmount                 __x64_sys_fsmount
  433   common  fspick                  __x64_sys_fspick
 -436   common  clone3                  __x64_sys_clone3/ptregs
 +434   common  pidfd_open              __x64_sys_pidfd_open
++435   common  clone3                  __x64_sys_clone3/ptregs
  
  #
  # x32-specific system call numbers start at 512 to avoid cache impact
index 782b81945cccdf5535e5b446dbf129c62836e530,b2767c8c2b4e9f588e1d8f67efa456a07271ab44..25f4de729a6d03ed12e728a726bd28c661fd3fa2
  431   common  fsconfig                        sys_fsconfig
  432   common  fsmount                         sys_fsmount
  433   common  fspick                          sys_fspick
 -436   common  clone3                          sys_clone3
 +434   common  pidfd_open                      sys_pidfd_open
++435   common  clone3                          sys_clone3
Simple merge
index e5684a4512c0a4901b7bea21bfd2ef53072acfda,45bc87687c477b929138edfa5048e5891c44ae04..9acfff0cd153ff30c322ea73a75d533af7f5a417
@@@ -844,11 -844,11 +844,13 @@@ __SYSCALL(__NR_fsconfig, sys_fsconfig
  __SYSCALL(__NR_fsmount, sys_fsmount)
  #define __NR_fspick 433
  __SYSCALL(__NR_fspick, sys_fspick)
 -#define __NR_clone3 436
 +#define __NR_pidfd_open 434
 +__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
++#define __NR_clone3 435
+ __SYSCALL(__NR_clone3, sys_clone3)
  
  #undef __NR_syscalls
- #define __NR_syscalls 435
 -#define __NR_syscalls 437
++#define __NR_syscalls 436
  
  /*
   * 32 bit systems traditionally used different
Simple merge
diff --cc kernel/fork.c
index 187c02ce534c87a955cf93d1d01f9fba57c723e2,98abea9956299aba2d84d36b0da28a2037e34e8e..8f3e2d97d77100dd746d98f7410c8601c3c8891b
@@@ -1781,7 -1768,7 +1776,8 @@@ static __latent_entropy struct task_str
        int pidfd = -1, retval;
        struct task_struct *p;
        struct multiprocess_signals delayed;
 +      struct file *pidfile = NULL;
+       u64 clone_flags = args->flags;
  
        /*
         * Don't allow sharing the root directory with processes in a different
                        goto bad_fork_free_pid;
  
                pidfd = retval;
-               retval = put_user(pidfd, parent_tidptr);
 +
 +              pidfile = anon_inode_getfile("[pidfd]", &pidfd_fops, pid,
 +                                            O_RDWR | O_CLOEXEC);
 +              if (IS_ERR(pidfile)) {
 +                      put_unused_fd(pidfd);
 +                      retval = PTR_ERR(pidfile);
 +                      goto bad_fork_free_pid;
 +              }
 +              get_pid(pid);   /* held by pidfile now */
 +
+               retval = put_user(pidfd, args->pidfd);
                if (retval)
                        goto bad_fork_put_pidfd;
        }