OSDN Git Service

Merge tag 'pidfd-v5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 16 Mar 2019 20:47:14 +0000 (13:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 16 Mar 2019 20:47:14 +0000 (13:47 -0700)
Pull pidfd system call from Christian Brauner:
 "This introduces the ability to use file descriptors from /proc/<pid>/
  as stable handles on struct pid. Even if a pid is recycled the handle
  will not change. For a start these fds can be used to send signals to
  the processes they refer to.

  With the ability to use /proc/<pid> fds as stable handles on struct
  pid we can fix a long-standing issue where after a process has exited
  its pid can be reused by another process. If a caller sends a signal
  to a reused pid it will end up signaling the wrong process.

  With this patchset we enable a variety of use cases. One obvious
  example is that we can now safely delegate an important part of
  process management - sending signals - to processes other than the
  parent of a given process by sending file descriptors around via scm
  rights and not fearing that the given process will have been recycled
  in the meantime. It also allows for easy testing whether a given
  process is still alive or not by sending signal 0 to a pidfd which is
  quite handy.

  There has been some interest in this feature e.g. from systems
  management (systemd, glibc) and container managers. I have requested
  and gotten comments from glibc to make sure that this syscall is
  suitable for their needs as well. In the future I expect it to take on
  most other pid-based signal syscalls. But such features are left for
  the future once they are needed.

  This has been sitting in linux-next for quite a while and has not
  caused any issues. It comes with selftests which verify basic
  functionality and also test that a recycled pid cannot be signaled via
  a pidfd.

  Jon has written about a prior version of this patchset. It should
  cover the basic functionality since not a lot has changed since then:

      https://lwn.net/Articles/773459/

  The commit message for the syscall itself is extensively documenting
  the syscall, including it's functionality and extensibility"

* tag 'pidfd-v5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux:
  selftests: add tests for pidfd_send_signal()
  signal: add pidfd_send_signal() syscall

1  2 
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
fs/proc/base.c
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
kernel/signal.c
kernel/sys_ni.c
tools/testing/selftests/Makefile

  382   i386    pkey_free               sys_pkey_free                   __ia32_sys_pkey_free
  383   i386    statx                   sys_statx                       __ia32_sys_statx
  384   i386    arch_prctl              sys_arch_prctl                  __ia32_compat_sys_arch_prctl
 -385   i386    io_pgetevents           sys_io_pgetevents               __ia32_compat_sys_io_pgetevents
 +385   i386    io_pgetevents           sys_io_pgetevents_time32        __ia32_compat_sys_io_pgetevents
  386   i386    rseq                    sys_rseq                        __ia32_sys_rseq
 +# don't use numbers 387 through 392, add new calls at the end
 +393   i386    semget                  sys_semget                      __ia32_sys_semget
 +394   i386    semctl                  sys_semctl                      __ia32_compat_sys_semctl
 +395   i386    shmget                  sys_shmget                      __ia32_sys_shmget
 +396   i386    shmctl                  sys_shmctl                      __ia32_compat_sys_shmctl
 +397   i386    shmat                   sys_shmat                       __ia32_compat_sys_shmat
 +398   i386    shmdt                   sys_shmdt                       __ia32_sys_shmdt
 +399   i386    msgget                  sys_msgget                      __ia32_sys_msgget
 +400   i386    msgsnd                  sys_msgsnd                      __ia32_compat_sys_msgsnd
 +401   i386    msgrcv                  sys_msgrcv                      __ia32_compat_sys_msgrcv
 +402   i386    msgctl                  sys_msgctl                      __ia32_compat_sys_msgctl
 +403   i386    clock_gettime64         sys_clock_gettime               __ia32_sys_clock_gettime
 +404   i386    clock_settime64         sys_clock_settime               __ia32_sys_clock_settime
 +405   i386    clock_adjtime64         sys_clock_adjtime               __ia32_sys_clock_adjtime
 +406   i386    clock_getres_time64     sys_clock_getres                __ia32_sys_clock_getres
 +407   i386    clock_nanosleep_time64  sys_clock_nanosleep             __ia32_sys_clock_nanosleep
 +408   i386    timer_gettime64         sys_timer_gettime               __ia32_sys_timer_gettime
 +409   i386    timer_settime64         sys_timer_settime               __ia32_sys_timer_settime
 +410   i386    timerfd_gettime64       sys_timerfd_gettime             __ia32_sys_timerfd_gettime
 +411   i386    timerfd_settime64       sys_timerfd_settime             __ia32_sys_timerfd_settime
 +412   i386    utimensat_time64        sys_utimensat                   __ia32_sys_utimensat
 +413   i386    pselect6_time64         sys_pselect6                    __ia32_compat_sys_pselect6_time64
 +414   i386    ppoll_time64            sys_ppoll                       __ia32_compat_sys_ppoll_time64
 +416   i386    io_pgetevents_time64    sys_io_pgetevents               __ia32_sys_io_pgetevents
 +417   i386    recvmmsg_time64         sys_recvmmsg                    __ia32_compat_sys_recvmmsg_time64
 +418   i386    mq_timedsend_time64     sys_mq_timedsend                __ia32_sys_mq_timedsend
 +419   i386    mq_timedreceive_time64  sys_mq_timedreceive             __ia32_sys_mq_timedreceive
 +420   i386    semtimedop_time64       sys_semtimedop                  __ia32_sys_semtimedop
 +421   i386    rt_sigtimedwait_time64  sys_rt_sigtimedwait             __ia32_compat_sys_rt_sigtimedwait_time64
 +422   i386    futex_time64            sys_futex                       __ia32_sys_futex
 +423   i386    sched_rr_get_interval_time64    sys_sched_rr_get_interval       __ia32_sys_sched_rr_get_interval
