From b8997cfbf06ce12a73a83e761dda020050522c11 Mon Sep 17 00:00:00 2001 From: Chiqijun Date: Wed, 12 Aug 2020 15:05:42 +0000 Subject: [PATCH] net/hinic: Add lock for mgmt channel event_flag driver inclusion category: bugfix bugzilla: 4472 ----------------------------------------------------------------------- event_flag in struct hinic_msg_pf_to_mgmt marks the sending status of the message, add lock for mgmt channel event_flag in hinic_force_complete_all. Signed-off-by: Chiqijun Reviewed-by: Zengweiliang Signed-off-by: Yang Yingliang --- drivers/net/ethernet/huawei/hinic/hinic_hwdev.c | 2 ++ drivers/net/ethernet/huawei/hinic/hinic_mgmt.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hwdev.c b/drivers/net/ethernet/huawei/hinic/hinic_hwdev.c index ed2fce3363a8..e815eec59b45 100644 --- a/drivers/net/ethernet/huawei/hinic/hinic_hwdev.c +++ b/drivers/net/ethernet/huawei/hinic/hinic_hwdev.c @@ -780,10 +780,12 @@ void hinic_force_complete_all(void *hwdev) if (hinic_func_type(dev) != TYPE_VF && hinic_is_hwdev_mod_inited(dev, HINIC_HWDEV_MGMT_INITED)) { recv_resp_msg = &dev->pf_to_mgmt->recv_resp_msg_from_mgmt; + spin_lock_bh(&dev->pf_to_mgmt->sync_event_lock); if (dev->pf_to_mgmt->event_flag == SEND_EVENT_START) { complete(&recv_resp_msg->recv_done); dev->pf_to_mgmt->event_flag = SEND_EVENT_TIMEOUT; } + spin_unlock_bh(&dev->pf_to_mgmt->sync_event_lock); } /* only flush sync cmdq to avoid blocking remove */ diff --git a/drivers/net/ethernet/huawei/hinic/hinic_mgmt.c b/drivers/net/ethernet/huawei/hinic/hinic_mgmt.c index 41e530364f0d..38abf8fe0817 100644 --- a/drivers/net/ethernet/huawei/hinic/hinic_mgmt.c +++ b/drivers/net/ethernet/huawei/hinic/hinic_mgmt.c @@ -80,9 +80,9 @@ static void pf_to_mgmt_send_event_set(struct hinic_msg_pf_to_mgmt *pf_to_mgmt, int event_flag) { - spin_lock(&pf_to_mgmt->sync_event_lock); + spin_lock_bh(&pf_to_mgmt->sync_event_lock); pf_to_mgmt->event_flag = event_flag; - spin_unlock(&pf_to_mgmt->sync_event_lock); + spin_unlock_bh(&pf_to_mgmt->sync_event_lock); } /** @@ -1085,7 +1085,7 @@ static void mgmt_resp_msg_handler(struct hinic_msg_pf_to_mgmt *pf_to_mgmt, if (recv_msg->msg_id & ASYNC_MSG_FLAG) return; - spin_lock(&pf_to_mgmt->sync_event_lock); + spin_lock_bh(&pf_to_mgmt->sync_event_lock); if (recv_msg->msg_id == pf_to_mgmt->sync_msg_id && pf_to_mgmt->event_flag == SEND_EVENT_START) { complete(&recv_msg->recv_done); @@ -1098,7 +1098,7 @@ static void mgmt_resp_msg_handler(struct hinic_msg_pf_to_mgmt *pf_to_mgmt, pf_to_mgmt->sync_msg_id, recv_msg->msg_id, pf_to_mgmt->event_flag); } - spin_unlock(&pf_to_mgmt->sync_event_lock); + spin_unlock_bh(&pf_to_mgmt->sync_event_lock); } static void recv_mgmt_msg_work_handler(struct work_struct *work) -- GitLab