Patch "RDMA/hns: Fix spin_unlock_irqrestore() called with IRQs enabled" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    RDMA/hns: Fix spin_unlock_irqrestore() called with IRQs enabled

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rdma-hns-fix-spin_unlock_irqrestore-called-with-irqs.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b6ee12f2a3d410bee203be72fe0eeedbb5469d7f
Author: Chengchang Tang <tangchengchang@xxxxxxxxxx>
Date:   Fri Sep 6 17:34:40 2024 +0800

    RDMA/hns: Fix spin_unlock_irqrestore() called with IRQs enabled
    
    [ Upstream commit 74d315b5af180220d561684d15897730135733a6 ]
    
    Fix missuse of spin_lock_irq()/spin_unlock_irq() when
    spin_lock_irqsave()/spin_lock_irqrestore() was hold.
    
    This was discovered through the lock debugging, and the corresponding
    log is as follows:
    
    raw_local_irq_restore() called with IRQs enabled
    WARNING: CPU: 96 PID: 2074 at kernel/locking/irqflag-debug.c:10 warn_bogus_irq_restore+0x30/0x40
    ...
    Call trace:
     warn_bogus_irq_restore+0x30/0x40
     _raw_spin_unlock_irqrestore+0x84/0xc8
     add_qp_to_list+0x11c/0x148 [hns_roce_hw_v2]
     hns_roce_create_qp_common.constprop.0+0x240/0x780 [hns_roce_hw_v2]
     hns_roce_create_qp+0x98/0x160 [hns_roce_hw_v2]
     create_qp+0x138/0x258
     ib_create_qp_kernel+0x50/0xe8
     create_mad_qp+0xa8/0x128
     ib_mad_port_open+0x218/0x448
     ib_mad_init_device+0x70/0x1f8
     add_client_context+0xfc/0x220
     enable_device_and_get+0xd0/0x140
     ib_register_device.part.0+0xf4/0x1c8
     ib_register_device+0x34/0x50
     hns_roce_register_device+0x174/0x3d0 [hns_roce_hw_v2]
     hns_roce_init+0xfc/0x2c0 [hns_roce_hw_v2]
     __hns_roce_hw_v2_init_instance+0x7c/0x1d0 [hns_roce_hw_v2]
     hns_roce_hw_v2_init_instance+0x9c/0x180 [hns_roce_hw_v2]
    
    Fixes: 9a4435375cd1 ("IB/hns: Add driver files for hns RoCE driver")
    Signed-off-by: Chengchang Tang <tangchengchang@xxxxxxxxxx>
    Signed-off-by: Junxian Huang <huangjunxian6@xxxxxxxxxxxxx>
    Link: https://patch.msgid.link/20240906093444.3571619-6-huangjunxian6@xxxxxxxxxxxxx
    Signed-off-by: Leon Romanovsky <leon@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index 1a6de9a9e57c1..0cd2f778cdffc 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -1287,19 +1287,19 @@ void hns_roce_lock_cqs(struct hns_roce_cq *send_cq, struct hns_roce_cq *recv_cq)
 		__acquire(&send_cq->lock);
 		__acquire(&recv_cq->lock);
 	} else if (unlikely(send_cq != NULL && recv_cq == NULL)) {
-		spin_lock_irq(&send_cq->lock);
+		spin_lock(&send_cq->lock);
 		__acquire(&recv_cq->lock);
 	} else if (unlikely(send_cq == NULL && recv_cq != NULL)) {
-		spin_lock_irq(&recv_cq->lock);
+		spin_lock(&recv_cq->lock);
 		__acquire(&send_cq->lock);
 	} else if (send_cq == recv_cq) {
-		spin_lock_irq(&send_cq->lock);
+		spin_lock(&send_cq->lock);
 		__acquire(&recv_cq->lock);
 	} else if (send_cq->cqn < recv_cq->cqn) {
-		spin_lock_irq(&send_cq->lock);
+		spin_lock(&send_cq->lock);
 		spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
 	} else {
-		spin_lock_irq(&recv_cq->lock);
+		spin_lock(&recv_cq->lock);
 		spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
 	}
 }
@@ -1319,13 +1319,13 @@ void hns_roce_unlock_cqs(struct hns_roce_cq *send_cq,
 		spin_unlock(&recv_cq->lock);
 	} else if (send_cq == recv_cq) {
 		__release(&recv_cq->lock);
-		spin_unlock_irq(&send_cq->lock);
+		spin_unlock(&send_cq->lock);
 	} else if (send_cq->cqn < recv_cq->cqn) {
 		spin_unlock(&recv_cq->lock);
-		spin_unlock_irq(&send_cq->lock);
+		spin_unlock(&send_cq->lock);
 	} else {
 		spin_unlock(&send_cq->lock);
-		spin_unlock_irq(&recv_cq->lock);
+		spin_unlock(&recv_cq->lock);
 	}
 }
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux