> -----Original Message-----
> From: Matan Azrad <ma...@mellanox.com>
> Sent: Tuesday, February 18, 2020 14:25
> To: dev@dpdk.org
> Cc: Slava Ovsiienko <viachesl...@mellanox.com>; Maxime Coquelin
> <maxime.coque...@redhat.com>
> Subject: [PATCH] vdpa/mlx5: fix completion queue arming
> 
> The mlx5 vDPA driver manages QP and CQ in order to forward the HW event
> to the guest by the callfd file descriptor for each virtq.
> 
> The driver arms the CQ for the next CQE index that should be completed by
> the HW in order to create completion event.
> 
> In the SW completion event handler, the driver arms the CQ again for the
> next index,
> 
> The CQE index in the CQ doorbell and in the CQ doorbell record was masked
> incorrectly with the CQ size mask while it should be masked only with
> 0xFFFFFF mask.
> 
> Remove the CQ size mask, stay only with 0xFFFFFF mask.
> 
> Fixes: 8395927cdfaf ("vdpa/mlx5: prepare HW queues")
> 
> Signed-off-by: Matan Azrad <ma...@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>

> ---
>  drivers/vdpa/mlx5/mlx5_vdpa_event.c | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_event.c
> b/drivers/vdpa/mlx5/mlx5_vdpa_event.c
> index c50e58e..17fd9dd 100644
> --- a/drivers/vdpa/mlx5/mlx5_vdpa_event.c
> +++ b/drivers/vdpa/mlx5/mlx5_vdpa_event.c
> @@ -81,9 +81,8 @@
>  static inline void
>  mlx5_vdpa_cq_arm(struct mlx5_vdpa_priv *priv, struct mlx5_vdpa_cq *cq)  {
> -     const unsigned int cqe_mask = (1 << cq->log_desc_n) - 1;
>       uint32_t arm_sn = cq->arm_sn << MLX5_CQ_SQN_OFFSET;
> -     uint32_t cq_ci = cq->cq_ci & MLX5_CI_MASK & cqe_mask;
> +     uint32_t cq_ci = cq->cq_ci & MLX5_CI_MASK;
>       uint32_t doorbell_hi = arm_sn | MLX5_CQ_DBR_CMD_ALL | cq_ci;
>       uint64_t doorbell = ((uint64_t)doorbell_hi << 32) | cq->cq->id;
>       uint64_t db_be = rte_cpu_to_be_64(doorbell); @@ -182,15 +181,15
> @@  {
>       struct mlx5_vdpa_event_qp *eqp =
>                               container_of(cq, struct mlx5_vdpa_event_qp,
> cq);
> -     const unsigned int cqe_size = 1 << cq->log_desc_n;
> -     const unsigned int cqe_mask = cqe_size - 1;
> +     const unsigned int cq_size = 1 << cq->log_desc_n;
> +     const unsigned int cq_mask = cq_size - 1;
>       int ret;
> 
>       do {
>               volatile struct mlx5_cqe *cqe = cq->cqes + (cq->cq_ci &
> -                                                         cqe_mask);
> +                                                         cq_mask);
> 
> -             ret = check_cqe(cqe, cqe_size, cq->cq_ci);
> +             ret = check_cqe(cqe, cq_size, cq->cq_ci);
>               switch (ret) {
>               case MLX5_CQE_STATUS_ERR:
>                       cq->errors++;
> @@ -208,7 +207,7 @@
>       cq->db_rec[0] = rte_cpu_to_be_32(cq->cq_ci);
>       rte_io_wmb();
>       /* Ring SW QP doorbell record. */
> -     eqp->db_rec[0] = rte_cpu_to_be_32(cq->cq_ci + cqe_size);
> +     eqp->db_rec[0] = rte_cpu_to_be_32(cq->cq_ci + cq_size);
>  }
> 
>  static void
> --
> 1.8.3.1

Reply via email to