+ 424   i386    pidfd_send_signal       sys_pidfd_send_signal           __ia32_sys_pidfd_send_signal
 +425   i386    io_uring_setup          sys_io_uring_setup              __ia32_sys_io_uring_setup
 +426   i386    io_uring_enter          sys_io_uring_enter              __ia32_sys_io_uring_enter
 +427   i386    io_uring_register       sys_io_uring_register           __ia32_sys_io_uring_register
  332   common  statx                   __x64_sys_statx
  333   common  io_pgetevents           __x64_sys_io_pgetevents
  334   common  rseq                    __x64_sys_rseq
 +# don't use numbers 387 through 423, add new calls after the last
 +# 'common' entry
+ 424   common  pidfd_send_signal       __x64_sys_pidfd_send_signal
 +425   common  io_uring_setup          __x64_sys_io_uring_setup
 +426   common  io_uring_enter          __x64_sys_io_uring_enter
 +427   common  io_uring_register       __x64_sys_io_uring_register
  
  #
  # x32-specific system call numbers start at 512 to avoid cache impact
diff --cc fs/proc/base.c
Simple merge
Simple merge
@@@ -780,59 -740,11 +780,61 @@@ __SC_COMP_3264(__NR_io_pgetevents, sys_
  __SYSCALL(__NR_rseq, sys_rseq)
  #define __NR_kexec_file_load 294
  __SYSCALL(__NR_kexec_file_load,     sys_kexec_file_load)
 +/* 295 through 402 are unassigned to sync up with generic numbers, don't use */
 +#if __BITS_PER_LONG == 32
 +#define __NR_clock_gettime64 403
 +__SYSCALL(__NR_clock_gettime64, sys_clock_gettime)
 +#define __NR_clock_settime64 404
 +__SYSCALL(__NR_clock_settime64, sys_clock_settime)
 +#define __NR_clock_adjtime64 405
 +__SYSCALL(__NR_clock_adjtime64, sys_clock_adjtime)
 +#define __NR_clock_getres_time64 406
 +__SYSCALL(__NR_clock_getres_time64, sys_clock_getres)
 +#define __NR_clock_nanosleep_time64 407
 +__SYSCALL(__NR_clock_nanosleep_time64, sys_clock_nanosleep)
 +#define __NR_timer_gettime64 408
 +__SYSCALL(__NR_timer_gettime64, sys_timer_gettime)
 +#define __NR_timer_settime64 409
 +__SYSCALL(__NR_timer_settime64, sys_timer_settime)
 +#define __NR_timerfd_gettime64 410
 +__SYSCALL(__NR_timerfd_gettime64, sys_timerfd_gettime)
 +#define __NR_timerfd_settime64 411
 +__SYSCALL(__NR_timerfd_settime64, sys_timerfd_settime)
 +#define __NR_utimensat_time64 412
 +__SYSCALL(__NR_utimensat_time64, sys_utimensat)
 +#define __NR_pselect6_time64 413
 +__SC_COMP(__NR_pselect6_time64, sys_pselect6, compat_sys_pselect6_time64)
 +#define __NR_ppoll_time64 414
 +__SC_COMP(__NR_ppoll_time64, sys_ppoll, compat_sys_ppoll_time64)
 +#define __NR_io_pgetevents_time64 416
 +__SYSCALL(__NR_io_pgetevents_time64, sys_io_pgetevents)
 +#define __NR_recvmmsg_time64 417
 +__SC_COMP(__NR_recvmmsg_time64, sys_recvmmsg, compat_sys_recvmmsg_time64)
 +#define __NR_mq_timedsend_time64 418
 +__SYSCALL(__NR_mq_timedsend_time64, sys_mq_timedsend)
 +#define __NR_mq_timedreceive_time64 419
 +__SYSCALL(__NR_mq_timedreceive_time64, sys_mq_timedreceive)
 +#define __NR_semtimedop_time64 420
 +__SYSCALL(__NR_semtimedop_time64, sys_semtimedop)
 +#define __NR_rt_sigtimedwait_time64 421
 +__SC_COMP(__NR_rt_sigtimedwait_time64, sys_rt_sigtimedwait, compat_sys_rt_sigtimedwait_time64)
 +#define __NR_futex_time64 422
 +__SYSCALL(__NR_futex_time64, sys_futex)
 +#define __NR_sched_rr_get_interval_time64 423
 +__SYSCALL(__NR_sched_rr_get_interval_time64, sys_sched_rr_get_interval)
 +#endif
 +
+ #define __NR_pidfd_send_signal 424
+ __SYSCALL(__NR_pidfd_send_signal, sys_pidfd_send_signal)
 +#define __NR_io_uring_setup 425
 +__SYSCALL(__NR_io_uring_setup, sys_io_uring_setup)
 +#define __NR_io_uring_enter 426
 +__SYSCALL(__NR_io_uring_enter, sys_io_uring_enter)
 +#define __NR_io_uring_register 427
 +__SYSCALL(__NR_io_uring_register, sys_io_uring_register)
  
  #undef __NR_syscalls
 -#define __NR_syscalls 425
 +#define __NR_syscalls 428
  
  /*
   * 32 bit systems traditionally used different
diff --cc kernel/signal.c
Simple merge
diff --cc kernel/sys_ni.c
Simple merge
Simple merge