usbip: vudc: Don't enable IRQs prematurely
Subsystems (3)
PATCH 1/1 usbip: vudc: Don't enable IRQs prematurely
This code does:
spin_unlock_irq(&udc->ud.lock); spin_unlock_irqrestore(&udc->lock, flags);
which does not make sense. In theory, the first unlock could enable IRQs and then the second _irqrestore could disable them again. There would be a brief momemt where IRQs were enabled improperly.
In real life, however, this function is always called with IRQs enabled and the bug does not affect runtime.
---
An alternative fix would be to make changes below and also change the outside _irqsave/_irqrestore() to just _irq(). However, that's more invasive and riskier with no upside.
drivers/usb/usbip/vudc_sysfs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/usb/usbip/vudc_sysfs.c +7 -7
@@ -128,7 +128,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, goto unlock; } -spin_lock_irq (&udc->ud.lock); +spin_lock (&udc->ud.lock);if (udc->ud.status !=SDEV_ST_AVAILABLE ) { ret = -EINVAL ;
@@ -150,7 +150,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, }/* unlock and create threads and get tasks */ -spin_unlock_irq (&udc->ud.lock); +spin_unlock (&udc->ud.lock);spin_unlock_irqrestore (&udc->lock, flags); tcp_rx =kthread_create (&v_rx_loop, &udc->ud,"vudc_rx" );
@@ -173,14 +173,14 @@ static ssize_t usbip_sockfd_store(struct device *dev,/* lock and update udc->ud state */ spin_lock_irqsave (&udc->lock, flags); -spin_lock_irq (&udc->ud.lock); +spin_lock (&udc->ud.lock); udc->ud.tcp_socket = socket; udc->ud.tcp_rx = tcp_rx; udc->ud.tcp_tx = tcp_tx; udc->ud.status =SDEV_ST_USED ; -spin_unlock_irq (&udc->ud.lock); +spin_unlock (&udc->ud.lock);ktime_get_ts64 (&udc->start_time);v_start_timer (udc);
@@ -201,12 +201,12 @@ static ssize_t usbip_sockfd_store(struct device *dev, goto unlock; } -spin_lock_irq (&udc->ud.lock); +spin_lock (&udc->ud.lock);if (udc->ud.status !=SDEV_ST_USED ) { ret = -EINVAL ; goto unlock_ud; } -spin_unlock_irq (&udc->ud.lock); +spin_unlock (&udc->ud.lock);usbip_event_add (&udc->ud,VUDC_EVENT_DOWN ); }
@@ -219,7 +219,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, sock_err:sockfd_put (socket); unlock_ud: -spin_unlock_irq (&udc->ud.lock); +spin_unlock (&udc->ud.lock); unlock:spin_unlock_irqrestore (&udc->lock, flags);mutex_unlock (&udc->ud.sysfs_lock);
Signature · 1 line
2.35.1
Quoted 9 lines · Dan Carpenter
This code does:
spin_unlock_irq(&udc->ud.lock); spin_unlock_irqrestore(&udc->lock, flags);which does not make sense. In theory, the first unlock could enable IRQs and then the second
_irqrestorecould disable them again. There would be a brief momemt where IRQs were enabled improperly.
Quoted 9 lines
In real life, however, this function is always called with IRQs enabled and the bug does not affect runtime.
Signed-off-by Dan Carpenter <[email protected]>---
An alternative fix would be to make changes below and also change the outside _irqsave/_irqrestore() to just_irq(). However, that's more invasive and riskier with no upside.
Thank you for the patch.
Greg, please pick this up.
thanks,
-- Shuah