From: Alex Rosenbaum <al...@mellanox.com> Replace ibv_exp_poll_cq() with direct function call to improve performance.
Signed-off-by: Alex Rosenbaum <Alexr at mellanox.com> Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com> --- drivers/net/mlx4/mlx4.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 3210120..1b86e58 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -196,6 +196,8 @@ struct rxq { struct ibv_mr *mr; /* Memory Region (for mp). */ struct ibv_cq *cq; /* Completion Queue. */ struct ibv_qp *qp; /* Queue Pair. */ + /* Faster callbacks that bypass Verbs. */ + drv_exp_poll_cq_func ibv_exp_poll_cq; /* * There is exactly one flow configured per MAC address. Each flow * may contain several specifications, one per configured VLAN ID. @@ -2386,7 +2388,7 @@ mlx4_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) return mlx4_rx_burst(dpdk_rxq, pkts, pkts_n); if (unlikely(elts == NULL)) /* See RTE_DEV_CMD_SET_MTU. */ return 0; - wcs_n = ibv_exp_poll_cq(rxq->cq, pkts_n, wcs, sizeof(wcs[0])); + wcs_n = rxq->ibv_exp_poll_cq(rxq->cq, pkts_n, wcs, sizeof(wcs[0])); if (unlikely(wcs_n == 0)) return 0; if (unlikely(wcs_n < 0)) { @@ -2576,7 +2578,7 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) if (unlikely(rxq->sp)) return mlx4_rx_burst_sp(dpdk_rxq, pkts, pkts_n); - wcs_n = ibv_exp_poll_cq(rxq->cq, pkts_n, wcs, sizeof(wcs[0])); + wcs_n = rxq->ibv_exp_poll_cq(rxq->cq, pkts_n, wcs, sizeof(wcs[0])); if (unlikely(wcs_n == 0)) return 0; if (unlikely(wcs_n < 0)) { @@ -3213,6 +3215,13 @@ skip_alloc: /* Save port ID. */ tmpl.port_id = dev->data->port_id; DEBUG("%p: RTE port ID: %u", (void *)rxq, tmpl.port_id); + tmpl.ibv_exp_poll_cq = (drv_exp_poll_cq_func)(uintptr_t) + ibv_exp_get_provider_func(tmpl.cq->context, + IBV_EXP_POLL_CQ_FUNC); + if (tmpl.ibv_exp_poll_cq == NULL) { + ERROR("%p: cannot retrieve IBV_EXP_POLL_CQ_FUNC", (void *)dev); + goto error; + } /* Clean up rxq in case we're reinitializing it. */ DEBUG("%p: cleaning-up old rxq just in case", (void *)rxq); rxq_cleanup(rxq); -- 2.1.0