From 84d2487df2e91670cf686ead064ec8ec665d2178 Mon Sep 17 00:00:00 2001 From: Lang Cheng Date: Tue, 21 May 2019 14:41:23 +0800 Subject: [PATCH] RDMA/hns: move spin_lock_irqsave to hw_v1.ko when hip06 set gid driver inclusion category: bugfix bugzilla: NA CVE: NA 1.When hip08 set gid, hw_v2.ko will call spin_unlock_bh when send cmq. if main.ko call spin_lock_irqsave firstly, and the kernel is before commit f71b74bca637 ("irq/softirqs: Use lockdep to assert IRQs are disabled/enabled"), it will cause WARN_ON_ONCE because of calling spin_unlock_bh in disable context. 2. In fact, the spin_lock_irqsave in main.ko is only used for hip06, and should be placed in hns_roce_hw_v1.c. hns_roce_hw_v2.c uses its own spin_unlock_bh and does not need main.ko manage spin_lock. Fixes: 29b3d4fe7fc3 ("RDMA/hns:Remove redundant spin_lock operations") Feature or Bugfix:Bugfix Signed-off-by: Lang Cheng Reviewed-by: oulijun Reviewed-by: liuyixian Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 5 +++++ drivers/infiniband/hw/hns/hns_roce_main.c | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c index 87e519f514ee..6f308c69d4b1 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c @@ -1812,9 +1812,12 @@ static int hns_roce_v1_set_gid(struct hns_roce_dev *hr_dev, u8 port, { u32 *p = NULL; u8 gid_idx = 0; + unsigned long flags; gid_idx = hns_get_gid_index(hr_dev, port, gid_index); + spin_lock_irqsave(&hr_dev->iboe.lock, flags); + p = (u32 *)&gid->raw[0]; roce_raw_write(*p, hr_dev->reg_base + ROCEE_PORT_GID_L_0_REG + (HNS_ROCE_V1_GID_NUM * gid_idx)); @@ -1831,6 +1834,8 @@ static int hns_roce_v1_set_gid(struct hns_roce_dev *hr_dev, u8 port, roce_raw_write(*p, hr_dev->reg_base + ROCEE_PORT_GID_H_0_REG + (HNS_ROCE_V1_GID_NUM * gid_idx)); + spin_unlock_irqrestore(&hr_dev->iboe.lock, flags); + return 0; } diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c index 7308c950ebf0..1ad25e9491d8 100644 --- a/drivers/infiniband/hw/hns/hns_roce_main.c +++ b/drivers/infiniband/hw/hns/hns_roce_main.c @@ -99,7 +99,6 @@ static int hns_roce_add_gid(const union ib_gid *gid, { struct hns_roce_dev *hr_dev = to_hr_dev(attr->device); u8 port = attr->port_num - 1; - unsigned long flags; int ret; if (port >= hr_dev->caps.num_ports || @@ -109,7 +108,6 @@ static int hns_roce_add_gid(const union ib_gid *gid, return -EINVAL; } - spin_lock_irqsave(&hr_dev->iboe.lock, flags); #ifdef CONFIG_KERNEL_419 ret = hr_dev->hw->set_gid(hr_dev, port, attr->index, &attr->gid, attr); #else @@ -121,8 +119,6 @@ static int hns_roce_add_gid(const union ib_gid *gid, dev_err(hr_dev->dev, "set gid failed(%d), index = %d", ret, attr->index); - spin_unlock_irqrestore(&hr_dev->iboe.lock, flags); - return ret; } -- GitLab