mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
hinic3: Add msg_send_lock for message sending concurrecy
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>
This commit is contained in:
parent
0f746fc5bc
commit
2a76f900d1
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user