|
@@ -1205,8 +1205,15 @@ static void ioat_shutdown(struct pci_dev *pdev)
|
|
|
|
|
|
spin_lock_bh(&ioat_chan->prep_lock);
|
|
spin_lock_bh(&ioat_chan->prep_lock);
|
|
set_bit(IOAT_CHAN_DOWN, &ioat_chan->state);
|
|
set_bit(IOAT_CHAN_DOWN, &ioat_chan->state);
|
|
- del_timer_sync(&ioat_chan->timer);
|
|
|
|
spin_unlock_bh(&ioat_chan->prep_lock);
|
|
spin_unlock_bh(&ioat_chan->prep_lock);
|
|
|
|
+ /*
|
|
|
|
+ * Synchronization rule for del_timer_sync():
|
|
|
|
+ * - The caller must not hold locks which would prevent
|
|
|
|
+ * completion of the timer's handler.
|
|
|
|
+ * So prep_lock cannot be held before calling it.
|
|
|
|
+ */
|
|
|
|
+ del_timer_sync(&ioat_chan->timer);
|
|
|
|
+
|
|
/* this should quiesce then reset */
|
|
/* this should quiesce then reset */
|
|
ioat_reset_hw(ioat_chan);
|
|
ioat_reset_hw(ioat_chan);
|
|
}
|
|
}
|