]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hinic3: Add msg_send_lock for message sending concurrecy
authorFan Gong <gongfan1@huawei.com>
Tue, 10 Mar 2026 01:04:53 +0000 (09:04 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 12 Mar 2026 11:13:48 +0000 (12:13 +0100)
As send_mbox_msg is invoked by 3 functions: hinic3_send_mbox_to_mgmt,
hinic3_response_mbox_to_mgmt and hinic3_send_mbox_to_mgmt_no_ack, only
hinic3_response_mbox_to_mgmt does not has mutex and the other two has
mbox->mbox_send_lock because their send actions are mutually exclusive.
  As hinic3_response_mbox_to_mgmt does not conflict with them in send
actions but in mailbox resources, add the new mutex(msg_send_lock) in
send_mbox_msg to ensure message concurrency.

  Besdies, in mbox_send_seg change FIELD_PREP to FIELD_GET in
MBOX_STATUS_FINISHED and MBOX_STATUS_SUCCESS to be more reasonable.

Co-developed-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Fan Gong <gongfan1@huawei.com>
Link: https://patch.msgid.link/d83f7f6eb4b5e94642a558fab75d61292c347e48.1773062356.git.zhuyikai1@h-partners.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/huawei/hinic3/hinic3_mbox.c
drivers/net/ethernet/huawei/hinic3/hinic3_mbox.h

index c82370cf401ddce23416c910c46200450812f701..51be726d9d2edea9b63611366c0a2065d1166454 100644 (file)
@@ -51,9 +51,9 @@
 #define MBOX_WB_STATUS_NOT_FINISHED      0x00
 
 #define MBOX_STATUS_FINISHED(wb)  \
-       ((FIELD_PREP(MBOX_WB_STATUS_MASK, (wb))) != MBOX_WB_STATUS_NOT_FINISHED)
+       ((FIELD_GET(MBOX_WB_STATUS_MASK, (wb))) != MBOX_WB_STATUS_NOT_FINISHED)
 #define MBOX_STATUS_SUCCESS(wb)  \
-       ((FIELD_PREP(MBOX_WB_STATUS_MASK, (wb))) ==  \
+       ((FIELD_GET(MBOX_WB_STATUS_MASK, (wb))) ==  \
        MBOX_WB_STATUS_FINISHED_SUCCESS)
 #define MBOX_STATUS_ERRCODE(wb)  \
        ((wb) & MBOX_WB_ERROR_CODE_MASK)
@@ -396,6 +396,7 @@ static int hinic3_mbox_pre_init(struct hinic3_hwdev *hwdev,
 {
        mbox->hwdev = hwdev;
        mutex_init(&mbox->mbox_send_lock);
+       mutex_init(&mbox->mbox_seg_send_lock);
        spin_lock_init(&mbox->mbox_lock);
 
        mbox->workq = create_singlethread_workqueue(HINIC3_MBOX_WQ_NAME);
@@ -723,6 +724,8 @@ static int send_mbox_msg(struct hinic3_mbox *mbox, u8 mod, u16 cmd,
        else
                rsp_aeq_id = 0;
 
+       mutex_lock(&mbox->mbox_seg_send_lock);
+
        if (dst_func == MBOX_MGMT_FUNC_ID &&
            !(hwdev->features[0] & MBOX_COMM_F_MBOX_SEGMENT)) {
                err = mbox_prepare_dma_msg(mbox, ack_type, &dma_msg,
@@ -776,6 +779,8 @@ static int send_mbox_msg(struct hinic3_mbox *mbox, u8 mod, u16 cmd,
        }
 
 err_send:
+       mutex_unlock(&mbox->mbox_seg_send_lock);
+
        return err;
 }
 
index e26f22d1d5641fcf671f6fc47a74120cf5d62caf..30de0c1295038434eb96a3d19d11612d591c6058 100644 (file)
@@ -114,6 +114,10 @@ struct hinic3_mbox {
        struct hinic3_hwdev       *hwdev;
        /* lock for send mbox message and ack message */
        struct mutex              mbox_send_lock;
+       /* lock for send message transmission.
+        * The lock hierarchy is mbox_send_lock -> mbox_seg_send_lock.
+        */
+       struct mutex              mbox_seg_send_lock;
        struct hinic3_send_mbox   send_mbox;
        struct mbox_dma_queue     sync_msg_queue;
        struct mbox_dma_queue     async_msg_queue;