net/mlx5e: Rx, Split rep rx mpwqe handler from nic
authorPaul Blakey <paulb@mellanox.com>
Sun, 16 Feb 2020 10:01:29 +0000 (12:01 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 20 Feb 2020 01:49:48 +0000 (17:49 -0800)
Copy the current rep mpwqe rx handler which is also used by nic
profile. In the next patch, we will add rep specific logic, just
for the rep profile rx handler.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

index 7b48ccacebe29bdaf7a46f610869bec31e469b34..ad426e09774080c2d9ca7872f9a272cce9204696 100644 (file)
@@ -1921,7 +1921,7 @@ static const struct mlx5e_profile mlx5e_rep_profile = {
        .update_rx              = mlx5e_update_rep_rx,
        .update_stats           = mlx5e_update_ndo_stats,
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe_rep,
-       .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
+       .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq_rep,
        .max_tc                 = 1,
        .rq_groups              = MLX5E_NUM_RQ_GROUPS(REGULAR),
        .stats_grps             = mlx5e_rep_stats_grps,
@@ -1941,7 +1941,7 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
        .update_stats           = mlx5e_update_ndo_stats,
        .update_carrier         = mlx5e_update_carrier,
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe_rep,
-       .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
+       .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq_rep,
        .max_tc                 = MLX5E_MAX_NUM_TC,
        .rq_groups              = MLX5E_NUM_RQ_GROUPS(REGULAR),
        .stats_grps             = mlx5e_ul_rep_stats_grps,
index 3f756d51435f59daa2b8cb8f776d1ebe7122fbd7..6ff7d901d7083b6ef206b37834ff0cb6ceb7bf28 100644 (file)
@@ -191,6 +191,8 @@ int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv);
 void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv);
 
 void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
+void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq,
+                                  struct mlx5_cqe64 *cqe);
 
 int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv,
                                 struct mlx5e_encap_entry *e);
index 1c3ab69cbd9690385da934ad7b63177bf10a7049..454ce4c38b06af3719e5235fcda79bed141bf793 100644 (file)
@@ -1232,6 +1232,60 @@ free_wqe:
 wq_cyc_pop:
        mlx5_wq_cyc_pop(wq);
 }
+
+void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq,
+                                  struct mlx5_cqe64 *cqe)
+{
+       u16 cstrides       = mpwrq_get_cqe_consumed_strides(cqe);
+       u16 wqe_id         = be16_to_cpu(cqe->wqe_id);
+       struct mlx5e_mpw_info *wi = &rq->mpwqe.info[wqe_id];
+       u16 stride_ix      = mpwrq_get_cqe_stride_index(cqe);
+       u32 wqe_offset     = stride_ix << rq->mpwqe.log_stride_sz;
+       u32 head_offset    = wqe_offset & (PAGE_SIZE - 1);
+       u32 page_idx       = wqe_offset >> PAGE_SHIFT;
+       struct mlx5e_rx_wqe_ll *wqe;
+       struct mlx5_wq_ll *wq;
+       struct sk_buff *skb;
+       u16 cqe_bcnt;
+
+       wi->consumed_strides += cstrides;
+
+       if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
+               trigger_report(rq, cqe);
+               rq->stats->wqe_err++;
+               goto mpwrq_cqe_out;
+       }
+
+       if (unlikely(mpwrq_is_filler_cqe(cqe))) {
+               struct mlx5e_rq_stats *stats = rq->stats;
+
+               stats->mpwqe_filler_cqes++;
+               stats->mpwqe_filler_strides += cstrides;
+               goto mpwrq_cqe_out;
+       }
+
+       cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
+
+       skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq,
+                             mlx5e_skb_from_cqe_mpwrq_linear,
+                             mlx5e_skb_from_cqe_mpwrq_nonlinear,
+                             rq, wi, cqe_bcnt, head_offset, page_idx);
+       if (!skb)
+               goto mpwrq_cqe_out;
+
+       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+
+       napi_gro_receive(rq->cq.napi, skb);
+
+mpwrq_cqe_out:
+       if (likely(wi->consumed_strides < rq->mpwqe.num_strides))
+               return;
+
+       wq  = &rq->mpwqe.wq;
+       wqe = mlx5_wq_ll_get_wqe(wq, wqe_id);
+       mlx5e_free_rx_mpwqe(rq, wi, true);
+       mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index);
+}
 #endif
 
 struct sk_buff *