@@ -70,6 +70,11 @@ static void qelr_inc_sw_prod_u16(struct qelr_qp_hwq_info *info)
info->prod = (info->prod + 1) % info->max_wr;
}
+static inline int qelr_wq_is_full(struct qelr_qp_hwq_info *info)
+{
+ return (((info->prod + 1) % info->max_wr) == info->cons);
+}
+
int qelr_query_device(struct ibv_context *context,
struct ibv_device_attr *attr)
{
@@ -1144,6 +1149,14 @@ static inline int qelr_can_post_send(struct qelr_devctx *cxt,
return -EINVAL;
}
+ /* WR overflow */
+ if (qelr_wq_is_full(&qp->sq)) {
+ DP_ERR(cxt->dbg_fp,
+ "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
+ qp);
+ return -ENOMEM;
+ }
+
/* WQE overflow */
if (qelr_chain_get_elem_left_u32(&qp->sq.chain) <
QELR_MAX_SQ_WQE_SIZE) {
Post send will fail if it is full, thus preventing an overflow. Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com> --- providers/qedr/qelr_verbs.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)