The following patches should be close. I took some patches I haven't taken the time to merge yet that make PIDTYPE_TGID not a hack.
Updated the code that deals with signals to handle PIDTYPE_TGID. Pushed the pid type down from the signal senders all of the way down into __send_signal. That work could probably use being split into more than one patch for readability, but it seems reasonble and less of a hack than the "bool group" we have currently. I think I have gotten all of the places we send signals to multiple processes. But I have yet to make an exhaustive examination. I would appreciate some review feedback before I burn a day doing that. All in all this changes a little more than I might hope for but it seems a nicely targted cleanup that sorts out the fork issue. Comments please. I think I am 99% of the way to solving this cleanly but any feedback would be very appreciated. Thank you in advance. Eric W. Biederman (11): pids: Initialize leader_pid in init_task pids: Move task_pid_type into sched/signal.h pids: Compute task_tgid using signal->leader_pid kvm: Don't open code task_pid in kvm_vcpu_ioctl pids: Move the pgrp and session pid pointers from task_struct to signal_struct pid: Implement PIDTYPE_TGID signal: Deliver group signals via PIDTYPE_TGID not PIDTYPE_PID signal: Use PIDTYPE_TGID to clearly store where file signals will be sent tty_io: Use do_send_sig_info in __do_SACK to forcibly kill tasks signal: Push pid type from signal senders down into __send_signal signal: Ignore all but multi-process signals that come in during fork. arch/ia64/kernel/asm-offsets.c | 4 +-- arch/ia64/kernel/fsys.S | 12 +++---- arch/s390/kernel/perf_cpum_sf.c | 2 +- drivers/net/tun.c | 2 +- drivers/platform/x86/thinkpad_acpi.c | 1 + drivers/tty/sysrq.c | 2 +- drivers/tty/tty_io.c | 10 +++--- fs/autofs/autofs_i.h | 1 + fs/exec.c | 1 + fs/fcntl.c | 38 ++++++++-------------- fs/fuse/file.c | 1 + fs/locks.c | 2 +- fs/notify/dnotify/dnotify.c | 3 +- fs/notify/fanotify/fanotify.c | 1 + include/linux/init_task.h | 9 ------ include/linux/pid.h | 11 ++----- include/linux/sched.h | 31 ++++-------------- include/linux/sched/signal.h | 39 +++++++++++++++++++++-- include/linux/signal.h | 6 ++-- include/net/scm.h | 1 + include/trace/events/signal.h | 12 +++---- init/init_task.c | 12 ++++--- kernel/events/core.c | 2 +- kernel/exit.c | 12 ++----- kernel/fork.c | 45 +++++++++++++++++++++----- kernel/pid.c | 42 ++++++++++++------------- kernel/signal.c | 61 ++++++++++++++++++++---------------- kernel/time/itimer.c | 5 +-- kernel/time/posix-cpu-timers.c | 2 +- kernel/time/posix-timers.c | 13 +++----- mm/oom_kill.c | 4 +-- virt/kvm/kvm_main.c | 2 +- 32 files changed, 205 insertions(+), 184 deletions(-)