Skip to content

Commit c9ab053

Browse files
pchelkin91gregkh
authored andcommitted
tty: n_gsm: replace kicktimer with delayed_work
A kick_timer timer_list is replaced with kick_timeout delayed_work to be able to synchronize with mutexes as a prerequisite for the introduction of tx_mutex. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: c568f70 ("tty: n_gsm: fix missing timer to handle stalled links") Cc: stable <stable@kernel.org> Reviewed-by: Jiri Slaby <jirislaby@kernel.org> Suggested-by: Hillf Danton <hdanton@sina.com> Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Link: https://lore.kernel.org/r/20220829131640.69254-2-pchelkin@ispras.ru Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4bb1a53 commit c9ab053

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

drivers/tty/n_gsm.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ struct gsm_mux {
256256
struct list_head tx_data_list; /* Pending data packets */
257257

258258
/* Control messages */
259-
struct timer_list kick_timer; /* Kick TX queuing on timeout */
259+
struct delayed_work kick_timeout; /* Kick TX queuing on timeout */
260260
struct timer_list t2_timer; /* Retransmit timer for commands */
261261
int cretries; /* Command retry counter */
262262
struct gsm_control *pending_cmd;/* Our current pending command */
@@ -1009,7 +1009,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
10091009
gsm->tx_bytes += msg->len;
10101010

10111011
gsmld_write_trigger(gsm);
1012-
mod_timer(&gsm->kick_timer, jiffies + 10 * gsm->t1 * HZ / 100);
1012+
schedule_delayed_work(&gsm->kick_timeout, 10 * gsm->t1 * HZ / 100);
10131013
}
10141014

10151015
/**
@@ -1984,16 +1984,16 @@ static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
19841984
}
19851985

19861986
/**
1987-
* gsm_kick_timer - transmit if possible
1988-
* @t: timer contained in our gsm object
1987+
* gsm_kick_timeout - transmit if possible
1988+
* @work: work contained in our gsm object
19891989
*
19901990
* Transmit data from DLCIs if the queue is empty. We can't rely on
19911991
* a tty wakeup except when we filled the pipe so we need to fire off
19921992
* new data ourselves in other cases.
19931993
*/
1994-
static void gsm_kick_timer(struct timer_list *t)
1994+
static void gsm_kick_timeout(struct work_struct *work)
19951995
{
1996-
struct gsm_mux *gsm = from_timer(gsm, t, kick_timer);
1996+
struct gsm_mux *gsm = container_of(work, struct gsm_mux, kick_timeout.work);
19971997
unsigned long flags;
19981998
int sent = 0;
19991999

@@ -2458,7 +2458,7 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc)
24582458
}
24592459

24602460
/* Finish outstanding timers, making sure they are done */
2461-
del_timer_sync(&gsm->kick_timer);
2461+
cancel_delayed_work_sync(&gsm->kick_timeout);
24622462
del_timer_sync(&gsm->t2_timer);
24632463

24642464
/* Finish writing to ldisc */
@@ -2605,7 +2605,7 @@ static struct gsm_mux *gsm_alloc_mux(void)
26052605
kref_init(&gsm->ref);
26062606
INIT_LIST_HEAD(&gsm->tx_ctrl_list);
26072607
INIT_LIST_HEAD(&gsm->tx_data_list);
2608-
timer_setup(&gsm->kick_timer, gsm_kick_timer, 0);
2608+
INIT_DELAYED_WORK(&gsm->kick_timeout, gsm_kick_timeout);
26092609
timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
26102610
INIT_WORK(&gsm->tx_work, gsmld_write_task);
26112611
init_waitqueue_head(&gsm->event);

0 commit comments

Comments
 (0)