mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
comedi: jr3_pci: Fix synchronous deletion of timer
commit 44d9b3f584c59a606b521e7274e658d5b866c699 upstream.
When `jr3_pci_detach()` is called during device removal, it calls
`timer_delete_sync()` to stop the timer, but the timer expiry function
always reschedules the timer, so the synchronization is ineffective.
Call `timer_shutdown_sync()` instead. It does not matter that the timer
expiry function pointer is cleared, because the device is being removed.
Fixes: 07b509e658 ("Staging: comedi: add jr3_pci driver")
Cc: stable <stable@kernel.org>
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://lore.kernel.org/r/20250415123901.13483-1-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
63d956acbf
commit
3a57f45b91
@@ -87,6 +87,7 @@ struct jr3_pci_poll_delay {
|
||||
struct jr3_pci_dev_private {
|
||||
struct timer_list timer;
|
||||
struct comedi_device *dev;
|
||||
bool timer_enable;
|
||||
};
|
||||
|
||||
union jr3_pci_single_range {
|
||||
@@ -596,10 +597,11 @@ static void jr3_pci_poll_dev(struct timer_list *t)
|
||||
delay = sub_delay.max;
|
||||
}
|
||||
}
|
||||
if (devpriv->timer_enable) {
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
|
||||
add_timer(&devpriv->timer);
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->spinlock, flags);
|
||||
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
|
||||
add_timer(&devpriv->timer);
|
||||
}
|
||||
|
||||
static struct jr3_pci_subdev_private *
|
||||
@@ -748,6 +750,7 @@ static int jr3_pci_auto_attach(struct comedi_device *dev,
|
||||
devpriv->dev = dev;
|
||||
timer_setup(&devpriv->timer, jr3_pci_poll_dev, 0);
|
||||
devpriv->timer.expires = jiffies + msecs_to_jiffies(1000);
|
||||
devpriv->timer_enable = true;
|
||||
add_timer(&devpriv->timer);
|
||||
|
||||
return 0;
|
||||
@@ -757,8 +760,12 @@ static void jr3_pci_detach(struct comedi_device *dev)
|
||||
{
|
||||
struct jr3_pci_dev_private *devpriv = dev->private;
|
||||
|
||||
if (devpriv)
|
||||
del_timer_sync(&devpriv->timer);
|
||||
if (devpriv) {
|
||||
spin_lock_bh(&dev->spinlock);
|
||||
devpriv->timer_enable = false;
|
||||
spin_unlock_bh(&dev->spinlock);
|
||||
timer_delete_sync(&devpriv->timer);
|
||||
}
|
||||
|
||||
comedi_pci_detach(dev);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user