From fe41aca1e4a3a755843887a64d80256cd532d288 Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Wed, 19 Jul 2023 11:56:18 +0530 Subject: [PATCH] usb: gadget: cdev: Fix spinlock recursion Commit c99a841d40aa8 ("usb: gadget: cdev: Add spinlock to synchronize ports->cbits_updated")added spinlock to synchronize ports->cbits_updated which is causing a spinlock recursion in usb_cser_notify_modem. Fix this by unlocking the spinlock before it calls send_modem_ctrl_bits which in turn tries to acquire the same spinlock. Change-Id: I744ea93d7da60aaf27044400cf457cc81dab151d Signed-off-by: Pratham Pratap --- drivers/usb/gadget/function/f_cdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_cdev.c b/drivers/usb/gadget/function/f_cdev.c index 481783ea6968..f1044c29027a 100644 --- a/drivers/usb/gadget/function/f_cdev.c +++ b/drivers/usb/gadget/function/f_cdev.c @@ -1679,6 +1679,7 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) spin_lock_irqsave(&port->port_lock, flags); port->cbits_to_modem = temp; port->cbits_updated = true; + spin_unlock_irqrestore(&port->port_lock, flags); /* if DTR is high, update latest modem info to laptop */ if (port->cbits_to_modem & TIOCM_DTR) { @@ -1691,7 +1692,6 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) cser->send_modem_ctrl_bits(cser, cbits_to_laptop); } - spin_unlock_irqrestore(&port->port_lock, flags); wake_up(&port->read_wq); }