Messages in this thread | | | Date | Tue, 7 Apr 2015 20:28:30 +0200 (CEST) | From | Thomas Gleixner <> | Subject | Re: [PATCH 3/3] ipc/mqueue: remove STATE_PENDING |
| |
On Tue, 7 Apr 2015, Manfred Spraul wrote: > On 04/07/2015 05:03 PM, Sebastian Andrzej Siewior wrote: > > + * spinlock. The same algorithm is used for sysv semaphores, see ipc/sem.c > > + * for more details. > No. With your change, ipc/sem.c and ipc/msg.c use different algorithms. > Please update the comment and describe the new approach: > > Current approach: > - set pointer to message > - STATE_PENDING > - wake_up_process() > - STATE_READY > (now the receiver can continue) > > New approach: > - set pointer to message > - get_task_struct > - STATE_READY > (now the receiver can continue, e.g. woken up due to an unrelated > SIGKILL) > - wake_up_process() > - put_task_struct() > > > > + if (r_sender) { > > + wake_up_process(r_sender); > > + put_task_struct(r_sender); > > + } > > ret = 0; > Could you double-check that it is safe to call wake_up_process on a killed > and reaped thread, only with a get_task_struct reference?
Yes. It is safe to call wake_up_process() on a dead thread if you hold a ref.
wake_up_process() return try_to_wake_up(p, TASK_NORMAL, 0);
try_to_wake_up() raw_spin_lock_irqsave(&p->pi_lock, flags); if (!(p->state & state)) goto out;
TASK_NORMAL == (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
That makes try_to_wake_up() a NOOP on a task with state TASK_DEAD. We have quite some code in the kernel which relies on this.
Thanks,
tglx
| |