On Wed, 2019-10-16 at 15:50 -0700, Jonathan Lemon wrote:
> From: Tariq Toukan <tar...@mellanox.com>
> 
> Obsolete the RX page-cache layer, pages are now recycled
> in page_pool.
> 
> This patch introduce a temporary degradation as recycling
> does not keep the pages DMA-mapped. That is fixed in a
> downstream patch.
Tariq,

i think we need to have performance numbers here to show degradation.
i am sure that non XDP traffic TCP/UDP performance will be hit.

> 
> Issue: 1487631
> Signed-off-by: Tariq Toukan <tar...@mellanox.com>
> 
> Signed-off-by: Jonathan Lemon <jonathan.le...@gmail.com>
> ---
>  drivers/net/ethernet/mellanox/mlx5/core/en.h  | 13 ----
>  .../net/ethernet/mellanox/mlx5/core/en_main.c | 16 -----
>  .../net/ethernet/mellanox/mlx5/core/en_rx.c   | 67 ++---------------
> --
>  3 files changed, 4 insertions(+), 92 deletions(-)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h
> b/drivers/net/ethernet/mellanox/mlx5/core/en.h
> index 8d76452cacdc..0595cdcff594 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
> @@ -583,18 +583,6 @@ struct mlx5e_mpw_info {
>  
>  #define MLX5E_MAX_RX_FRAGS 4
>  
> -/* a single cache unit is capable to serve one napi call (for non-
> striding rq)
> - * or a MPWQE (for striding rq).
> - */
> -#define MLX5E_CACHE_UNIT     (MLX5_MPWRQ_PAGES_PER_WQE >
> NAPI_POLL_WEIGHT ? \
> -                              MLX5_MPWRQ_PAGES_PER_WQE :
> NAPI_POLL_WEIGHT)
> -#define MLX5E_CACHE_SIZE     (4 *
> roundup_pow_of_two(MLX5E_CACHE_UNIT))
> -struct mlx5e_page_cache {
> -     u32 head;
> -     u32 tail;
> -     struct mlx5e_dma_info page_cache[MLX5E_CACHE_SIZE];
> -};
> -
>  struct mlx5e_rq;
>  typedef void (*mlx5e_fp_handle_rx_cqe)(struct mlx5e_rq*, struct
> mlx5_cqe64*);
>  typedef struct sk_buff *
> @@ -658,7 +646,6 @@ struct mlx5e_rq {
>       struct mlx5e_rq_stats *stats;
>       struct mlx5e_cq        cq;
>       struct mlx5e_cq_decomp cqd;
> -     struct mlx5e_page_cache page_cache;
>       struct hwtstamp_config *tstamp;
>       struct mlx5_clock      *clock;
>  
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> index 7569287f8f3c..168be1f800a3 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> @@ -612,9 +612,6 @@ static int mlx5e_alloc_rq(struct mlx5e_channel
> *c,
>               rq->dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
>       }
>  
> -     rq->page_cache.head = 0;
> -     rq->page_cache.tail = 0;
> -
>       return 0;
>  
>  err_free:
> @@ -640,8 +637,6 @@ static int mlx5e_alloc_rq(struct mlx5e_channel
> *c,
>  
>  static void mlx5e_free_rq(struct mlx5e_rq *rq)
>  {
> -     int i;
> -
>       if (rq->xdp_prog)
>               bpf_prog_put(rq->xdp_prog);
>  
> @@ -655,17 +650,6 @@ static void mlx5e_free_rq(struct mlx5e_rq *rq)
>               mlx5e_free_di_list(rq);
>       }
>  
> -     for (i = rq->page_cache.head; i != rq->page_cache.tail;
> -          i = (i + 1) & (MLX5E_CACHE_SIZE - 1)) {
> -             struct mlx5e_dma_info *dma_info = &rq-
> >page_cache.page_cache[i];
> -
> -             /* With AF_XDP, page_cache is not used, so this loop is
> not
> -              * entered, and it's safe to call
> mlx5e_page_release_dynamic
> -              * directly.
> -              */
> -             mlx5e_page_release_dynamic(rq, dma_info, false);
> -     }
> -
>       xdp_rxq_info_unreg(&rq->xdp_rxq);
>       page_pool_destroy(rq->page_pool);
>       mlx5_wq_destroy(&rq->wq_ctrl);
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> index d6a547238de0..a3773f8a4931 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> @@ -184,65 +184,9 @@ static inline u32
> mlx5e_decompress_cqes_start(struct mlx5e_rq *rq,
>       return mlx5e_decompress_cqes_cont(rq, wq, 1, budget_rem) - 1;
>  }
>  
> -static inline bool mlx5e_page_is_reserved(struct page *page)
> -{
> -     return page_is_pfmemalloc(page) || page_to_nid(page) !=
> numa_mem_id();
> -}
> -
> -static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
> -                                   struct mlx5e_dma_info *dma_info)
> -{
> -     struct mlx5e_page_cache *cache = &rq->page_cache;
> -     u32 tail_next = (cache->tail + 1) & (MLX5E_CACHE_SIZE - 1);
> -     struct mlx5e_rq_stats *stats = rq->stats;
> -
> -     if (tail_next == cache->head) {
> -             stats->cache_full++;
> -             return false;
> -     }
> -
> -     if (unlikely(mlx5e_page_is_reserved(dma_info->page))) {
> -             stats->cache_waive++;
> -             return false;
> -     }
> -
> -     cache->page_cache[cache->tail] = *dma_info;
> -     cache->tail = tail_next;
> -     return true;
> -}
> -
> -static inline bool mlx5e_rx_cache_get(struct mlx5e_rq *rq,
> -                                   struct mlx5e_dma_info *dma_info)
> -{
> -     struct mlx5e_page_cache *cache = &rq->page_cache;
> -     struct mlx5e_rq_stats *stats = rq->stats;
> -
> -     if (unlikely(cache->head == cache->tail)) {
> -             stats->cache_empty++;
> -             return false;
> -     }
> -
> -     if (page_ref_count(cache->page_cache[cache->head].page) != 1) {
> -             stats->cache_busy++;
> -             return false;
> -     }
> -
> -     *dma_info = cache->page_cache[cache->head];
> -     cache->head = (cache->head + 1) & (MLX5E_CACHE_SIZE - 1);
> -     stats->cache_reuse++;
> -
> -     dma_sync_single_for_device(rq->pdev, dma_info->addr,
> -                                PAGE_SIZE,
> -                                DMA_FROM_DEVICE);
> -     return true;
> -}
> -
>  static inline int mlx5e_page_alloc_pool(struct mlx5e_rq *rq,
>                                       struct mlx5e_dma_info
> *dma_info)
>  {
> -     if (mlx5e_rx_cache_get(rq, dma_info))
> -             return 0;
> -
>       dma_info->page = page_pool_dev_alloc_pages(rq->page_pool);
>       if (unlikely(!dma_info->page))
>               return -ENOMEM;
> @@ -276,14 +220,11 @@ void mlx5e_page_release_dynamic(struct mlx5e_rq
> *rq,
>                               struct mlx5e_dma_info *dma_info,
>                               bool recycle)
>  {
> -     if (likely(recycle)) {
> -             if (mlx5e_rx_cache_put(rq, dma_info))
> -                     return;
> +     mlx5e_page_dma_unmap(rq, dma_info);
>  
> -             mlx5e_page_dma_unmap(rq, dma_info);
> +     if (likely(recycle)) {
>               page_pool_recycle_direct(rq->page_pool, dma_info-
> >page);
>       } else {
> -             mlx5e_page_dma_unmap(rq, dma_info);
>               page_pool_release_page(rq->page_pool, dma_info->page);
>               put_page(dma_info->page);
>       }
> @@ -1167,7 +1108,7 @@ void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq,
> struct mlx5_cqe64 *cqe)
>       if (!skb) {
>               /* probably for XDP */
>               if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq-
> >flags)) {
> -                     /* do not return page to cache,
> +                     /* do not return page to pool,
>                        * it will be returned on XDP_TX completion.
>                        */
>                       goto wq_cyc_pop;
> @@ -1210,7 +1151,7 @@ void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq
> *rq, struct mlx5_cqe64 *cqe)
>       if (!skb) {
>               /* probably for XDP */
>               if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq-
> >flags)) {
> -                     /* do not return page to cache,
> +                     /* do not return page to pool,
>                        * it will be returned on XDP_TX completion.
>                        */
>                       goto wq_cyc_pop;

Reply via email to