scsi: lpfc: Fix lockdep warning for rx_monitor lock when unloading driver
authorJustin Tee <justin.tee@broadcom.com>
Wed, 1 Mar 2023 23:16:19 +0000 (15:16 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 10 Mar 2023 02:21:44 +0000 (21:21 -0500)
Lockdep enabled kernels report a theoretical deadlock state where the
cmf_timer interrupt occurs while the rx_monitor ring is being destroyed.

During rmmod, the cmf_timer is cancelled prior to the
lpfc_rx_monitor_destroy_ring call.  This actually eliminates the need to
take the rx_monitor ring lock in lpfc_rx_monitor_destroy_ring.  Thus, just
remove lock/unlock of rx_monitor in lpfc_rx_monitor_destroy_ring.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20230301231626.9621-4-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_sli.c

index bfab1f0fb3f0d0a4408183258b042c81c55f3143..c8b4632e3dd4d670b0702ff1c4f2418c2cc034f9 100644 (file)
@@ -8080,16 +8080,16 @@ int lpfc_rx_monitor_create_ring(struct lpfc_rx_info_monitor *rx_monitor,
 /**
  * lpfc_rx_monitor_destroy_ring - Free ring buffer for rx_monitor
  * @rx_monitor: Pointer to lpfc_rx_info_monitor object
+ *
+ * Called after cancellation of cmf_timer.
  **/
 void lpfc_rx_monitor_destroy_ring(struct lpfc_rx_info_monitor *rx_monitor)
 {
-       spin_lock(&rx_monitor->lock);
        kfree(rx_monitor->ring);
        rx_monitor->ring = NULL;
        rx_monitor->entries = 0;
        rx_monitor->head_idx = 0;
        rx_monitor->tail_idx = 0;
-       spin_unlock(&rx_monitor->lock);
 }
 
 /**