Re: [PATCH] fix send_sigqueue() vs thread exit race

From: Thomas Gleixner
Date: Tue Aug 23 2005 - 05:13:30 EST


On Mon, 2005-08-22 at 20:45 +0400, Oleg Nesterov wrote:
> Thomas Gleixner wrote:
> Ok, exit_itimers()->itimer_delete() called when the last thread exits
> or does exec.
>
> kernel/posix-timers.c:common_timer_del() calls del_timer_sync(), after
> that nobody can access this timer, so we don't need to lock timer->it_lock
> at all in this case. No lock - no deadlock.

It still deadlocks:

CPU 0 CPU 1
write_lock(&tasklist_lock);
__exit_signal()
timer expires
base->running_timer = timer
send_group_sigqueue()
read_lock(&tasklist_lock();
exit_itimers()
del_timer_sync(timer)
waits for ever because waits for ever on tasklist_lock
base->running_timer == timer


I still think the last patch I sent is still necessary.

> But I know nothing about kernel/posix-cpu-timers.c, I doubt it will work
> for posix_cpu_timer_del(). I don't have time to study posix-cpu-timers now.
> However, I see that __exit_signal() calls posix_cpu_timers_exit_xxx(), so
> may be it can work?
>
> 380 int posix_cpu_timer_del(struct k_itimer *timer)
> 381 {
> 382 struct task_struct *p = timer->it.cpu.task;
> 383
> 384 if (timer->it.cpu.firing)
> 385 return TIMER_RETRY;
> 386
> 387 if (unlikely(p == NULL))
> 388 return 0;
> 389
> 390 if (!list_empty(&timer->it.cpu.entry)) {
> 391 read_lock(&tasklist_lock);
>
> Surely, it should be impossible to happen when process exists, otherwise
> it would deadlock immediately, we did write_lock(tasklist).
>
> Thomas, do you know something about posix-cpu-timers.c?

Not much. I look into this

tglx


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/