[PATCH 2.5] : IrDA timer fix

Jean Tourrilhes (jt@bougret.hpl.hp.com)
Thu, 20 Feb 2003 16:10:34 -0800


ir253_timer_mod.diff :
--------------------
o [FEATURE] Make IrDA timers use mod_timer instead of add+del_timer

diff -u -p linux/net/irda/timer.d5.c linux/net/irda/timer.c
--- linux/net/irda/timer.d5.c Thu Jan 9 13:36:15 2003
+++ linux/net/irda/timer.c Thu Jan 9 13:51:03 2003
@@ -39,8 +39,8 @@ static void irlap_query_timer_expired(vo
static void irlap_final_timer_expired(void* data);
static void irlap_wd_timer_expired(void* data);
static void irlap_backoff_timer_expired(void* data);
-
static void irlap_media_busy_expired(void* data);
+
/*
* Function irda_start_timer (timer, timeout)
*
@@ -50,19 +50,18 @@ static void irlap_media_busy_expired(voi
void irda_start_timer(struct timer_list *ptimer, int timeout, void *data,
TIMER_CALLBACK callback)
{
- del_timer(ptimer);
-
- ptimer->data = (unsigned long) data;
-
/*
* For most architectures void * is the same as unsigned long, but
* at least we try to use void * as long as possible. Since the
* timer functions use unsigned long, we cast the function here
*/
ptimer->function = (void (*)(unsigned long)) callback;
- ptimer->expires = jiffies + timeout;
+ ptimer->data = (unsigned long) data;

- add_timer(ptimer);
+ /* Set new value for timer (update or add timer).
+ * We use mod_timer() because it's more efficient and also
+ * safer with respect to race conditions - Jean II */
+ mod_timer(ptimer, jiffies + timeout);
}

void irlap_start_slot_timer(struct irlap_cb *self, int timeout)
@@ -136,8 +135,7 @@ void irlmp_start_idle_timer(struct lap_c
void irlmp_stop_idle_timer(struct lap_cb *self)
{
/* If timer is activated, kill it! */
- if(timer_pending(&self->idle_timer))
- del_timer(&self->idle_timer);
+ del_timer(&self->idle_timer);
}

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