mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 20:19:44 +00:00
hw/rdma: Add ability to force notification without re-arm
Upon completion of incoming packet the device pushes CQE to driver's RX ring and notify the driver (msix). While for data-path incoming packets the driver needs the ability to control whether it wished to receive interrupts or not, for control-path packets such as incoming MAD the driver needs to be notified anyway, it even do not need to re-arm the notification bit. Enhance the notification field to support this. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
This commit is contained in:
parent
a5d2f6f877
commit
4082e533f6
@ -263,7 +263,7 @@ int rdma_rm_alloc_cq(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cq->opaque = opaque;
|
cq->opaque = opaque;
|
||||||
cq->notify = false;
|
cq->notify = CNT_CLEAR;
|
||||||
|
|
||||||
rc = rdma_backend_create_cq(backend_dev, &cq->backend_cq, cqe);
|
rc = rdma_backend_create_cq(backend_dev, &cq->backend_cq, cqe);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@ -291,7 +291,10 @@ void rdma_rm_req_notify_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cq->notify = notify;
|
if (cq->notify != CNT_SET) {
|
||||||
|
cq->notify = notify ? CNT_ARM : CNT_CLEAR;
|
||||||
|
}
|
||||||
|
|
||||||
pr_dbg("notify=%d\n", cq->notify);
|
pr_dbg("notify=%d\n", cq->notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,6 +352,11 @@ int rdma_rm_alloc_qp(RdmaDeviceResources *dev_res, uint32_t pd_handle,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (qp_type == IBV_QPT_GSI) {
|
||||||
|
scq->notify = CNT_SET;
|
||||||
|
rcq->notify = CNT_SET;
|
||||||
|
}
|
||||||
|
|
||||||
qp = res_tbl_alloc(&dev_res->qp_tbl, &rm_qpn);
|
qp = res_tbl_alloc(&dev_res->qp_tbl, &rm_qpn);
|
||||||
if (!qp) {
|
if (!qp) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -49,10 +49,16 @@ typedef struct RdmaRmPD {
|
|||||||
uint32_t ctx_handle;
|
uint32_t ctx_handle;
|
||||||
} RdmaRmPD;
|
} RdmaRmPD;
|
||||||
|
|
||||||
|
typedef enum CQNotificationType {
|
||||||
|
CNT_CLEAR,
|
||||||
|
CNT_ARM,
|
||||||
|
CNT_SET,
|
||||||
|
} CQNotificationType;
|
||||||
|
|
||||||
typedef struct RdmaRmCQ {
|
typedef struct RdmaRmCQ {
|
||||||
RdmaBackendCQ backend_cq;
|
RdmaBackendCQ backend_cq;
|
||||||
void *opaque;
|
void *opaque;
|
||||||
bool notify;
|
CQNotificationType notify;
|
||||||
} RdmaRmCQ;
|
} RdmaRmCQ;
|
||||||
|
|
||||||
/* MR (DMA region) */
|
/* MR (DMA region) */
|
||||||
|
@ -89,8 +89,10 @@ static int pvrdma_post_cqe(PVRDMADev *dev, uint32_t cq_handle,
|
|||||||
pvrdma_ring_write_inc(&dev->dsr_info.cq);
|
pvrdma_ring_write_inc(&dev->dsr_info.cq);
|
||||||
|
|
||||||
pr_dbg("cq->notify=%d\n", cq->notify);
|
pr_dbg("cq->notify=%d\n", cq->notify);
|
||||||
if (cq->notify) {
|
if (cq->notify != CNT_CLEAR) {
|
||||||
cq->notify = false;
|
if (cq->notify == CNT_ARM) {
|
||||||
|
cq->notify = CNT_CLEAR;
|
||||||
|
}
|
||||||
post_interrupt(dev, INTR_VEC_CMD_COMPLETION_Q);
|
post_interrupt(dev, INTR_VEC_CMD_COMPLETION_Q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user