Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9dce667 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents f67e3fb4 575a0ae9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -429,6 +429,7 @@
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
+1 −0
Original line number Diff line number Diff line
@@ -345,6 +345,7 @@
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
+9 −0
Original line number Diff line number Diff line
@@ -3074,6 +3074,15 @@ static const struct file_operations proc_tgid_base_operations = {
	.llseek		= generic_file_llseek,
};

struct pid *tgid_pidfd_to_pid(const struct file *file)
{
	if (!d_is_dir(file->f_path.dentry) ||
	    (file->f_op != &proc_tgid_base_operations))
		return ERR_PTR(-EBADF);

	return proc_pid(file_inode(file));
}

static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
{
	return proc_pident_lookup(dir, dentry,
+6 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ struct proc_dir_entry *proc_create_net_single_write(const char *name, umode_t mo
						    int (*show)(struct seq_file *, void *),
						    proc_write_t write,
						    void *data);
extern struct pid *tgid_pidfd_to_pid(const struct file *file);

#else /* CONFIG_PROC_FS */

@@ -114,6 +115,11 @@ static inline int remove_proc_subtree(const char *name, struct proc_dir_entry *p
#define proc_create_net(name, mode, parent, state_size, ops) ({NULL;})
#define proc_create_net_single(name, mode, parent, show, data) ({NULL;})

static inline struct pid *tgid_pidfd_to_pid(const struct file *file)
{
	return ERR_PTR(-EBADF);
}

#endif /* CONFIG_PROC_FS */

struct net;
+3 −0
Original line number Diff line number Diff line
@@ -985,6 +985,9 @@ asmlinkage long sys_statx(int dfd, const char __user *path, unsigned flags,
			  unsigned mask, struct statx __user *buffer);
asmlinkage long sys_rseq(struct rseq __user *rseq, uint32_t rseq_len,
			 int flags, uint32_t sig);
asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
				       siginfo_t __user *info,
				       unsigned int flags);

/*
 * Architecture-specific system calls
Loading