[PATCH] timerfd: fix wakeup of processes when timer is cancelledon clock change

From: Max Asbock
Date: Mon Jun 13 2011 - 13:15:54 EST


I have sent this before, perhaps it got lost in the noise.

Currently processes waiting on cancelable timerfd timers are
not woken up when the timers are canceled.
When the system time is set the clock_was_set() function calls
timerfd_clock_was_set() to cancel and wake up processes waiting on
potential cancelable timerfd timers. However the wake up currently has
no effect because in the case of timerfd_read it is dependent on
ctx->ticks not being 0. timerfd_poll also requires ctx->ticks being non
zero. As a consequence processes waiting on cancelable timers only get
woken up when the timers expire. This patch fixes this by incrementing
ctx->ticks before calling wake_up.

Signed-off-by: Max Asbock <masbock@xxxxxxxxxxxxxxxxxx>
---

--- linux-3.0-rc1/fs/timerfd.c
+++ linux-3.0-rc1.timerfd/fs/timerfd.c
@@ -61,7 +61,9 @@ static enum hrtimer_restart timerfd_tmrp

/*
* Called when the clock was set to cancel the timers in the cancel
- * list.
+ * list. This will wake up processes waiting on these timers. The
+ * wake-up requires ctx->ticks to be non zero, therefore we increment
+ * it before calling wake_up_locked().
*/
void timerfd_clock_was_set(void)
{
@@ -76,6 +78,7 @@ void timerfd_clock_was_set(void)
spin_lock_irqsave(&ctx->wqh.lock, flags);
if (ctx->moffs.tv64 != moffs.tv64) {
ctx->moffs.tv64 = KTIME_MAX;
+ ctx->ticks++;
wake_up_locked(&ctx->wqh);
}
spin_unlock_irqrestore(&ctx->wqh.lock, flags);


--
Max


--
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/