linux/kernel
Oleg Nesterov 2a71e215aa posix-cpu-timers: workaround to suppress the problems with mt exec
commit e0a7021710 upstream.

posix-cpu-timers.c correctly assumes that the dying process does
posix_cpu_timers_exit_group() and removes all !CPUCLOCK_PERTHREAD
timers from signal->cpu_timers list.

But, it also assumes that timer->it.cpu.task is always the group
leader, and thus the dead ->task means the dead thread group.

This is obviously not true after de_thread() changes the leader.
After that almost every posix_cpu_timer_ method has problems.

It is not simple to fix this bug correctly. First of all, I think
that timer->it.cpu should use struct pid instead of task_struct.
Also, the locking should be reworked completely. In particular,
tasklist_lock should not be used at all. This all needs a lot of
nontrivial and hard-to-test changes.

Change __exit_signal() to do posix_cpu_timers_exit_group() when
the old leader dies during exec. This is not the fix, just the
temporary hack to hide the problem for 2.6.37 and stable. IOW,
this is obviously wrong but this is what we currently have anyway:
cpu timers do not work after mt exec.

In theory this change adds another race. The exiting leader can
detach the timers which were attached to the new leader. However,
the window between de_thread() and release_task() is small, we
can pretend that sys_timer_create() was called before de_thread().

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2011-01-07 13:58:52 -08:00
..
debug Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-09-08 11:13:42 -07:00
gcov gcov: fix null-pointer dereference for certain module types 2010-09-09 18:57:23 -07:00
irq genirq: Fix incorrect proc spurious output 2010-12-09 13:33:27 -08:00
power PM / Hibernate: Fix PM_POST_* notification with user-space suspend 2011-01-07 13:58:19 -08:00
time
trace tracing: Fix panic when lseek() called on "trace" opened for writing 2011-01-07 13:58:33 -08:00
.gitignore
acct.c
async.c
audit_tree.c
audit_watch.c
audit.c
audit.h
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c
cgroup_freezer.c
cgroup.c cgroups: fix API thinko 2010-09-09 18:57:23 -07:00
compat.c compat: Make compat_alloc_user_space() incorporate the access_ok() 2010-09-14 16:08:45 -07:00
configs.c
cpu.c
cpuset.c
cred.c
delayacct.c
dma.c
early_res.c
elfcore.c
exec_domain.c
exit.c posix-cpu-timers: workaround to suppress the problems with mt exec 2011-01-07 13:58:52 -08:00
extable.c
fork.c Sched: fix skip_clock_update optimization 2011-01-07 13:58:51 -08:00
freezer.c
futex_compat.c
futex.c futex: Fix errors in nested key ref-counting 2010-11-22 11:03:02 -08:00
groups.c kernel/groups.c: fix integer overflow in groups_search 2010-09-09 18:57:24 -07:00
hrtimer.c hrtimer: Preserve timer state in remove_hrtimer() 2010-10-14 13:29:59 +02:00
hung_task.c
hw_breakpoint.c hw breakpoints: Fix pid namespace bug 2010-09-17 04:42:59 +02:00
itimer.c
kallsyms.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kexec.c
kfifo.c kfifo: fix scatterlist usage 2010-10-01 10:50:58 -07:00
kmod.c Make do_execve() take a const filename pointer 2010-08-17 18:07:43 -07:00
kprobes.c
ksysfs.c
kthread.c
latencytop.c latencytop: fix per task accumulator 2010-12-09 13:32:53 -08:00
lockdep_internals.h
lockdep_proc.c
lockdep_states.h
lockdep.c
Makefile
module.c modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
mutex-debug.c
mutex-debug.h
mutex.c mutex: Fix annotations to include it in kernel-locking docbook 2010-09-03 08:19:51 +02:00
mutex.h
notifier.c
ns_cgroup.c
nsproxy.c
padata.c
panic.c
params.c
perf_event.c perf: Fix inherit vs. context rotation bug 2010-12-09 13:33:25 -08:00
pid_namespace.c
pid.c
pm_qos_params.c PM / PM QoS: Fix reversed min and max 2010-12-09 13:33:18 -08:00
posix-cpu-timers.c
posix-timers.c
printk.c printk: Fix wake_up_klogd() vs cpu hotplug 2011-01-07 13:58:30 -08:00
profile.c
ptrace.c
range.c
rcupdate.c
rcutiny_plugin.h
rcutiny.c
rcutorture.c
rcutree_plugin.h
rcutree_trace.c
rcutree.c
rcutree.h
relay.c
res_counter.c
resource.c
rtmutex_common.h
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
rtmutex.h
rwsem.c
sched_clock.c
sched_cpupri.c
sched_cpupri.h
sched_debug.c
sched_fair.c sched: Fix nohz balance kick 2010-09-21 13:50:50 +02:00
sched_features.h
sched_idletask.c
sched_rt.c
sched_stats.h
sched.c Sched: fix skip_clock_update optimization 2011-01-07 13:58:51 -08:00
seccomp.c
semaphore.c
signal.c HWPOISON: Copy si_addr_lsb to user 2010-10-07 09:41:25 +02:00
smp.c generic-ipi: Fix deadlock in __smp_call_function_single 2010-09-10 16:48:40 +02:00
softirq.c
spinlock.c
srcu.c
stacktrace.c
stop_machine.c
sys_ni.c
sys.c pid: make setpgid() system call use RCU read-side critical section 2010-08-31 17:00:18 -07:00
sysctl_binary.c
sysctl_check.c sysctl: min/max bounds are optional 2010-10-15 14:42:24 -07:00
sysctl.c sysctl: fix min/max handling in __do_proc_doulongvec_minmax() 2010-10-07 13:31:21 -07:00
taskstats.c
test_kprobes.c
time.c
timeconst.pl
timer.c sched: Cure more NO_HZ load average woes 2011-01-07 13:58:31 -08:00
tracepoint.c
tsacct.c
uid16.c
up.c
user_namespace.c
user-return-notifier.c
user.c fix freeing user_struct in user cache 2011-01-07 13:58:42 -08:00
utsname_sysctl.c
utsname.c
wait.c
watchdog.c watchdog: Improve initialisation error message and documentation 2011-01-07 13:58:43 -08:00
workqueue_sched.h
workqueue.c workqueue: add documentation 2010-09-13 10:26:52 +02:00