History

Merge tag 'threads-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux

Pull thread management updates from Christian Brauner: "Sargun Dhillon over the last cycle has worked on the pidfd_getfd() syscall. This syscall allows for the retrieval of file descriptors of a process based on its pidfd. A task needs to have ptrace_may_access() permissions with PTRACE_MODE_ATTACH_REALCREDS (suggested by Oleg and Andy) on the target. One of the main use-cases is in combination with seccomp's user notification feature. As a reminder, seccomp's user notification feature was made available in v5.0. It allows a task to retrieve a file descriptor for its seccomp filter. The file descriptor is usually handed of to a more privileged supervising process. The supervisor can then listen for syscall events caught by the seccomp filter of the supervisee and perform actions in lieu of the supervisee, usually emulating syscalls. pidfd_getfd() is needed to expand its uses. There are currently two major users that wait on pidfd_getfd() and one future user: - Netflix, Sargun said, is working on a service mesh where users should be able to connect to a dns-based VIP. When a user connects to e.g. 1.2.3.4:80 that runs e.g. service "foo" they will be redirected to an envoy process. This service mesh uses seccomp user notifications and pidfd to intercept all connect calls and instead of connecting them to 1.2.3.4:80 connects them to e.g. 127.0.0.1:8080. - LXD uses the seccomp notifier heavily to intercept and emulate mknod() and mount() syscalls for unprivileged containers/processes. With pidfd_getfd() more uses-cases e.g. bridging socket connections will be possible. - The patchset has also seen some interest from the browser corner. Right now, Firefox is using a SECCOMP_RET_TRAP sandbox managed by a broker process. In the future glibc will start blocking all signals during dlopen() rendering this type of sandbox impossible. Hence, in the future Firefox will switch to a seccomp-user-nofication based sandbox which also makes use of file descriptor retrieval. The thread for this can be found at https://sourceware.org/ml/libc-alpha/2019-12/msg00079.html With pidfd_getfd() it is e.g. possible to bridge socket connections for the supervisee (binding to a privileged port) and taking actions on file descriptors on behalf of the supervisee in general. Sargun's first version was using an ioctl on pidfds but various people pushed for it to be a proper syscall which he duely implemented as well over various review cycles. Selftests are of course included. I've also added instructions how to deal with merge conflicts below. There's also a small fix coming from the kernel mentee project to correctly annotate struct sighand_struct with __rcu to fix various sparse warnings. We've received a few more such fixes and even though they are mostly trivial I've decided to postpone them until after -rc1 since they came in rather late and I don't want to risk introducing build warnings. Finally, there's a new prctl() command PR_{G,S}ET_IO_FLUSHER which is needed to avoid allocation recursions triggerable by storage drivers that have userspace parts that run in the IO path (e.g. dm-multipath, iscsi, etc). These allocation recursions deadlock the device. The new prctl() allows such privileged userspace components to avoid allocation recursions by setting the PF_MEMALLOC_NOIO and PF_LESS_THROTTLE flags. The patch carries the necessary acks from the relevant maintainers and is routed here as part of prctl() thread-management." * tag 'threads-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux: prctl: PR_{G,S}ET_IO_FLUSHER to support controlling memory reclaim sched.h: Annotate sighand_struct with __rcu test: Add test for pidfd getfd arch: wire up pidfd_getfd syscall pid: Implement pidfd_getfd syscall vfs, fdtable: Add fget_task helper

Linus Torvalds committed 6 years ago

Commit 83fa8052 parents 896f8d2 8d19f1c32 files · +427 −7Browse files

Showing the changes to include/linux (3 of 32 files). Show all

Unified · Split

3 files
  1. include/linux/file.h +2 −0
  2. include/linux/sched.h +1 −1
  3. include/linux/syscalls.h +1 −0
include/linux/file.h+2−0
@@ -16,6 +16,7 @@ extern void fput(struct file *); · 15 unmodified lines
16extern void fput_many(struct file *, unsigned int);16extern void fput_many(struct file *, unsigned int);
17 17
18struct file_operations;18struct file_operations;
19struct task_struct;
19struct vfsmount;20struct vfsmount;
20struct dentry;21struct dentry;
21struct inode;22struct inode;
@@ -47,6 +48,7 @@ static inline void fdput(struct fd fd) · 25 unmodified lines
47extern struct file *fget(unsigned int fd);48extern struct file *fget(unsigned int fd);
48extern struct file *fget_many(unsigned int fd, unsigned int refs);49extern struct file *fget_many(unsigned int fd, unsigned int refs);
49extern struct file *fget_raw(unsigned int fd);50extern struct file *fget_raw(unsigned int fd);
51extern struct file *fget_task(struct task_struct *task, unsigned int fd);
50extern unsigned long __fdget(unsigned int fd);52extern unsigned long __fdget(unsigned int fd);
51extern unsigned long __fdget_raw(unsigned int fd);53extern unsigned long __fdget_raw(unsigned int fd);
52extern unsigned long __fdget_pos(unsigned int fd);54extern unsigned long __fdget_pos(unsigned int fd);
include/linux/sched.h+1−1
@@ -917,7 +917,7 @@ struct task_struct { · 916 unmodified lines
917 917
918 /* Signal handlers: */918 /* Signal handlers: */
919 struct signal_struct *signal;919 struct signal_struct *signal;
920 struct sighand_struct *sighand;920 struct sighand_struct __rcu *sighand;
921 sigset_t blocked;921 sigset_t blocked;
922 sigset_t real_blocked;922 sigset_t real_blocked;
923 /* Restored if set_restore_sigmask() was used: */923 /* Restored if set_restore_sigmask() was used: */
include/linux/syscalls.h+1−0
@@ -1002,6 +1002,7 @@ asmlinkage long sys_fspick(int dfd, const char __user *path, unsigned int flags) · 1001 unmodified lines
1002asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,1002asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
1003 siginfo_t __user *info,1003 siginfo_t __user *info,
1004 unsigned int flags);1004 unsigned int flags);
1005asmlinkage long sys_pidfd_getfd(int pidfd, int fd, unsigned int flags);
1005 1006
1006/*1007/*
1007 * Architecture-specific system calls1008 * Architecture-specific system calls