mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
RDMA/irdma: Add wait for suspend on SQD
[ Upstream commit bd6da690c27d75cae432c09162d054b34fa2156f ]
Currently, there is no wait for the QP suspend to complete on a modify
to SQD state. Add a wait, after the modify to SQD state, for the Suspend
Complete AE. While we are at it, update the suspend timeout value in
irdma_prep_tc_change to use IRDMA_EVENT_TIMEOUT_MS too.
Fixes: b48c24c2d7 ("RDMA/irdma: Implement device supported verb APIs")
Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Link: https://lore.kernel.org/r/20231114170246.238-3-shiraz.saleem@intel.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0b0afd4e14
commit
945bfe4e0b
@@ -322,7 +322,11 @@ static void irdma_process_aeq(struct irdma_pci_f *rf)
|
|||||||
break;
|
break;
|
||||||
case IRDMA_AE_QP_SUSPEND_COMPLETE:
|
case IRDMA_AE_QP_SUSPEND_COMPLETE:
|
||||||
if (iwqp->iwdev->vsi.tc_change_pending) {
|
if (iwqp->iwdev->vsi.tc_change_pending) {
|
||||||
atomic_dec(&iwqp->sc_qp.vsi->qp_suspend_reqs);
|
if (!atomic_dec_return(&qp->vsi->qp_suspend_reqs))
|
||||||
|
wake_up(&iwqp->iwdev->suspend_wq);
|
||||||
|
}
|
||||||
|
if (iwqp->suspend_pending) {
|
||||||
|
iwqp->suspend_pending = false;
|
||||||
wake_up(&iwqp->iwdev->suspend_wq);
|
wake_up(&iwqp->iwdev->suspend_wq);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ static void irdma_prep_tc_change(struct irdma_device *iwdev)
|
|||||||
/* Wait for all qp's to suspend */
|
/* Wait for all qp's to suspend */
|
||||||
wait_event_timeout(iwdev->suspend_wq,
|
wait_event_timeout(iwdev->suspend_wq,
|
||||||
!atomic_read(&iwdev->vsi.qp_suspend_reqs),
|
!atomic_read(&iwdev->vsi.qp_suspend_reqs),
|
||||||
IRDMA_EVENT_TIMEOUT);
|
msecs_to_jiffies(IRDMA_EVENT_TIMEOUT_MS));
|
||||||
irdma_ws_reset(&iwdev->vsi);
|
irdma_ws_reset(&iwdev->vsi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ extern struct auxiliary_driver i40iw_auxiliary_drv;
|
|||||||
|
|
||||||
#define MAX_DPC_ITERATIONS 128
|
#define MAX_DPC_ITERATIONS 128
|
||||||
|
|
||||||
#define IRDMA_EVENT_TIMEOUT 50000
|
#define IRDMA_EVENT_TIMEOUT_MS 5000
|
||||||
#define IRDMA_VCHNL_EVENT_TIMEOUT 100000
|
#define IRDMA_VCHNL_EVENT_TIMEOUT 100000
|
||||||
#define IRDMA_RST_TIMEOUT_HZ 4
|
#define IRDMA_RST_TIMEOUT_HZ 4
|
||||||
|
|
||||||
|
|||||||
@@ -1098,6 +1098,21 @@ static int irdma_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int irdma_wait_for_suspend(struct irdma_qp *iwqp)
|
||||||
|
{
|
||||||
|
if (!wait_event_timeout(iwqp->iwdev->suspend_wq,
|
||||||
|
!iwqp->suspend_pending,
|
||||||
|
msecs_to_jiffies(IRDMA_EVENT_TIMEOUT_MS))) {
|
||||||
|
iwqp->suspend_pending = false;
|
||||||
|
ibdev_warn(&iwqp->iwdev->ibdev,
|
||||||
|
"modify_qp timed out waiting for suspend. qp_id = %d, last_ae = 0x%x\n",
|
||||||
|
iwqp->ibqp.qp_num, iwqp->last_aeq);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* irdma_modify_qp_roce - modify qp request
|
* irdma_modify_qp_roce - modify qp request
|
||||||
* @ibqp: qp's pointer for modify
|
* @ibqp: qp's pointer for modify
|
||||||
@@ -1359,6 +1374,7 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
|||||||
|
|
||||||
info.next_iwarp_state = IRDMA_QP_STATE_SQD;
|
info.next_iwarp_state = IRDMA_QP_STATE_SQD;
|
||||||
issue_modify_qp = 1;
|
issue_modify_qp = 1;
|
||||||
|
iwqp->suspend_pending = true;
|
||||||
break;
|
break;
|
||||||
case IB_QPS_SQE:
|
case IB_QPS_SQE:
|
||||||
case IB_QPS_ERR:
|
case IB_QPS_ERR:
|
||||||
@@ -1399,6 +1415,11 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
|||||||
ctx_info->rem_endpoint_idx = udp_info->arp_idx;
|
ctx_info->rem_endpoint_idx = udp_info->arp_idx;
|
||||||
if (irdma_hw_modify_qp(iwdev, iwqp, &info, true))
|
if (irdma_hw_modify_qp(iwdev, iwqp, &info, true))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (info.next_iwarp_state == IRDMA_QP_STATE_SQD) {
|
||||||
|
ret = irdma_wait_for_suspend(iwqp);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
spin_lock_irqsave(&iwqp->lock, flags);
|
spin_lock_irqsave(&iwqp->lock, flags);
|
||||||
if (iwqp->iwarp_state == info.curr_iwarp_state) {
|
if (iwqp->iwarp_state == info.curr_iwarp_state) {
|
||||||
iwqp->iwarp_state = info.next_iwarp_state;
|
iwqp->iwarp_state = info.next_iwarp_state;
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ struct irdma_qp {
|
|||||||
u8 flush_issued : 1;
|
u8 flush_issued : 1;
|
||||||
u8 sig_all : 1;
|
u8 sig_all : 1;
|
||||||
u8 pau_mode : 1;
|
u8 pau_mode : 1;
|
||||||
|
u8 suspend_pending : 1;
|
||||||
u8 rsvd : 1;
|
u8 rsvd : 1;
|
||||||
u8 iwarp_state;
|
u8 iwarp_state;
|
||||||
u16 term_sq_flush_code;
|
u16 term_sq_flush_code;
|
||||||
|
|||||||
Reference in New Issue
Block a user