lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 28 Jul 2020 09:04:32 +0200
From:   Björn Töpel <bjorn.topel@...el.com>
To:     Magnus Karlsson <magnus.karlsson@...el.com>, ast@...nel.org,
        daniel@...earbox.net, netdev@...r.kernel.org,
        jonathan.lemon@...il.com, maximmi@...lanox.com
Cc:     bpf@...r.kernel.org, jeffrey.t.kirsher@...el.com,
        anthony.l.nguyen@...el.com, maciej.fijalkowski@...el.com,
        maciejromanfijalkowski@...il.com, cristian.dumitrescu@...el.com
Subject: Re: [PATCH bpf-next v4 01/14] xsk: i40e: ice: ixgbe: mlx5: pass
 buffer pool to driver instead of umem

On 2020-07-21 07:03, Magnus Karlsson wrote:
> Replace the explicit umem reference passed to the driver in AF_XDP
> zero-copy mode with the buffer pool instead. This in preparation for
> extending the functionality of the zero-copy mode so that umems can be
> shared between queues on the same netdev and also between netdevs. In
> this commit, only an umem reference has been added to the buffer pool
> struct. But later commits will add other entities to it. These are
> going to be entities that are different between different queue ids
> and netdevs even though the umem is shared between them.
> 
> Signed-off-by: Magnus Karlsson <magnus.karlsson@...el.com>

Magnus, this doesn't apply cleanly to bpf-next anymore, unfortunately.

Please rebase, but you can add my:

Acked-by: Björn Töpel <bjorn.topel@...el.com>

> ---
>   drivers/net/ethernet/intel/i40e/i40e_ethtool.c     |   2 +-
>   drivers/net/ethernet/intel/i40e/i40e_main.c        |  29 +--
>   drivers/net/ethernet/intel/i40e/i40e_txrx.c        |  10 +-
>   drivers/net/ethernet/intel/i40e/i40e_txrx.h        |   2 +-
>   drivers/net/ethernet/intel/i40e/i40e_xsk.c         |  81 ++++----
>   drivers/net/ethernet/intel/i40e/i40e_xsk.h         |   4 +-
>   drivers/net/ethernet/intel/ice/ice.h               |  18 +-
>   drivers/net/ethernet/intel/ice/ice_base.c          |  16 +-
>   drivers/net/ethernet/intel/ice/ice_lib.c           |   2 +-
>   drivers/net/ethernet/intel/ice/ice_main.c          |  10 +-
>   drivers/net/ethernet/intel/ice/ice_txrx.c          |   8 +-
>   drivers/net/ethernet/intel/ice/ice_txrx.h          |   2 +-
>   drivers/net/ethernet/intel/ice/ice_xsk.c           | 142 +++++++-------
>   drivers/net/ethernet/intel/ice/ice_xsk.h           |   7 +-
>   drivers/net/ethernet/intel/ixgbe/ixgbe.h           |   2 +-
>   drivers/net/ethernet/intel/ixgbe/ixgbe_main.c      |  34 ++--
>   .../net/ethernet/intel/ixgbe/ixgbe_txrx_common.h   |   7 +-
>   drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c       |  61 +++---
>   drivers/net/ethernet/mellanox/mlx5/core/Makefile   |   2 +-
>   drivers/net/ethernet/mellanox/mlx5/core/en.h       |  19 +-
>   drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c   |   5 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/pool.c  | 217 +++++++++++++++++++++
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/pool.h  |  27 +++
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/rx.h    |  10 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/setup.c |  12 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/setup.h |   2 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/tx.c    |  14 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/tx.h    |   6 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/umem.c  | 217 ---------------------
>   .../net/ethernet/mellanox/mlx5/core/en/xsk/umem.h  |  29 ---
>   .../net/ethernet/mellanox/mlx5/core/en_ethtool.c   |   2 +-
>   .../ethernet/mellanox/mlx5/core/en_fs_ethtool.c    |   2 +-
>   drivers/net/ethernet/mellanox/mlx5/core/en_main.c  |  49 ++---
>   drivers/net/ethernet/mellanox/mlx5/core/en_rx.c    |  16 +-
>   include/linux/netdevice.h                          |  10 +-
>   include/net/xdp_sock_drv.h                         |   7 +-
>   include/net/xsk_buff_pool.h                        |   4 +-
>   net/ethtool/channels.c                             |   2 +-
>   net/ethtool/ioctl.c                                |   2 +-
>   net/xdp/xdp_umem.c                                 |  45 ++---
>   net/xdp/xsk_buff_pool.c                            |   5 +-
>   41 files changed, 578 insertions(+), 563 deletions(-)
>   create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c
>   create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.h
>   delete mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
>   delete mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 825c104..dc15771 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -1967,7 +1967,7 @@ static int i40e_set_ringparam(struct net_device *netdev,
>   	    (new_rx_count == vsi->rx_rings[0]->count))
>   		return 0;
>   
> -	/* If there is a AF_XDP UMEM attached to any of Rx rings,
> +	/* If there is a AF_XDP page pool attached to any of Rx rings,
>   	 * disallow changing the number of descriptors -- regardless
>   	 * if the netdev is running or not.
>   	 */
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index dadbfb3..e775376 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -3122,12 +3122,12 @@ static void i40e_config_xps_tx_ring(struct i40e_ring *ring)
>   }
>   
>   /**
> - * i40e_xsk_umem - Retrieve the AF_XDP ZC if XDP and ZC is enabled
> + * i40e_xsk_pool - Retrieve the AF_XDP buffer pool if XDP and ZC is enabled
>    * @ring: The Tx or Rx ring
>    *
> - * Returns the UMEM or NULL.
> + * Returns the AF_XDP buffer pool or NULL.
>    **/
> -static struct xdp_umem *i40e_xsk_umem(struct i40e_ring *ring)
> +static struct xsk_buff_pool *i40e_xsk_pool(struct i40e_ring *ring)
>   {
>   	bool xdp_on = i40e_enabled_xdp_vsi(ring->vsi);
>   	int qid = ring->queue_index;
> @@ -3138,7 +3138,7 @@ static struct xdp_umem *i40e_xsk_umem(struct i40e_ring *ring)
>   	if (!xdp_on || !test_bit(qid, ring->vsi->af_xdp_zc_qps))
>   		return NULL;
>   
> -	return xdp_get_umem_from_qid(ring->vsi->netdev, qid);
> +	return xdp_get_xsk_pool_from_qid(ring->vsi->netdev, qid);
>   }
>   
>   /**
> @@ -3157,7 +3157,7 @@ static int i40e_configure_tx_ring(struct i40e_ring *ring)
>   	u32 qtx_ctl = 0;
>   
>   	if (ring_is_xdp(ring))
> -		ring->xsk_umem = i40e_xsk_umem(ring);
> +		ring->xsk_pool = i40e_xsk_pool(ring);
>   
>   	/* some ATR related tx ring init */
>   	if (vsi->back->flags & I40E_FLAG_FD_ATR_ENABLED) {
> @@ -3280,12 +3280,13 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
>   		xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
>   
>   	kfree(ring->rx_bi);
> -	ring->xsk_umem = i40e_xsk_umem(ring);
> -	if (ring->xsk_umem) {
> +	ring->xsk_pool = i40e_xsk_pool(ring);
> +	if (ring->xsk_pool) {
>   		ret = i40e_alloc_rx_bi_zc(ring);
>   		if (ret)
>   			return ret;
> -		ring->rx_buf_len = xsk_umem_get_rx_frame_size(ring->xsk_umem);
> +		ring->rx_buf_len =
> +		  xsk_umem_get_rx_frame_size(ring->xsk_pool->umem);
>   		/* For AF_XDP ZC, we disallow packets to span on
>   		 * multiple buffers, thus letting us skip that
>   		 * handling in the fast-path.
> @@ -3368,8 +3369,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
>   	ring->tail = hw->hw_addr + I40E_QRX_TAIL(pf_q);
>   	writel(0, ring->tail);
>   
> -	if (ring->xsk_umem) {
> -		xsk_buff_set_rxq_info(ring->xsk_umem, &ring->xdp_rxq);
> +	if (ring->xsk_pool) {
> +		xsk_buff_set_rxq_info(ring->xsk_pool->umem, &ring->xdp_rxq);
>   		ok = i40e_alloc_rx_buffers_zc(ring, I40E_DESC_UNUSED(ring));
>   	} else {
>   		ok = !i40e_alloc_rx_buffers(ring, I40E_DESC_UNUSED(ring));
> @@ -3380,7 +3381,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
>   		 */
>   		dev_info(&vsi->back->pdev->dev,
>   			 "Failed to allocate some buffers on %sRx ring %d (pf_q %d)\n",
> -			 ring->xsk_umem ? "UMEM enabled " : "",
> +			 ring->xsk_pool ? "AF_XDP ZC enabled " : "",
>   			 ring->queue_index, pf_q);
>   	}
>   
> @@ -12644,7 +12645,7 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi,
>   	 */
>   	if (need_reset && prog)
>   		for (i = 0; i < vsi->num_queue_pairs; i++)
> -			if (vsi->xdp_rings[i]->xsk_umem)
> +			if (vsi->xdp_rings[i]->xsk_pool)
>   				(void)i40e_xsk_wakeup(vsi->netdev, i,
>   						      XDP_WAKEUP_RX);
>   
> @@ -12926,8 +12927,8 @@ static int i40e_xdp(struct net_device *dev,
>   	case XDP_QUERY_PROG:
>   		xdp->prog_id = vsi->xdp_prog ? vsi->xdp_prog->aux->id : 0;
>   		return 0;
> -	case XDP_SETUP_XSK_UMEM:
> -		return i40e_xsk_umem_setup(vsi, xdp->xsk.umem,
> +	case XDP_SETUP_XSK_POOL:
> +		return i40e_xsk_pool_setup(vsi, xdp->xsk.pool,
>   					   xdp->xsk.queue_id);
>   	default:
>   		return -EINVAL;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> index 3e5c566..f14bfc3 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> @@ -636,7 +636,7 @@ void i40e_clean_tx_ring(struct i40e_ring *tx_ring)
>   	unsigned long bi_size;
>   	u16 i;
>   
> -	if (ring_is_xdp(tx_ring) && tx_ring->xsk_umem) {
> +	if (ring_is_xdp(tx_ring) && tx_ring->xsk_pool) {
>   		i40e_xsk_clean_tx_ring(tx_ring);
>   	} else {
>   		/* ring already cleared, nothing to do */
> @@ -1335,7 +1335,7 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
>   		rx_ring->skb = NULL;
>   	}
>   
> -	if (rx_ring->xsk_umem) {
> +	if (rx_ring->xsk_pool) {
>   		i40e_xsk_clean_rx_ring(rx_ring);
>   		goto skip_free;
>   	}
> @@ -1369,7 +1369,7 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
>   	}
>   
>   skip_free:
> -	if (rx_ring->xsk_umem)
> +	if (rx_ring->xsk_pool)
>   		i40e_clear_rx_bi_zc(rx_ring);
>   	else
>   		i40e_clear_rx_bi(rx_ring);
> @@ -2579,7 +2579,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)
>   	 * budget and be more aggressive about cleaning up the Tx descriptors.
>   	 */
>   	i40e_for_each_ring(ring, q_vector->tx) {
> -		bool wd = ring->xsk_umem ?
> +		bool wd = ring->xsk_pool ?
>   			  i40e_clean_xdp_tx_irq(vsi, ring) :
>   			  i40e_clean_tx_irq(vsi, ring, budget);
>   
> @@ -2607,7 +2607,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)
>   		budget_per_ring = budget;
>   
>   	i40e_for_each_ring(ring, q_vector->rx) {
> -		int cleaned = ring->xsk_umem ?
> +		int cleaned = ring->xsk_pool ?
>   			      i40e_clean_rx_irq_zc(ring, budget_per_ring) :
>   			      i40e_clean_rx_irq(ring, budget_per_ring);
>   
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> index 4036893..703b644 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> @@ -388,7 +388,7 @@ struct i40e_ring {
>   
>   	struct i40e_channel *ch;
>   	struct xdp_rxq_info xdp_rxq;
> -	struct xdp_umem *xsk_umem;
> +	struct xsk_buff_pool *xsk_pool;
>   } ____cacheline_internodealigned_in_smp;
>   
>   static inline bool ring_uses_build_skb(struct i40e_ring *ring)
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> index 8ce57b5..00e9fe6 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> @@ -29,14 +29,16 @@ static struct xdp_buff **i40e_rx_bi(struct i40e_ring *rx_ring, u32 idx)
>   }
>   
>   /**
> - * i40e_xsk_umem_enable - Enable/associate a UMEM to a certain ring/qid
> + * i40e_xsk_pool_enable - Enable/associate an AF_XDP buffer pool to a
> + * certain ring/qid
>    * @vsi: Current VSI
> - * @umem: UMEM
> - * @qid: Rx ring to associate UMEM to
> + * @pool: buffer pool
> + * @qid: Rx ring to associate buffer pool with
>    *
>    * Returns 0 on success, <0 on failure
>    **/
> -static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
> +static int i40e_xsk_pool_enable(struct i40e_vsi *vsi,
> +				struct xsk_buff_pool *pool,
>   				u16 qid)
>   {
>   	struct net_device *netdev = vsi->netdev;
> @@ -53,7 +55,8 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>   	    qid >= netdev->real_num_tx_queues)
>   		return -EINVAL;
>   
> -	err = xsk_buff_dma_map(umem, &vsi->back->pdev->dev, I40E_RX_DMA_ATTR);
> +	err = xsk_buff_dma_map(pool->umem, &vsi->back->pdev->dev,
> +			       I40E_RX_DMA_ATTR);
>   	if (err)
>   		return err;
>   
> @@ -80,21 +83,22 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
>   }
>   
>   /**
> - * i40e_xsk_umem_disable - Disassociate a UMEM from a certain ring/qid
> + * i40e_xsk_pool_disable - Disassociate an AF_XDP buffer pool from a
> + * certain ring/qid
>    * @vsi: Current VSI
> - * @qid: Rx ring to associate UMEM to
> + * @qid: Rx ring to associate buffer pool with
>    *
>    * Returns 0 on success, <0 on failure
>    **/
> -static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
> +static int i40e_xsk_pool_disable(struct i40e_vsi *vsi, u16 qid)
>   {
>   	struct net_device *netdev = vsi->netdev;
> -	struct xdp_umem *umem;
> +	struct xsk_buff_pool *pool;
>   	bool if_running;
>   	int err;
>   
> -	umem = xdp_get_umem_from_qid(netdev, qid);
> -	if (!umem)
> +	pool = xdp_get_xsk_pool_from_qid(netdev, qid);
> +	if (!pool)
>   		return -EINVAL;
>   
>   	if_running = netif_running(vsi->netdev) && i40e_enabled_xdp_vsi(vsi);
> @@ -106,7 +110,7 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
>   	}
>   
>   	clear_bit(qid, vsi->af_xdp_zc_qps);
> -	xsk_buff_dma_unmap(umem, I40E_RX_DMA_ATTR);
> +	xsk_buff_dma_unmap(pool->umem, I40E_RX_DMA_ATTR);
>   
>   	if (if_running) {
>   		err = i40e_queue_pair_enable(vsi, qid);
> @@ -118,20 +122,21 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
>   }
>   
>   /**
> - * i40e_xsk_umem_setup - Enable/disassociate a UMEM to/from a ring/qid
> + * i40e_xsk_pool_setup - Enable/disassociate an AF_XDP buffer pool to/from
> + * a ring/qid
>    * @vsi: Current VSI
> - * @umem: UMEM to enable/associate to a ring, or NULL to disable
> - * @qid: Rx ring to (dis)associate UMEM (from)to
> + * @pool: Buffer pool to enable/associate to a ring, or NULL to disable
> + * @qid: Rx ring to (dis)associate buffer pool (from)to
>    *
> - * This function enables or disables a UMEM to a certain ring.
> + * This function enables or disables a buffer pool to a certain ring.
>    *
>    * Returns 0 on success, <0 on failure
>    **/
> -int i40e_xsk_umem_setup(struct i40e_vsi *vsi, struct xdp_umem *umem,
> +int i40e_xsk_pool_setup(struct i40e_vsi *vsi, struct xsk_buff_pool *pool,
>   			u16 qid)
>   {
> -	return umem ? i40e_xsk_umem_enable(vsi, umem, qid) :
> -		i40e_xsk_umem_disable(vsi, qid);
> +	return pool ? i40e_xsk_pool_enable(vsi, pool, qid) :
> +		i40e_xsk_pool_disable(vsi, qid);
>   }
>   
>   /**
> @@ -191,7 +196,7 @@ bool i40e_alloc_rx_buffers_zc(struct i40e_ring *rx_ring, u16 count)
>   	rx_desc = I40E_RX_DESC(rx_ring, ntu);
>   	bi = i40e_rx_bi(rx_ring, ntu);
>   	do {
> -		xdp = xsk_buff_alloc(rx_ring->xsk_umem);
> +		xdp = xsk_buff_alloc(rx_ring->xsk_pool->umem);
>   		if (!xdp) {
>   			ok = false;
>   			goto no_buffers;
> @@ -358,11 +363,11 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
>   	i40e_finalize_xdp_rx(rx_ring, xdp_xmit);
>   	i40e_update_rx_stats(rx_ring, total_rx_bytes, total_rx_packets);
>   
> -	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_umem)) {
> +	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_pool->umem)) {
>   		if (failure || rx_ring->next_to_clean == rx_ring->next_to_use)
> -			xsk_set_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_set_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   		else
> -			xsk_clear_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_clear_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   
>   		return (int)total_rx_packets;
>   	}
> @@ -385,11 +390,12 @@ static bool i40e_xmit_zc(struct i40e_ring *xdp_ring, unsigned int budget)
>   	dma_addr_t dma;
>   
>   	while (budget-- > 0) {
> -		if (!xsk_umem_consume_tx(xdp_ring->xsk_umem, &desc))
> +		if (!xsk_umem_consume_tx(xdp_ring->xsk_pool->umem, &desc))
>   			break;
>   
> -		dma = xsk_buff_raw_get_dma(xdp_ring->xsk_umem, desc.addr);
> -		xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_umem, dma,
> +		dma = xsk_buff_raw_get_dma(xdp_ring->xsk_pool->umem,
> +					   desc.addr);
> +		xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_pool->umem, dma,
>   						 desc.len);
>   
>   		tx_bi = &xdp_ring->tx_bi[xdp_ring->next_to_use];
> @@ -416,7 +422,7 @@ static bool i40e_xmit_zc(struct i40e_ring *xdp_ring, unsigned int budget)
>   						 I40E_TXD_QW1_CMD_SHIFT);
>   		i40e_xdp_ring_update_tail(xdp_ring);
>   
> -		xsk_umem_consume_tx_done(xdp_ring->xsk_umem);
> +		xsk_umem_consume_tx_done(xdp_ring->xsk_pool->umem);
>   		i40e_update_tx_stats(xdp_ring, sent_frames, total_bytes);
>   	}
>   
> @@ -448,7 +454,7 @@ static void i40e_clean_xdp_tx_buffer(struct i40e_ring *tx_ring,
>    **/
>   bool i40e_clean_xdp_tx_irq(struct i40e_vsi *vsi, struct i40e_ring *tx_ring)
>   {
> -	struct xdp_umem *umem = tx_ring->xsk_umem;
> +	struct xsk_buff_pool *bp = tx_ring->xsk_pool;
>   	u32 i, completed_frames, xsk_frames = 0;
>   	u32 head_idx = i40e_get_head(tx_ring);
>   	struct i40e_tx_buffer *tx_bi;
> @@ -488,13 +494,13 @@ bool i40e_clean_xdp_tx_irq(struct i40e_vsi *vsi, struct i40e_ring *tx_ring)
>   		tx_ring->next_to_clean -= tx_ring->count;
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(umem, xsk_frames);
> +		xsk_umem_complete_tx(bp->umem, xsk_frames);
>   
>   	i40e_arm_wb(tx_ring, vsi, completed_frames);
>   
>   out_xmit:
> -	if (xsk_umem_uses_need_wakeup(tx_ring->xsk_umem))
> -		xsk_set_tx_need_wakeup(tx_ring->xsk_umem);
> +	if (xsk_umem_uses_need_wakeup(tx_ring->xsk_pool->umem))
> +		xsk_set_tx_need_wakeup(tx_ring->xsk_pool->umem);
>   
>   	return i40e_xmit_zc(tx_ring, I40E_DESC_UNUSED(tx_ring));
>   }
> @@ -526,7 +532,7 @@ int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)
>   	if (queue_id >= vsi->num_queue_pairs)
>   		return -ENXIO;
>   
> -	if (!vsi->xdp_rings[queue_id]->xsk_umem)
> +	if (!vsi->xdp_rings[queue_id]->xsk_pool)
>   		return -ENXIO;
>   
>   	ring = vsi->xdp_rings[queue_id];
> @@ -565,7 +571,7 @@ void i40e_xsk_clean_rx_ring(struct i40e_ring *rx_ring)
>   void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring)
>   {
>   	u16 ntc = tx_ring->next_to_clean, ntu = tx_ring->next_to_use;
> -	struct xdp_umem *umem = tx_ring->xsk_umem;
> +	struct xsk_buff_pool *bp = tx_ring->xsk_pool;
>   	struct i40e_tx_buffer *tx_bi;
>   	u32 xsk_frames = 0;
>   
> @@ -585,14 +591,15 @@ void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring)
>   	}
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(umem, xsk_frames);
> +		xsk_umem_complete_tx(bp->umem, xsk_frames);
>   }
>   
>   /**
> - * i40e_xsk_any_rx_ring_enabled - Checks if Rx rings have AF_XDP UMEM attached
> + * i40e_xsk_any_rx_ring_enabled - Checks if Rx rings have an AF_XDP
> + * buffer pool attached
>    * @vsi: vsi
>    *
> - * Returns true if any of the Rx rings has an AF_XDP UMEM attached
> + * Returns true if any of the Rx rings has an AF_XDP buffer pool attached
>    **/
>   bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi)
>   {
> @@ -600,7 +607,7 @@ bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi)
>   	int i;
>   
>   	for (i = 0; i < vsi->num_queue_pairs; i++) {
> -		if (xdp_get_umem_from_qid(netdev, i))
> +		if (xdp_get_xsk_pool_from_qid(netdev, i))
>   			return true;
>   	}
>   
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.h b/drivers/net/ethernet/intel/i40e/i40e_xsk.h
> index c524c14..7adfd85 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.h
> @@ -5,12 +5,12 @@
>   #define _I40E_XSK_H_
>   
>   struct i40e_vsi;
> -struct xdp_umem;
> +struct xsk_buff_pool;
>   struct zero_copy_allocator;
>   
>   int i40e_queue_pair_disable(struct i40e_vsi *vsi, int queue_pair);
>   int i40e_queue_pair_enable(struct i40e_vsi *vsi, int queue_pair);
> -int i40e_xsk_umem_setup(struct i40e_vsi *vsi, struct xdp_umem *umem,
> +int i40e_xsk_pool_setup(struct i40e_vsi *vsi, struct xsk_buff_pool *pool,
>   			u16 qid);
>   bool i40e_alloc_rx_buffers_zc(struct i40e_ring *rx_ring, u16 cleaned_count);
>   int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget);
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
> index 7486d01..e8a8224 100644
> --- a/drivers/net/ethernet/intel/ice/ice.h
> +++ b/drivers/net/ethernet/intel/ice/ice.h
> @@ -317,9 +317,9 @@ struct ice_vsi {
>   	struct ice_ring **xdp_rings;	 /* XDP ring array */
>   	u16 num_xdp_txq;		 /* Used XDP queues */
>   	u8 xdp_mapping_mode;		 /* ICE_MAP_MODE_[CONTIG|SCATTER] */
> -	struct xdp_umem **xsk_umems;
> -	u16 num_xsk_umems_used;
> -	u16 num_xsk_umems;
> +	struct xsk_buff_pool **xsk_pools;
> +	u16 num_xsk_pools_used;
> +	u16 num_xsk_pools;
>   } ____cacheline_internodealigned_in_smp;
>   
>   /* struct that defines an interrupt vector */
> @@ -489,25 +489,25 @@ static inline void ice_set_ring_xdp(struct ice_ring *ring)
>   }
>   
>   /**
> - * ice_xsk_umem - get XDP UMEM bound to a ring
> + * ice_xsk_pool - get XSK buffer pool bound to a ring
>    * @ring - ring to use
>    *
> - * Returns a pointer to xdp_umem structure if there is an UMEM present,
> + * Returns a pointer to xdp_umem structure if there is a buffer pool present,
>    * NULL otherwise.
>    */
> -static inline struct xdp_umem *ice_xsk_umem(struct ice_ring *ring)
> +static inline struct xsk_buff_pool *ice_xsk_pool(struct ice_ring *ring)
>   {
> -	struct xdp_umem **umems = ring->vsi->xsk_umems;
> +	struct xsk_buff_pool **pools = ring->vsi->xsk_pools;
>   	u16 qid = ring->q_index;
>   
>   	if (ice_ring_is_xdp(ring))
>   		qid -= ring->vsi->num_xdp_txq;
>   
> -	if (qid >= ring->vsi->num_xsk_umems || !umems || !umems[qid] ||
> +	if (qid >= ring->vsi->num_xsk_pools || !pools || !pools[qid] ||
>   	    !ice_is_xdp_ena_vsi(ring->vsi))
>   		return NULL;
>   
> -	return umems[qid];
> +	return pools[qid];
>   }
>   
>   /**
> diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c
> index 8700847..3c92448 100644
> --- a/drivers/net/ethernet/intel/ice/ice_base.c
> +++ b/drivers/net/ethernet/intel/ice/ice_base.c
> @@ -308,12 +308,12 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
>   			xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
>   					 ring->q_index);
>   
> -		ring->xsk_umem = ice_xsk_umem(ring);
> -		if (ring->xsk_umem) {
> +		ring->xsk_pool = ice_xsk_pool(ring);
> +		if (ring->xsk_pool) {
>   			xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
>   
>   			ring->rx_buf_len =
> -				xsk_umem_get_rx_frame_size(ring->xsk_umem);
> +				xsk_umem_get_rx_frame_size(ring->xsk_pool->umem);
>   			/* For AF_XDP ZC, we disallow packets to span on
>   			 * multiple buffers, thus letting us skip that
>   			 * handling in the fast-path.
> @@ -324,7 +324,7 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
>   							 NULL);
>   			if (err)
>   				return err;
> -			xsk_buff_set_rxq_info(ring->xsk_umem, &ring->xdp_rxq);
> +			xsk_buff_set_rxq_info(ring->xsk_pool->umem, &ring->xdp_rxq);
>   
>   			dev_info(dev, "Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring %d\n",
>   				 ring->q_index);
> @@ -417,9 +417,9 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
>   	ring->tail = hw->hw_addr + QRX_TAIL(pf_q);
>   	writel(0, ring->tail);
>   
> -	if (ring->xsk_umem) {
> -		if (!xsk_buff_can_alloc(ring->xsk_umem, num_bufs)) {
> -			dev_warn(dev, "UMEM does not provide enough addresses to fill %d buffers on Rx ring %d\n",
> +	if (ring->xsk_pool) {
> +		if (!xsk_buff_can_alloc(ring->xsk_pool->umem, num_bufs)) {
> +			dev_warn(dev, "XSK buffer pool does not provide enough addresses to fill %d buffers on Rx ring %d\n",
>   				 num_bufs, ring->q_index);
>   			dev_warn(dev, "Change Rx ring/fill queue size to avoid performance issues\n");
>   
> @@ -428,7 +428,7 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
>   
>   		err = ice_alloc_rx_bufs_zc(ring, num_bufs);
>   		if (err)
> -			dev_info(dev, "Failed to allocate some buffers on UMEM enabled Rx ring %d (pf_q %d)\n",
> +			dev_info(dev, "Failed to allocate some buffers on XSK buffer pool enabled Rx ring %d (pf_q %d)\n",
>   				 ring->q_index, pf_q);
>   		return 0;
>   	}
> diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
> index 8a4c7b8..0dcde47 100644
> --- a/drivers/net/ethernet/intel/ice/ice_lib.c
> +++ b/drivers/net/ethernet/intel/ice/ice_lib.c
> @@ -1713,7 +1713,7 @@ int ice_vsi_cfg_xdp_txqs(struct ice_vsi *vsi)
>   		return ret;
>   
>   	for (i = 0; i < vsi->num_xdp_txq; i++)
> -		vsi->xdp_rings[i]->xsk_umem = ice_xsk_umem(vsi->xdp_rings[i]);
> +		vsi->xdp_rings[i]->xsk_pool = ice_xsk_pool(vsi->xdp_rings[i]);
>   
>   	return ret;
>   }
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
> index a1cef08..d625d8a 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -1698,7 +1698,7 @@ static int ice_xdp_alloc_setup_rings(struct ice_vsi *vsi)
>   		if (ice_setup_tx_ring(xdp_ring))
>   			goto free_xdp_rings;
>   		ice_set_ring_xdp(xdp_ring);
> -		xdp_ring->xsk_umem = ice_xsk_umem(xdp_ring);
> +		xdp_ring->xsk_pool = ice_xsk_pool(xdp_ring);
>   	}
>   
>   	return 0;
> @@ -1942,13 +1942,13 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
>   	if (if_running)
>   		ret = ice_up(vsi);
>   
> -	if (!ret && prog && vsi->xsk_umems) {
> +	if (!ret && prog && vsi->xsk_pools) {
>   		int i;
>   
>   		ice_for_each_rxq(vsi, i) {
>   			struct ice_ring *rx_ring = vsi->rx_rings[i];
>   
> -			if (rx_ring->xsk_umem)
> +			if (rx_ring->xsk_pool)
>   				napi_schedule(&rx_ring->q_vector->napi);
>   		}
>   	}
> @@ -1977,8 +1977,8 @@ static int ice_xdp(struct net_device *dev, struct netdev_bpf *xdp)
>   	case XDP_QUERY_PROG:
>   		xdp->prog_id = vsi->xdp_prog ? vsi->xdp_prog->aux->id : 0;
>   		return 0;
> -	case XDP_SETUP_XSK_UMEM:
> -		return ice_xsk_umem_setup(vsi, xdp->xsk.umem,
> +	case XDP_SETUP_XSK_POOL:
> +		return ice_xsk_pool_setup(vsi, xdp->xsk.pool,
>   					  xdp->xsk.queue_id);
>   	default:
>   		return -EINVAL;
> diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
> index abdb137c..241c1ea 100644
> --- a/drivers/net/ethernet/intel/ice/ice_txrx.c
> +++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
> @@ -145,7 +145,7 @@ void ice_clean_tx_ring(struct ice_ring *tx_ring)
>   {
>   	u16 i;
>   
> -	if (ice_ring_is_xdp(tx_ring) && tx_ring->xsk_umem) {
> +	if (ice_ring_is_xdp(tx_ring) && tx_ring->xsk_pool) {
>   		ice_xsk_clean_xdp_ring(tx_ring);
>   		goto tx_skip_free;
>   	}
> @@ -375,7 +375,7 @@ void ice_clean_rx_ring(struct ice_ring *rx_ring)
>   	if (!rx_ring->rx_buf)
>   		return;
>   
> -	if (rx_ring->xsk_umem) {
> +	if (rx_ring->xsk_pool) {
>   		ice_xsk_clean_rx_ring(rx_ring);
>   		goto rx_skip_free;
>   	}
> @@ -1619,7 +1619,7 @@ int ice_napi_poll(struct napi_struct *napi, int budget)
>   	 * budget and be more aggressive about cleaning up the Tx descriptors.
>   	 */
>   	ice_for_each_ring(ring, q_vector->tx) {
> -		bool wd = ring->xsk_umem ?
> +		bool wd = ring->xsk_pool ?
>   			  ice_clean_tx_irq_zc(ring, budget) :
>   			  ice_clean_tx_irq(ring, budget);
>   
> @@ -1649,7 +1649,7 @@ int ice_napi_poll(struct napi_struct *napi, int budget)
>   		 * comparison in the irq context instead of many inside the
>   		 * ice_clean_rx_irq function and makes the codebase cleaner.
>   		 */
> -		cleaned = ring->xsk_umem ?
> +		cleaned = ring->xsk_pool ?
>   			  ice_clean_rx_irq_zc(ring, budget_per_ring) :
>   			  ice_clean_rx_irq(ring, budget_per_ring);
>   		work_done += cleaned;
> diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h
> index e70c461..3b37360 100644
> --- a/drivers/net/ethernet/intel/ice/ice_txrx.h
> +++ b/drivers/net/ethernet/intel/ice/ice_txrx.h
> @@ -295,7 +295,7 @@ struct ice_ring {
>   
>   	struct rcu_head rcu;		/* to avoid race on free */
>   	struct bpf_prog *xdp_prog;
> -	struct xdp_umem *xsk_umem;
> +	struct xsk_buff_pool *xsk_pool;
>   	/* CL3 - 3rd cacheline starts here */
>   	struct xdp_rxq_info xdp_rxq;
>   	/* CLX - the below items are only accessed infrequently and should be
> diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c
> index 6badfd6..8f95244 100644
> --- a/drivers/net/ethernet/intel/ice/ice_xsk.c
> +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c
> @@ -236,7 +236,7 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx)
>   		if (err)
>   			goto free_buf;
>   		ice_set_ring_xdp(xdp_ring);
> -		xdp_ring->xsk_umem = ice_xsk_umem(xdp_ring);
> +		xdp_ring->xsk_pool = ice_xsk_pool(xdp_ring);
>   	}
>   
>   	err = ice_setup_rx_ctx(rx_ring);
> @@ -260,21 +260,21 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx)
>   }
>   
>   /**
> - * ice_xsk_alloc_umems - allocate a UMEM region for an XDP socket
> - * @vsi: VSI to allocate the UMEM on
> + * ice_xsk_alloc_pools - allocate a buffer pool for an XDP socket
> + * @vsi: VSI to allocate the buffer pool on
>    *
>    * Returns 0 on success, negative on error
>    */
> -static int ice_xsk_alloc_umems(struct ice_vsi *vsi)
> +static int ice_xsk_alloc_pools(struct ice_vsi *vsi)
>   {
> -	if (vsi->xsk_umems)
> +	if (vsi->xsk_pools)
>   		return 0;
>   
> -	vsi->xsk_umems = kcalloc(vsi->num_xsk_umems, sizeof(*vsi->xsk_umems),
> +	vsi->xsk_pools = kcalloc(vsi->num_xsk_pools, sizeof(*vsi->xsk_pools),
>   				 GFP_KERNEL);
>   
> -	if (!vsi->xsk_umems) {
> -		vsi->num_xsk_umems = 0;
> +	if (!vsi->xsk_pools) {
> +		vsi->num_xsk_pools = 0;
>   		return -ENOMEM;
>   	}
>   
> @@ -282,74 +282,74 @@ static int ice_xsk_alloc_umems(struct ice_vsi *vsi)
>   }
>   
>   /**
> - * ice_xsk_remove_umem - Remove an UMEM for a certain ring/qid
> + * ice_xsk_remove_pool - Remove an buffer pool for a certain ring/qid
>    * @vsi: VSI from which the VSI will be removed
> - * @qid: Ring/qid associated with the UMEM
> + * @qid: Ring/qid associated with the buffer pool
>    */
> -static void ice_xsk_remove_umem(struct ice_vsi *vsi, u16 qid)
> +static void ice_xsk_remove_pool(struct ice_vsi *vsi, u16 qid)
>   {
> -	vsi->xsk_umems[qid] = NULL;
> -	vsi->num_xsk_umems_used--;
> +	vsi->xsk_pools[qid] = NULL;
> +	vsi->num_xsk_pools_used--;
>   
> -	if (vsi->num_xsk_umems_used == 0) {
> -		kfree(vsi->xsk_umems);
> -		vsi->xsk_umems = NULL;
> -		vsi->num_xsk_umems = 0;
> +	if (vsi->num_xsk_pools_used == 0) {
> +		kfree(vsi->xsk_pools);
> +		vsi->xsk_pools = NULL;
> +		vsi->num_xsk_pools = 0;
>   	}
>   }
>   
>   
>   /**
> - * ice_xsk_umem_disable - disable a UMEM region
> + * ice_xsk_pool_disable - disable a buffer pool region
>    * @vsi: Current VSI
>    * @qid: queue ID
>    *
>    * Returns 0 on success, negative on failure
>    */
> -static int ice_xsk_umem_disable(struct ice_vsi *vsi, u16 qid)
> +static int ice_xsk_pool_disable(struct ice_vsi *vsi, u16 qid)
>   {
> -	if (!vsi->xsk_umems || qid >= vsi->num_xsk_umems ||
> -	    !vsi->xsk_umems[qid])
> +	if (!vsi->xsk_pools || qid >= vsi->num_xsk_pools ||
> +	    !vsi->xsk_pools[qid])
>   		return -EINVAL;
>   
> -	xsk_buff_dma_unmap(vsi->xsk_umems[qid], ICE_RX_DMA_ATTR);
> -	ice_xsk_remove_umem(vsi, qid);
> +	xsk_buff_dma_unmap(vsi->xsk_pools[qid]->umem, ICE_RX_DMA_ATTR);
> +	ice_xsk_remove_pool(vsi, qid);
>   
>   	return 0;
>   }
>   
>   /**
> - * ice_xsk_umem_enable - enable a UMEM region
> + * ice_xsk_pool_enable - enable a buffer pool region
>    * @vsi: Current VSI
> - * @umem: pointer to a requested UMEM region
> + * @pool: pointer to a requested buffer pool region
>    * @qid: queue ID
>    *
>    * Returns 0 on success, negative on failure
>    */
>   static int
> -ice_xsk_umem_enable(struct ice_vsi *vsi, struct xdp_umem *umem, u16 qid)
> +ice_xsk_pool_enable(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)
>   {
>   	int err;
>   
>   	if (vsi->type != ICE_VSI_PF)
>   		return -EINVAL;
>   
> -	if (!vsi->num_xsk_umems)
> -		vsi->num_xsk_umems = min_t(u16, vsi->num_rxq, vsi->num_txq);
> -	if (qid >= vsi->num_xsk_umems)
> +	if (!vsi->num_xsk_pools)
> +		vsi->num_xsk_pools = min_t(u16, vsi->num_rxq, vsi->num_txq);
> +	if (qid >= vsi->num_xsk_pools)
>   		return -EINVAL;
>   
> -	err = ice_xsk_alloc_umems(vsi);
> +	err = ice_xsk_alloc_pools(vsi);
>   	if (err)
>   		return err;
>   
> -	if (vsi->xsk_umems && vsi->xsk_umems[qid])
> +	if (vsi->xsk_pools && vsi->xsk_pools[qid])
>   		return -EBUSY;
>   
> -	vsi->xsk_umems[qid] = umem;
> -	vsi->num_xsk_umems_used++;
> +	vsi->xsk_pools[qid] = pool;
> +	vsi->num_xsk_pools_used++;
>   
> -	err = xsk_buff_dma_map(vsi->xsk_umems[qid], ice_pf_to_dev(vsi->back),
> +	err = xsk_buff_dma_map(vsi->xsk_pools[qid]->umem, ice_pf_to_dev(vsi->back),
>   			       ICE_RX_DMA_ATTR);
>   	if (err)
>   		return err;
> @@ -358,17 +358,17 @@ ice_xsk_umem_enable(struct ice_vsi *vsi, struct xdp_umem *umem, u16 qid)
>   }
>   
>   /**
> - * ice_xsk_umem_setup - enable/disable a UMEM region depending on its state
> + * ice_xsk_pool_setup - enable/disable a buffer pool region depending on its state
>    * @vsi: Current VSI
> - * @umem: UMEM to enable/associate to a ring, NULL to disable
> + * @pool: buffer pool to enable/associate to a ring, NULL to disable
>    * @qid: queue ID
>    *
>    * Returns 0 on success, negative on failure
>    */
> -int ice_xsk_umem_setup(struct ice_vsi *vsi, struct xdp_umem *umem, u16 qid)
> +int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)
>   {
> -	bool if_running, umem_present = !!umem;
> -	int ret = 0, umem_failure = 0;
> +	bool if_running, pool_present = !!pool;
> +	int ret = 0, pool_failure = 0;
>   
>   	if_running = netif_running(vsi->netdev) && ice_is_xdp_ena_vsi(vsi);
>   
> @@ -376,26 +376,26 @@ int ice_xsk_umem_setup(struct ice_vsi *vsi, struct xdp_umem *umem, u16 qid)
>   		ret = ice_qp_dis(vsi, qid);
>   		if (ret) {
>   			netdev_err(vsi->netdev, "ice_qp_dis error = %d\n", ret);
> -			goto xsk_umem_if_up;
> +			goto xsk_pool_if_up;
>   		}
>   	}
>   
> -	umem_failure = umem_present ? ice_xsk_umem_enable(vsi, umem, qid) :
> -				      ice_xsk_umem_disable(vsi, qid);
> +	pool_failure = pool_present ? ice_xsk_pool_enable(vsi, pool, qid) :
> +				      ice_xsk_pool_disable(vsi, qid);
>   
> -xsk_umem_if_up:
> +xsk_pool_if_up:
>   	if (if_running) {
>   		ret = ice_qp_ena(vsi, qid);
> -		if (!ret && umem_present)
> +		if (!ret && pool_present)
>   			napi_schedule(&vsi->xdp_rings[qid]->q_vector->napi);
>   		else if (ret)
>   			netdev_err(vsi->netdev, "ice_qp_ena error = %d\n", ret);
>   	}
>   
> -	if (umem_failure) {
> -		netdev_err(vsi->netdev, "Could not %sable UMEM, error = %d\n",
> -			   umem_present ? "en" : "dis", umem_failure);
> -		return umem_failure;
> +	if (pool_failure) {
> +		netdev_err(vsi->netdev, "Could not %sable buffer pool, error = %d\n",
> +			   pool_present ? "en" : "dis", pool_failure);
> +		return pool_failure;
>   	}
>   
>   	return ret;
> @@ -426,7 +426,7 @@ bool ice_alloc_rx_bufs_zc(struct ice_ring *rx_ring, u16 count)
>   	rx_buf = &rx_ring->rx_buf[ntu];
>   
>   	do {
> -		rx_buf->xdp = xsk_buff_alloc(rx_ring->xsk_umem);
> +		rx_buf->xdp = xsk_buff_alloc(rx_ring->xsk_pool->umem);
>   		if (!rx_buf->xdp) {
>   			ret = true;
>   			break;
> @@ -647,11 +647,11 @@ int ice_clean_rx_irq_zc(struct ice_ring *rx_ring, int budget)
>   	ice_finalize_xdp_rx(rx_ring, xdp_xmit);
>   	ice_update_rx_ring_stats(rx_ring, total_rx_packets, total_rx_bytes);
>   
> -	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_umem)) {
> +	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_pool->umem)) {
>   		if (failure || rx_ring->next_to_clean == rx_ring->next_to_use)
> -			xsk_set_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_set_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   		else
> -			xsk_clear_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_clear_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   
>   		return (int)total_rx_packets;
>   	}
> @@ -684,11 +684,11 @@ static bool ice_xmit_zc(struct ice_ring *xdp_ring, int budget)
>   
>   		tx_buf = &xdp_ring->tx_buf[xdp_ring->next_to_use];
>   
> -		if (!xsk_umem_consume_tx(xdp_ring->xsk_umem, &desc))
> +		if (!xsk_umem_consume_tx(xdp_ring->xsk_pool->umem, &desc))
>   			break;
>   
> -		dma = xsk_buff_raw_get_dma(xdp_ring->xsk_umem, desc.addr);
> -		xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_umem, dma,
> +		dma = xsk_buff_raw_get_dma(xdp_ring->xsk_pool->umem, desc.addr);
> +		xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_pool->umem, dma,
>   						 desc.len);
>   
>   		tx_buf->bytecount = desc.len;
> @@ -705,9 +705,9 @@ static bool ice_xmit_zc(struct ice_ring *xdp_ring, int budget)
>   
>   	if (tx_desc) {
>   		ice_xdp_ring_update_tail(xdp_ring);
> -		xsk_umem_consume_tx_done(xdp_ring->xsk_umem);
> -		if (xsk_umem_uses_need_wakeup(xdp_ring->xsk_umem))
> -			xsk_clear_tx_need_wakeup(xdp_ring->xsk_umem);
> +		xsk_umem_consume_tx_done(xdp_ring->xsk_pool->umem);
> +		if (xsk_umem_uses_need_wakeup(xdp_ring->xsk_pool->umem))
> +			xsk_clear_tx_need_wakeup(xdp_ring->xsk_pool->umem);
>   	}
>   
>   	return budget > 0 && work_done;
> @@ -781,13 +781,13 @@ bool ice_clean_tx_irq_zc(struct ice_ring *xdp_ring, int budget)
>   	xdp_ring->next_to_clean = ntc;
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(xdp_ring->xsk_umem, xsk_frames);
> +		xsk_umem_complete_tx(xdp_ring->xsk_pool->umem, xsk_frames);
>   
> -	if (xsk_umem_uses_need_wakeup(xdp_ring->xsk_umem)) {
> +	if (xsk_umem_uses_need_wakeup(xdp_ring->xsk_pool->umem)) {
>   		if (xdp_ring->next_to_clean == xdp_ring->next_to_use)
> -			xsk_set_tx_need_wakeup(xdp_ring->xsk_umem);
> +			xsk_set_tx_need_wakeup(xdp_ring->xsk_pool->umem);
>   		else
> -			xsk_clear_tx_need_wakeup(xdp_ring->xsk_umem);
> +			xsk_clear_tx_need_wakeup(xdp_ring->xsk_pool->umem);
>   	}
>   
>   	ice_update_tx_ring_stats(xdp_ring, total_packets, total_bytes);
> @@ -822,7 +822,7 @@ ice_xsk_wakeup(struct net_device *netdev, u32 queue_id,
>   	if (queue_id >= vsi->num_txq)
>   		return -ENXIO;
>   
> -	if (!vsi->xdp_rings[queue_id]->xsk_umem)
> +	if (!vsi->xdp_rings[queue_id]->xsk_pool)
>   		return -ENXIO;
>   
>   	ring = vsi->xdp_rings[queue_id];
> @@ -841,20 +841,20 @@ ice_xsk_wakeup(struct net_device *netdev, u32 queue_id,
>   }
>   
>   /**
> - * ice_xsk_any_rx_ring_ena - Checks if Rx rings have AF_XDP UMEM attached
> + * ice_xsk_any_rx_ring_ena - Checks if Rx rings have AF_XDP buff pool attached
>    * @vsi: VSI to be checked
>    *
> - * Returns true if any of the Rx rings has an AF_XDP UMEM attached
> + * Returns true if any of the Rx rings has an AF_XDP buff pool attached
>    */
>   bool ice_xsk_any_rx_ring_ena(struct ice_vsi *vsi)
>   {
>   	int i;
>   
> -	if (!vsi->xsk_umems)
> +	if (!vsi->xsk_pools)
>   		return false;
>   
> -	for (i = 0; i < vsi->num_xsk_umems; i++) {
> -		if (vsi->xsk_umems[i])
> +	for (i = 0; i < vsi->num_xsk_pools; i++) {
> +		if (vsi->xsk_pools[i])
>   			return true;
>   	}
>   
> @@ -862,7 +862,7 @@ bool ice_xsk_any_rx_ring_ena(struct ice_vsi *vsi)
>   }
>   
>   /**
> - * ice_xsk_clean_rx_ring - clean UMEM queues connected to a given Rx ring
> + * ice_xsk_clean_rx_ring - clean buffer pool queues connected to a given Rx ring
>    * @rx_ring: ring to be cleaned
>    */
>   void ice_xsk_clean_rx_ring(struct ice_ring *rx_ring)
> @@ -880,7 +880,7 @@ void ice_xsk_clean_rx_ring(struct ice_ring *rx_ring)
>   }
>   
>   /**
> - * ice_xsk_clean_xdp_ring - Clean the XDP Tx ring and its UMEM queues
> + * ice_xsk_clean_xdp_ring - Clean the XDP Tx ring and its buffer pool queues
>    * @xdp_ring: XDP_Tx ring
>    */
>   void ice_xsk_clean_xdp_ring(struct ice_ring *xdp_ring)
> @@ -904,5 +904,5 @@ void ice_xsk_clean_xdp_ring(struct ice_ring *xdp_ring)
>   	}
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(xdp_ring->xsk_umem, xsk_frames);
> +		xsk_umem_complete_tx(xdp_ring->xsk_pool->umem, xsk_frames);
>   }
> diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.h b/drivers/net/ethernet/intel/ice/ice_xsk.h
> index fc1a06b..fad7836 100644
> --- a/drivers/net/ethernet/intel/ice/ice_xsk.h
> +++ b/drivers/net/ethernet/intel/ice/ice_xsk.h
> @@ -9,7 +9,8 @@
>   struct ice_vsi;
>   
>   #ifdef CONFIG_XDP_SOCKETS
> -int ice_xsk_umem_setup(struct ice_vsi *vsi, struct xdp_umem *umem, u16 qid);
> +int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool,
> +		       u16 qid);
>   int ice_clean_rx_irq_zc(struct ice_ring *rx_ring, int budget);
>   bool ice_clean_tx_irq_zc(struct ice_ring *xdp_ring, int budget);
>   int ice_xsk_wakeup(struct net_device *netdev, u32 queue_id, u32 flags);
> @@ -19,8 +20,8 @@ void ice_xsk_clean_rx_ring(struct ice_ring *rx_ring);
>   void ice_xsk_clean_xdp_ring(struct ice_ring *xdp_ring);
>   #else
>   static inline int
> -ice_xsk_umem_setup(struct ice_vsi __always_unused *vsi,
> -		   struct xdp_umem __always_unused *umem,
> +ice_xsk_pool_setup(struct ice_vsi __always_unused *vsi,
> +		   struct xsk_buff_pool __always_unused *pool,
>   		   u16 __always_unused qid)
>   {
>   	return -EOPNOTSUPP;
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
> index 1e8a809..de0fc6e 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
> @@ -350,7 +350,7 @@ struct ixgbe_ring {
>   		struct ixgbe_rx_queue_stats rx_stats;
>   	};
>   	struct xdp_rxq_info xdp_rxq;
> -	struct xdp_umem *xsk_umem;
> +	struct xsk_buff_pool *xsk_pool;
>   	u16 ring_idx;		/* {rx,tx,xdp}_ring back reference idx */
>   	u16 rx_buf_len;
>   } ____cacheline_internodealigned_in_smp;
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> index 4d898ff..b423971 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> @@ -3156,7 +3156,7 @@ int ixgbe_poll(struct napi_struct *napi, int budget)
>   #endif
>   
>   	ixgbe_for_each_ring(ring, q_vector->tx) {
> -		bool wd = ring->xsk_umem ?
> +		bool wd = ring->xsk_pool ?
>   			  ixgbe_clean_xdp_tx_irq(q_vector, ring, budget) :
>   			  ixgbe_clean_tx_irq(q_vector, ring, budget);
>   
> @@ -3176,7 +3176,7 @@ int ixgbe_poll(struct napi_struct *napi, int budget)
>   		per_ring_budget = budget;
>   
>   	ixgbe_for_each_ring(ring, q_vector->rx) {
> -		int cleaned = ring->xsk_umem ?
> +		int cleaned = ring->xsk_pool ?
>   			      ixgbe_clean_rx_irq_zc(q_vector, ring,
>   						    per_ring_budget) :
>   			      ixgbe_clean_rx_irq(q_vector, ring,
> @@ -3471,9 +3471,9 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
>   	u32 txdctl = IXGBE_TXDCTL_ENABLE;
>   	u8 reg_idx = ring->reg_idx;
>   
> -	ring->xsk_umem = NULL;
> +	ring->xsk_pool = NULL;
>   	if (ring_is_xdp(ring))
> -		ring->xsk_umem = ixgbe_xsk_umem(adapter, ring);
> +		ring->xsk_pool = ixgbe_xsk_pool(adapter, ring);
>   
>   	/* disable queue to avoid issues while updating state */
>   	IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(reg_idx), 0);
> @@ -3713,8 +3713,8 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,
>   	srrctl = IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT;
>   
>   	/* configure the packet buffer length */
> -	if (rx_ring->xsk_umem) {
> -		u32 xsk_buf_len = xsk_umem_get_rx_frame_size(rx_ring->xsk_umem);
> +	if (rx_ring->xsk_pool) {
> +		u32 xsk_buf_len = xsk_umem_get_rx_frame_size(rx_ring->xsk_pool->umem);
>   
>   		/* If the MAC support setting RXDCTL.RLPML, the
>   		 * SRRCTL[n].BSIZEPKT is set to PAGE_SIZE and
> @@ -4059,12 +4059,12 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
>   	u8 reg_idx = ring->reg_idx;
>   
>   	xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
> -	ring->xsk_umem = ixgbe_xsk_umem(adapter, ring);
> -	if (ring->xsk_umem) {
> +	ring->xsk_pool = ixgbe_xsk_pool(adapter, ring);
> +	if (ring->xsk_pool) {
>   		WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
>   						   MEM_TYPE_XSK_BUFF_POOL,
>   						   NULL));
> -		xsk_buff_set_rxq_info(ring->xsk_umem, &ring->xdp_rxq);
> +		xsk_buff_set_rxq_info(ring->xsk_pool->umem, &ring->xdp_rxq);
>   	} else {
>   		WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
>   						   MEM_TYPE_PAGE_SHARED, NULL));
> @@ -4119,8 +4119,8 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
>   #endif
>   	}
>   
> -	if (ring->xsk_umem && hw->mac.type != ixgbe_mac_82599EB) {
> -		u32 xsk_buf_len = xsk_umem_get_rx_frame_size(ring->xsk_umem);
> +	if (ring->xsk_pool && hw->mac.type != ixgbe_mac_82599EB) {
> +		u32 xsk_buf_len = xsk_umem_get_rx_frame_size(ring->xsk_pool->umem);
>   
>   		rxdctl &= ~(IXGBE_RXDCTL_RLPMLMASK |
>   			    IXGBE_RXDCTL_RLPML_EN);
> @@ -4142,7 +4142,7 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
>   	IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(reg_idx), rxdctl);
>   
>   	ixgbe_rx_desc_queue_enable(adapter, ring);
> -	if (ring->xsk_umem)
> +	if (ring->xsk_pool)
>   		ixgbe_alloc_rx_buffers_zc(ring, ixgbe_desc_unused(ring));
>   	else
>   		ixgbe_alloc_rx_buffers(ring, ixgbe_desc_unused(ring));
> @@ -5292,7 +5292,7 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring)
>   	u16 i = rx_ring->next_to_clean;
>   	struct ixgbe_rx_buffer *rx_buffer = &rx_ring->rx_buffer_info[i];
>   
> -	if (rx_ring->xsk_umem) {
> +	if (rx_ring->xsk_pool) {
>   		ixgbe_xsk_clean_rx_ring(rx_ring);
>   		goto skip_free;
>   	}
> @@ -5984,7 +5984,7 @@ static void ixgbe_clean_tx_ring(struct ixgbe_ring *tx_ring)
>   	u16 i = tx_ring->next_to_clean;
>   	struct ixgbe_tx_buffer *tx_buffer = &tx_ring->tx_buffer_info[i];
>   
> -	if (tx_ring->xsk_umem) {
> +	if (tx_ring->xsk_pool) {
>   		ixgbe_xsk_clean_tx_ring(tx_ring);
>   		goto out;
>   	}
> @@ -10176,7 +10176,7 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
>   	 */
>   	if (need_reset && prog)
>   		for (i = 0; i < adapter->num_rx_queues; i++)
> -			if (adapter->xdp_ring[i]->xsk_umem)
> +			if (adapter->xdp_ring[i]->xsk_pool)
>   				(void)ixgbe_xsk_wakeup(adapter->netdev, i,
>   						       XDP_WAKEUP_RX);
>   
> @@ -10194,8 +10194,8 @@ static int ixgbe_xdp(struct net_device *dev, struct netdev_bpf *xdp)
>   		xdp->prog_id = adapter->xdp_prog ?
>   			adapter->xdp_prog->aux->id : 0;
>   		return 0;
> -	case XDP_SETUP_XSK_UMEM:
> -		return ixgbe_xsk_umem_setup(adapter, xdp->xsk.umem,
> +	case XDP_SETUP_XSK_POOL:
> +		return ixgbe_xsk_pool_setup(adapter, xdp->xsk.pool,
>   					    xdp->xsk.queue_id);
>   
>   	default:
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
> index 7887ae4..2aeec78 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
> @@ -28,9 +28,10 @@ void ixgbe_irq_rearm_queues(struct ixgbe_adapter *adapter, u64 qmask);
>   void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring);
>   void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring);
>   
> -struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter,
> -				struct ixgbe_ring *ring);
> -int ixgbe_xsk_umem_setup(struct ixgbe_adapter *adapter, struct xdp_umem *umem,
> +struct xsk_buff_pool *ixgbe_xsk_pool(struct ixgbe_adapter *adapter,
> +				     struct ixgbe_ring *ring);
> +int ixgbe_xsk_pool_setup(struct ixgbe_adapter *adapter,
> +			 struct xsk_buff_pool *pool,
>   			 u16 qid);
>   
>   void ixgbe_zca_free(struct zero_copy_allocator *alloc, unsigned long handle);
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
> index ec7121f..8ad954f 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
> @@ -8,8 +8,8 @@
>   #include "ixgbe.h"
>   #include "ixgbe_txrx_common.h"
>   
> -struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter,
> -				struct ixgbe_ring *ring)
> +struct xsk_buff_pool *ixgbe_xsk_pool(struct ixgbe_adapter *adapter,
> +				     struct ixgbe_ring *ring)
>   {
>   	bool xdp_on = READ_ONCE(adapter->xdp_prog);
>   	int qid = ring->ring_idx;
> @@ -17,11 +17,11 @@ struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter,
>   	if (!xdp_on || !test_bit(qid, adapter->af_xdp_zc_qps))
>   		return NULL;
>   
> -	return xdp_get_umem_from_qid(adapter->netdev, qid);
> +	return xdp_get_xsk_pool_from_qid(adapter->netdev, qid);
>   }
>   
> -static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
> -				 struct xdp_umem *umem,
> +static int ixgbe_xsk_pool_enable(struct ixgbe_adapter *adapter,
> +				 struct xsk_buff_pool *pool,
>   				 u16 qid)
>   {
>   	struct net_device *netdev = adapter->netdev;
> @@ -35,7 +35,7 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
>   	    qid >= netdev->real_num_tx_queues)
>   		return -EINVAL;
>   
> -	err = xsk_buff_dma_map(umem, &adapter->pdev->dev, IXGBE_RX_DMA_ATTR);
> +	err = xsk_buff_dma_map(pool->umem, &adapter->pdev->dev, IXGBE_RX_DMA_ATTR);
>   	if (err)
>   		return err;
>   
> @@ -59,13 +59,13 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
>   	return 0;
>   }
>   
> -static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid)
> +static int ixgbe_xsk_pool_disable(struct ixgbe_adapter *adapter, u16 qid)
>   {
> -	struct xdp_umem *umem;
> +	struct xsk_buff_pool *pool;
>   	bool if_running;
>   
> -	umem = xdp_get_umem_from_qid(adapter->netdev, qid);
> -	if (!umem)
> +	pool = xdp_get_xsk_pool_from_qid(adapter->netdev, qid);
> +	if (!pool)
>   		return -EINVAL;
>   
>   	if_running = netif_running(adapter->netdev) &&
> @@ -75,7 +75,7 @@ static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid)
>   		ixgbe_txrx_ring_disable(adapter, qid);
>   
>   	clear_bit(qid, adapter->af_xdp_zc_qps);
> -	xsk_buff_dma_unmap(umem, IXGBE_RX_DMA_ATTR);
> +	xsk_buff_dma_unmap(pool->umem, IXGBE_RX_DMA_ATTR);
>   
>   	if (if_running)
>   		ixgbe_txrx_ring_enable(adapter, qid);
> @@ -83,11 +83,12 @@ static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid)
>   	return 0;
>   }
>   
> -int ixgbe_xsk_umem_setup(struct ixgbe_adapter *adapter, struct xdp_umem *umem,
> +int ixgbe_xsk_pool_setup(struct ixgbe_adapter *adapter,
> +			 struct xsk_buff_pool *pool,
>   			 u16 qid)
>   {
> -	return umem ? ixgbe_xsk_umem_enable(adapter, umem, qid) :
> -		ixgbe_xsk_umem_disable(adapter, qid);
> +	return pool ? ixgbe_xsk_pool_enable(adapter, pool, qid) :
> +		ixgbe_xsk_pool_disable(adapter, qid);
>   }
>   
>   static int ixgbe_run_xdp_zc(struct ixgbe_adapter *adapter,
> @@ -149,7 +150,7 @@ bool ixgbe_alloc_rx_buffers_zc(struct ixgbe_ring *rx_ring, u16 count)
>   	i -= rx_ring->count;
>   
>   	do {
> -		bi->xdp = xsk_buff_alloc(rx_ring->xsk_umem);
> +		bi->xdp = xsk_buff_alloc(rx_ring->xsk_pool->umem);
>   		if (!bi->xdp) {
>   			ok = false;
>   			break;
> @@ -344,11 +345,11 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector,
>   	q_vector->rx.total_packets += total_rx_packets;
>   	q_vector->rx.total_bytes += total_rx_bytes;
>   
> -	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_umem)) {
> +	if (xsk_umem_uses_need_wakeup(rx_ring->xsk_pool->umem)) {
>   		if (failure || rx_ring->next_to_clean == rx_ring->next_to_use)
> -			xsk_set_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_set_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   		else
> -			xsk_clear_rx_need_wakeup(rx_ring->xsk_umem);
> +			xsk_clear_rx_need_wakeup(rx_ring->xsk_pool->umem);
>   
>   		return (int)total_rx_packets;
>   	}
> @@ -373,6 +374,7 @@ void ixgbe_xsk_clean_rx_ring(struct ixgbe_ring *rx_ring)
>   
>   static bool ixgbe_xmit_zc(struct ixgbe_ring *xdp_ring, unsigned int budget)
>   {
> +	struct xsk_buff_pool *pool = xdp_ring->xsk_pool;
>   	union ixgbe_adv_tx_desc *tx_desc = NULL;
>   	struct ixgbe_tx_buffer *tx_bi;
>   	bool work_done = true;
> @@ -387,12 +389,11 @@ static bool ixgbe_xmit_zc(struct ixgbe_ring *xdp_ring, unsigned int budget)
>   			break;
>   		}
>   
> -		if (!xsk_umem_consume_tx(xdp_ring->xsk_umem, &desc))
> +		if (!xsk_umem_consume_tx(pool->umem, &desc))
>   			break;
>   
> -		dma = xsk_buff_raw_get_dma(xdp_ring->xsk_umem, desc.addr);
> -		xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_umem, dma,
> -						 desc.len);
> +		dma = xsk_buff_raw_get_dma(pool->umem, desc.addr);
> +		xsk_buff_raw_dma_sync_for_device(pool->umem, dma, desc.len);
>   
>   		tx_bi = &xdp_ring->tx_buffer_info[xdp_ring->next_to_use];
>   		tx_bi->bytecount = desc.len;
> @@ -418,7 +419,7 @@ static bool ixgbe_xmit_zc(struct ixgbe_ring *xdp_ring, unsigned int budget)
>   
>   	if (tx_desc) {
>   		ixgbe_xdp_ring_update_tail(xdp_ring);
> -		xsk_umem_consume_tx_done(xdp_ring->xsk_umem);
> +		xsk_umem_consume_tx_done(pool->umem);
>   	}
>   
>   	return !!budget && work_done;
> @@ -439,7 +440,7 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
>   {
>   	u16 ntc = tx_ring->next_to_clean, ntu = tx_ring->next_to_use;
>   	unsigned int total_packets = 0, total_bytes = 0;
> -	struct xdp_umem *umem = tx_ring->xsk_umem;
> +	struct xsk_buff_pool *pool = tx_ring->xsk_pool;
>   	union ixgbe_adv_tx_desc *tx_desc;
>   	struct ixgbe_tx_buffer *tx_bi;
>   	u32 xsk_frames = 0;
> @@ -484,10 +485,10 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
>   	q_vector->tx.total_packets += total_packets;
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(umem, xsk_frames);
> +		xsk_umem_complete_tx(pool->umem, xsk_frames);
>   
> -	if (xsk_umem_uses_need_wakeup(tx_ring->xsk_umem))
> -		xsk_set_tx_need_wakeup(tx_ring->xsk_umem);
> +	if (xsk_umem_uses_need_wakeup(pool->umem))
> +		xsk_set_tx_need_wakeup(pool->umem);
>   
>   	return ixgbe_xmit_zc(tx_ring, q_vector->tx.work_limit);
>   }
> @@ -511,7 +512,7 @@ int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
>   	if (test_bit(__IXGBE_TX_DISABLED, &ring->state))
>   		return -ENETDOWN;
>   
> -	if (!ring->xsk_umem)
> +	if (!ring->xsk_pool)
>   		return -ENXIO;
>   
>   	if (!napi_if_scheduled_mark_missed(&ring->q_vector->napi)) {
> @@ -526,7 +527,7 @@ int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
>   void ixgbe_xsk_clean_tx_ring(struct ixgbe_ring *tx_ring)
>   {
>   	u16 ntc = tx_ring->next_to_clean, ntu = tx_ring->next_to_use;
> -	struct xdp_umem *umem = tx_ring->xsk_umem;
> +	struct xsk_buff_pool *pool = tx_ring->xsk_pool;
>   	struct ixgbe_tx_buffer *tx_bi;
>   	u32 xsk_frames = 0;
>   
> @@ -546,5 +547,5 @@ void ixgbe_xsk_clean_tx_ring(struct ixgbe_ring *tx_ring)
>   	}
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(umem, xsk_frames);
> +		xsk_umem_complete_tx(pool->umem, xsk_frames);
>   }
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
> index 124caec..57ee887 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
> @@ -24,7 +24,7 @@ mlx5_core-y :=	main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \
>   mlx5_core-$(CONFIG_MLX5_CORE_EN) += en_main.o en_common.o en_fs.o en_ethtool.o \
>   		en_tx.o en_rx.o en_dim.o en_txrx.o en/xdp.o en_stats.o \
>   		en_selftest.o en/port.o en/monitor_stats.o en/health.o \
> -		en/reporter_tx.o en/reporter_rx.o en/params.o en/xsk/umem.o \
> +		en/reporter_tx.o en/reporter_rx.o en/params.o en/xsk/pool.o \
>   		en/xsk/setup.o en/xsk/rx.o en/xsk/tx.o en/devlink.o
>   
>   #
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
> index c446691..d95296e 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
> @@ -441,7 +441,7 @@ struct mlx5e_xdpsq {
>   	struct mlx5e_cq            cq;
>   
>   	/* read only */
> -	struct xdp_umem           *umem;
> +	struct xsk_buff_pool      *xsk_pool;
>   	struct mlx5_wq_cyc         wq;
>   	struct mlx5e_xdpsq_stats  *stats;
>   	mlx5e_fp_xmit_xdp_frame_check xmit_xdp_frame_check;
> @@ -603,7 +603,7 @@ struct mlx5e_rq {
>   	struct page_pool      *page_pool;
>   
>   	/* AF_XDP zero-copy */
> -	struct xdp_umem       *umem;
> +	struct xsk_buff_pool  *xsk_pool;
>   
>   	struct work_struct     recover_work;
>   
> @@ -726,12 +726,13 @@ struct mlx5e_hv_vhca_stats_agent {
>   #endif
>   
>   struct mlx5e_xsk {
> -	/* UMEMs are stored separately from channels, because we don't want to
> -	 * lose them when channels are recreated. The kernel also stores UMEMs,
> -	 * but it doesn't distinguish between zero-copy and non-zero-copy UMEMs,
> -	 * so rely on our mechanism.
> +	/* XSK buffer pools are stored separately from channels,
> +	 * because we don't want to lose them when channels are
> +	 * recreated. The kernel also stores buffer pool, but it doesn't
> +	 * distinguish between zero-copy and non-zero-copy UMEMs, so
> +	 * rely on our mechanism.
>   	 */
> -	struct xdp_umem **umems;
> +	struct xsk_buff_pool **pools;
>   	u16 refcnt;
>   	bool ever_used;
>   };
> @@ -923,7 +924,7 @@ struct mlx5e_xsk_param;
>   struct mlx5e_rq_param;
>   int mlx5e_open_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
>   		  struct mlx5e_rq_param *param, struct mlx5e_xsk_param *xsk,
> -		  struct xdp_umem *umem, struct mlx5e_rq *rq);
> +		  struct xsk_buff_pool *xsk_pool, struct mlx5e_rq *rq);
>   int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time);
>   void mlx5e_deactivate_rq(struct mlx5e_rq *rq);
>   void mlx5e_close_rq(struct mlx5e_rq *rq);
> @@ -933,7 +934,7 @@ int mlx5e_open_icosq(struct mlx5e_channel *c, struct mlx5e_params *params,
>   		     struct mlx5e_sq_param *param, struct mlx5e_icosq *sq);
>   void mlx5e_close_icosq(struct mlx5e_icosq *sq);
>   int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
> -		     struct mlx5e_sq_param *param, struct xdp_umem *umem,
> +		     struct mlx5e_sq_param *param, struct xsk_buff_pool *xsk_pool,
>   		     struct mlx5e_xdpsq *sq, bool is_redirect);
>   void mlx5e_close_xdpsq(struct mlx5e_xdpsq *sq);
>   
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> index c9d308e..c2e06f5 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> @@ -446,7 +446,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
>   	} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(sq->umem, xsk_frames);
> +		xsk_umem_complete_tx(sq->xsk_pool->umem, xsk_frames);
>   
>   	sq->stats->cqes += i;
>   
> @@ -476,7 +476,7 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
>   	}
>   
>   	if (xsk_frames)
> -		xsk_umem_complete_tx(sq->umem, xsk_frames);
> +		xsk_umem_complete_tx(sq->xsk_pool->umem, xsk_frames);
>   }
>   
>   int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
> @@ -561,4 +561,3 @@ void mlx5e_set_xmit_fp(struct mlx5e_xdpsq *sq, bool is_mpw)
>   	sq->xmit_xdp_frame = is_mpw ?
>   		mlx5e_xmit_xdp_frame_mpwqe : mlx5e_xmit_xdp_frame;
>   }
> -
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c
> new file mode 100644
> index 0000000..8ccd920
> --- /dev/null
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c
> @@ -0,0 +1,217 @@
> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> +/* Copyright (c) 2019-2020, Mellanox Technologies inc. All rights reserved. */
> +
> +#include <net/xdp_sock_drv.h>
> +#include "pool.h"
> +#include "setup.h"
> +#include "en/params.h"
> +
> +static int mlx5e_xsk_map_pool(struct mlx5e_priv *priv,
> +			      struct xsk_buff_pool *pool)
> +{
> +	struct device *dev = priv->mdev->device;
> +
> +	return xsk_buff_dma_map(pool->umem, dev, 0);
> +}
> +
> +static void mlx5e_xsk_unmap_pool(struct mlx5e_priv *priv,
> +				 struct xsk_buff_pool *pool)
> +{
> +	return xsk_buff_dma_unmap(pool->umem, 0);
> +}
> +
> +static int mlx5e_xsk_get_pools(struct mlx5e_xsk *xsk)
> +{
> +	if (!xsk->pools) {
> +		xsk->pools = kcalloc(MLX5E_MAX_NUM_CHANNELS,
> +				     sizeof(*xsk->pools), GFP_KERNEL);
> +		if (unlikely(!xsk->pools))
> +			return -ENOMEM;
> +	}
> +
> +	xsk->refcnt++;
> +	xsk->ever_used = true;
> +
> +	return 0;
> +}
> +
> +static void mlx5e_xsk_put_pools(struct mlx5e_xsk *xsk)
> +{
> +	if (!--xsk->refcnt) {
> +		kfree(xsk->pools);
> +		xsk->pools = NULL;
> +	}
> +}
> +
> +static int mlx5e_xsk_add_pool(struct mlx5e_xsk *xsk, struct xsk_buff_pool *pool, u16 ix)
> +{
> +	int err;
> +
> +	err = mlx5e_xsk_get_pools(xsk);
> +	if (unlikely(err))
> +		return err;
> +
> +	xsk->pools[ix] = pool;
> +	return 0;
> +}
> +
> +static void mlx5e_xsk_remove_pool(struct mlx5e_xsk *xsk, u16 ix)
> +{
> +	xsk->pools[ix] = NULL;
> +
> +	mlx5e_xsk_put_pools(xsk);
> +}
> +
> +static bool mlx5e_xsk_is_pool_sane(struct xsk_buff_pool *pool)
> +{
> +	return xsk_umem_get_headroom(pool->umem) <= 0xffff &&
> +		xsk_umem_get_chunk_size(pool->umem) <= 0xffff;
> +}
> +
> +void mlx5e_build_xsk_param(struct xsk_buff_pool *pool, struct mlx5e_xsk_param *xsk)
> +{
> +	xsk->headroom = xsk_umem_get_headroom(pool->umem);
> +	xsk->chunk_size = xsk_umem_get_chunk_size(pool->umem);
> +}
> +
> +static int mlx5e_xsk_enable_locked(struct mlx5e_priv *priv,
> +				   struct xsk_buff_pool *pool, u16 ix)
> +{
> +	struct mlx5e_params *params = &priv->channels.params;
> +	struct mlx5e_xsk_param xsk;
> +	struct mlx5e_channel *c;
> +	int err;
> +
> +	if (unlikely(mlx5e_xsk_get_pool(&priv->channels.params, &priv->xsk, ix)))
> +		return -EBUSY;
> +
> +	if (unlikely(!mlx5e_xsk_is_pool_sane(pool)))
> +		return -EINVAL;
> +
> +	err = mlx5e_xsk_map_pool(priv, pool);
> +	if (unlikely(err))
> +		return err;
> +
> +	err = mlx5e_xsk_add_pool(&priv->xsk, pool, ix);
> +	if (unlikely(err))
> +		goto err_unmap_pool;
> +
> +	mlx5e_build_xsk_param(pool, &xsk);
> +
> +	if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
> +		/* XSK objects will be created on open. */
> +		goto validate_closed;
> +	}
> +
> +	if (!params->xdp_prog) {
> +		/* XSK objects will be created when an XDP program is set,
> +		 * and the channels are reopened.
> +		 */
> +		goto validate_closed;
> +	}
> +
> +	c = priv->channels.c[ix];
> +
> +	err = mlx5e_open_xsk(priv, params, &xsk, pool, c);
> +	if (unlikely(err))
> +		goto err_remove_pool;
> +
> +	mlx5e_activate_xsk(c);
> +
> +	/* Don't wait for WQEs, because the newer xdpsock sample doesn't provide
> +	 * any Fill Ring entries at the setup stage.
> +	 */
> +
> +	err = mlx5e_xsk_redirect_rqt_to_channel(priv, priv->channels.c[ix]);
> +	if (unlikely(err))
> +		goto err_deactivate;
> +
> +	return 0;
> +
> +err_deactivate:
> +	mlx5e_deactivate_xsk(c);
> +	mlx5e_close_xsk(c);
> +
> +err_remove_pool:
> +	mlx5e_xsk_remove_pool(&priv->xsk, ix);
> +
> +err_unmap_pool:
> +	mlx5e_xsk_unmap_pool(priv, pool);
> +
> +	return err;
> +
> +validate_closed:
> +	/* Check the configuration in advance, rather than fail at a later stage
> +	 * (in mlx5e_xdp_set or on open) and end up with no channels.
> +	 */
> +	if (!mlx5e_validate_xsk_param(params, &xsk, priv->mdev)) {
> +		err = -EINVAL;
> +		goto err_remove_pool;
> +	}
> +
> +	return 0;
> +}
> +
> +static int mlx5e_xsk_disable_locked(struct mlx5e_priv *priv, u16 ix)
> +{
> +	struct xsk_buff_pool *pool = mlx5e_xsk_get_pool(&priv->channels.params,
> +						   &priv->xsk, ix);
> +	struct mlx5e_channel *c;
> +
> +	if (unlikely(!pool))
> +		return -EINVAL;
> +
> +	if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
> +		goto remove_pool;
> +
> +	/* XSK RQ and SQ are only created if XDP program is set. */
> +	if (!priv->channels.params.xdp_prog)
> +		goto remove_pool;
> +
> +	c = priv->channels.c[ix];
> +	mlx5e_xsk_redirect_rqt_to_drop(priv, ix);
> +	mlx5e_deactivate_xsk(c);
> +	mlx5e_close_xsk(c);
> +
> +remove_pool:
> +	mlx5e_xsk_remove_pool(&priv->xsk, ix);
> +	mlx5e_xsk_unmap_pool(priv, pool);
> +
> +	return 0;
> +}
> +
> +static int mlx5e_xsk_enable_pool(struct mlx5e_priv *priv, struct xsk_buff_pool *pool,
> +				 u16 ix)
> +{
> +	int err;
> +
> +	mutex_lock(&priv->state_lock);
> +	err = mlx5e_xsk_enable_locked(priv, pool, ix);
> +	mutex_unlock(&priv->state_lock);
> +
> +	return err;
> +}
> +
> +static int mlx5e_xsk_disable_pool(struct mlx5e_priv *priv, u16 ix)
> +{
> +	int err;
> +
> +	mutex_lock(&priv->state_lock);
> +	err = mlx5e_xsk_disable_locked(priv, ix);
> +	mutex_unlock(&priv->state_lock);
> +
> +	return err;
> +}
> +
> +int mlx5e_xsk_setup_pool(struct net_device *dev, struct xsk_buff_pool *pool, u16 qid)
> +{
> +	struct mlx5e_priv *priv = netdev_priv(dev);
> +	struct mlx5e_params *params = &priv->channels.params;
> +	u16 ix;
> +
> +	if (unlikely(!mlx5e_qid_get_ch_if_in_group(params, qid, MLX5E_RQ_GROUP_XSK, &ix)))
> +		return -EINVAL;
> +
> +	return pool ? mlx5e_xsk_enable_pool(priv, pool, ix) :
> +		      mlx5e_xsk_disable_pool(priv, ix);
> +}
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.h
> new file mode 100644
> index 0000000..dca0010
> --- /dev/null
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.h
> @@ -0,0 +1,27 @@
> +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
> +/* Copyright (c) 2019-2020, Mellanox Technologies inc. All rights reserved. */
> +
> +#ifndef __MLX5_EN_XSK_POOL_H__
> +#define __MLX5_EN_XSK_POOL_H__
> +
> +#include "en.h"
> +
> +static inline struct xsk_buff_pool *mlx5e_xsk_get_pool(struct mlx5e_params *params,
> +						       struct mlx5e_xsk *xsk, u16 ix)
> +{
> +	if (!xsk || !xsk->pools)
> +		return NULL;
> +
> +	if (unlikely(ix >= params->num_channels))
> +		return NULL;
> +
> +	return xsk->pools[ix];
> +}
> +
> +struct mlx5e_xsk_param;
> +void mlx5e_build_xsk_param(struct xsk_buff_pool *pool, struct mlx5e_xsk_param *xsk);
> +
> +/* .ndo_bpf callback. */
> +int mlx5e_xsk_setup_pool(struct net_device *dev, struct xsk_buff_pool *pool, u16 qid);
> +
> +#endif /* __MLX5_EN_XSK_POOL_H__ */
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
> index d147b2f..3dd056a 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
> @@ -19,10 +19,10 @@ struct sk_buff *mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
>   					      struct mlx5e_wqe_frag_info *wi,
>   					      u32 cqe_bcnt);
>   
> -static inline int mlx5e_xsk_page_alloc_umem(struct mlx5e_rq *rq,
> +static inline int mlx5e_xsk_page_alloc_pool(struct mlx5e_rq *rq,
>   					    struct mlx5e_dma_info *dma_info)
>   {
> -	dma_info->xsk = xsk_buff_alloc(rq->umem);
> +	dma_info->xsk = xsk_buff_alloc(rq->xsk_pool->umem);
>   	if (!dma_info->xsk)
>   		return -ENOMEM;
>   
> @@ -38,13 +38,13 @@ static inline int mlx5e_xsk_page_alloc_umem(struct mlx5e_rq *rq,
>   
>   static inline bool mlx5e_xsk_update_rx_wakeup(struct mlx5e_rq *rq, bool alloc_err)
>   {
> -	if (!xsk_umem_uses_need_wakeup(rq->umem))
> +	if (!xsk_umem_uses_need_wakeup(rq->xsk_pool->umem))
>   		return alloc_err;
>   
>   	if (unlikely(alloc_err))
> -		xsk_set_rx_need_wakeup(rq->umem);
> +		xsk_set_rx_need_wakeup(rq->xsk_pool->umem);
>   	else
> -		xsk_clear_rx_need_wakeup(rq->umem);
> +		xsk_clear_rx_need_wakeup(rq->xsk_pool->umem);
>   
>   	return false;
>   }
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
> index cc46414..a0b9dff 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
> @@ -44,7 +44,7 @@ static void mlx5e_build_xsk_cparam(struct mlx5e_priv *priv,
>   }
>   
>   int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
> -		   struct mlx5e_xsk_param *xsk, struct xdp_umem *umem,
> +		   struct mlx5e_xsk_param *xsk, struct xsk_buff_pool *pool,
>   		   struct mlx5e_channel *c)
>   {
>   	struct mlx5e_channel_param *cparam;
> @@ -63,7 +63,7 @@ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
>   	if (unlikely(err))
>   		goto err_free_cparam;
>   
> -	err = mlx5e_open_rq(c, params, &cparam->rq, xsk, umem, &c->xskrq);
> +	err = mlx5e_open_rq(c, params, &cparam->rq, xsk, pool, &c->xskrq);
>   	if (unlikely(err))
>   		goto err_close_rx_cq;
>   
> @@ -71,13 +71,13 @@ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
>   	if (unlikely(err))
>   		goto err_close_rq;
>   
> -	/* Create a separate SQ, so that when the UMEM is disabled, we could
> +	/* Create a separate SQ, so that when the buff pool is disabled, we could
>   	 * close this SQ safely and stop receiving CQEs. In other case, e.g., if
> -	 * the XDPSQ was used instead, we might run into trouble when the UMEM
> +	 * the XDPSQ was used instead, we might run into trouble when the buff pool
>   	 * is disabled and then reenabled, but the SQ continues receiving CQEs
> -	 * from the old UMEM.
> +	 * from the old buff pool.
>   	 */
> -	err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, umem, &c->xsksq, true);
> +	err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, pool, &c->xsksq, true);
>   	if (unlikely(err))
>   		goto err_close_tx_cq;
>   
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.h
> index 0dd11b8..ca20f1f 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.h
> @@ -12,7 +12,7 @@ bool mlx5e_validate_xsk_param(struct mlx5e_params *params,
>   			      struct mlx5e_xsk_param *xsk,
>   			      struct mlx5_core_dev *mdev);
>   int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
> -		   struct mlx5e_xsk_param *xsk, struct xdp_umem *umem,
> +		   struct mlx5e_xsk_param *xsk, struct xsk_buff_pool *pool,
>   		   struct mlx5e_channel *c);
>   void mlx5e_close_xsk(struct mlx5e_channel *c);
>   void mlx5e_activate_xsk(struct mlx5e_channel *c);
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
> index e0b3c61..e46ca86 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
> @@ -2,7 +2,7 @@
>   /* Copyright (c) 2019 Mellanox Technologies. */
>   
>   #include "tx.h"
> -#include "umem.h"
> +#include "pool.h"
>   #include "en/xdp.h"
>   #include "en/params.h"
>   #include <net/xdp_sock_drv.h>
> @@ -66,7 +66,7 @@ static void mlx5e_xsk_tx_post_err(struct mlx5e_xdpsq *sq,
>   
>   bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget)
>   {
> -	struct xdp_umem *umem = sq->umem;
> +	struct xsk_buff_pool *pool = sq->xsk_pool;
>   	struct mlx5e_xdp_info xdpi;
>   	struct mlx5e_xdp_xmit_data xdptxd;
>   	bool work_done = true;
> @@ -83,7 +83,7 @@ bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget)
>   			break;
>   		}
>   
> -		if (!xsk_umem_consume_tx(umem, &desc)) {
> +		if (!xsk_umem_consume_tx(pool->umem, &desc)) {
>   			/* TX will get stuck until something wakes it up by
>   			 * triggering NAPI. Currently it's expected that the
>   			 * application calls sendto() if there are consumed, but
> @@ -92,11 +92,11 @@ bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget)
>   			break;
>   		}
>   
> -		xdptxd.dma_addr = xsk_buff_raw_get_dma(umem, desc.addr);
> -		xdptxd.data = xsk_buff_raw_get_data(umem, desc.addr);
> +		xdptxd.dma_addr = xsk_buff_raw_get_dma(pool->umem, desc.addr);
> +		xdptxd.data = xsk_buff_raw_get_data(pool->umem, desc.addr);
>   		xdptxd.len = desc.len;
>   
> -		xsk_buff_raw_dma_sync_for_device(umem, xdptxd.dma_addr, xdptxd.len);
> +		xsk_buff_raw_dma_sync_for_device(pool->umem, xdptxd.dma_addr, xdptxd.len);
>   
>   		if (unlikely(!sq->xmit_xdp_frame(sq, &xdptxd, &xdpi, check_result))) {
>   			if (sq->mpwqe.wqe)
> @@ -113,7 +113,7 @@ bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget)
>   			mlx5e_xdp_mpwqe_complete(sq);
>   		mlx5e_xmit_xdp_doorbell(sq);
>   
> -		xsk_umem_consume_tx_done(umem);
> +		xsk_umem_consume_tx_done(pool->umem);
>   	}
>   
>   	return !(budget && work_done);
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h
> index 39fa0a7..ddb61d5 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h
> @@ -15,13 +15,13 @@ bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget);
>   
>   static inline void mlx5e_xsk_update_tx_wakeup(struct mlx5e_xdpsq *sq)
>   {
> -	if (!xsk_umem_uses_need_wakeup(sq->umem))
> +	if (!xsk_umem_uses_need_wakeup(sq->xsk_pool->umem))
>   		return;
>   
>   	if (sq->pc != sq->cc)
> -		xsk_clear_tx_need_wakeup(sq->umem);
> +		xsk_clear_tx_need_wakeup(sq->xsk_pool->umem);
>   	else
> -		xsk_set_tx_need_wakeup(sq->umem);
> +		xsk_set_tx_need_wakeup(sq->xsk_pool->umem);
>   }
>   
>   #endif /* __MLX5_EN_XSK_TX_H__ */
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
> deleted file mode 100644
> index 331ca2b..0000000
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
> +++ /dev/null
> @@ -1,217 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> -/* Copyright (c) 2019 Mellanox Technologies. */
> -
> -#include <net/xdp_sock_drv.h>
> -#include "umem.h"
> -#include "setup.h"
> -#include "en/params.h"
> -
> -static int mlx5e_xsk_map_umem(struct mlx5e_priv *priv,
> -			      struct xdp_umem *umem)
> -{
> -	struct device *dev = priv->mdev->device;
> -
> -	return xsk_buff_dma_map(umem, dev, 0);
> -}
> -
> -static void mlx5e_xsk_unmap_umem(struct mlx5e_priv *priv,
> -				 struct xdp_umem *umem)
> -{
> -	return xsk_buff_dma_unmap(umem, 0);
> -}
> -
> -static int mlx5e_xsk_get_umems(struct mlx5e_xsk *xsk)
> -{
> -	if (!xsk->umems) {
> -		xsk->umems = kcalloc(MLX5E_MAX_NUM_CHANNELS,
> -				     sizeof(*xsk->umems), GFP_KERNEL);
> -		if (unlikely(!xsk->umems))
> -			return -ENOMEM;
> -	}
> -
> -	xsk->refcnt++;
> -	xsk->ever_used = true;
> -
> -	return 0;
> -}
> -
> -static void mlx5e_xsk_put_umems(struct mlx5e_xsk *xsk)
> -{
> -	if (!--xsk->refcnt) {
> -		kfree(xsk->umems);
> -		xsk->umems = NULL;
> -	}
> -}
> -
> -static int mlx5e_xsk_add_umem(struct mlx5e_xsk *xsk, struct xdp_umem *umem, u16 ix)
> -{
> -	int err;
> -
> -	err = mlx5e_xsk_get_umems(xsk);
> -	if (unlikely(err))
> -		return err;
> -
> -	xsk->umems[ix] = umem;
> -	return 0;
> -}
> -
> -static void mlx5e_xsk_remove_umem(struct mlx5e_xsk *xsk, u16 ix)
> -{
> -	xsk->umems[ix] = NULL;
> -
> -	mlx5e_xsk_put_umems(xsk);
> -}
> -
> -static bool mlx5e_xsk_is_umem_sane(struct xdp_umem *umem)
> -{
> -	return xsk_umem_get_headroom(umem) <= 0xffff &&
> -		xsk_umem_get_chunk_size(umem) <= 0xffff;
> -}
> -
> -void mlx5e_build_xsk_param(struct xdp_umem *umem, struct mlx5e_xsk_param *xsk)
> -{
> -	xsk->headroom = xsk_umem_get_headroom(umem);
> -	xsk->chunk_size = xsk_umem_get_chunk_size(umem);
> -}
> -
> -static int mlx5e_xsk_enable_locked(struct mlx5e_priv *priv,
> -				   struct xdp_umem *umem, u16 ix)
> -{
> -	struct mlx5e_params *params = &priv->channels.params;
> -	struct mlx5e_xsk_param xsk;
> -	struct mlx5e_channel *c;
> -	int err;
> -
> -	if (unlikely(mlx5e_xsk_get_umem(&priv->channels.params, &priv->xsk, ix)))
> -		return -EBUSY;
> -
> -	if (unlikely(!mlx5e_xsk_is_umem_sane(umem)))
> -		return -EINVAL;
> -
> -	err = mlx5e_xsk_map_umem(priv, umem);
> -	if (unlikely(err))
> -		return err;
> -
> -	err = mlx5e_xsk_add_umem(&priv->xsk, umem, ix);
> -	if (unlikely(err))
> -		goto err_unmap_umem;
> -
> -	mlx5e_build_xsk_param(umem, &xsk);
> -
> -	if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
> -		/* XSK objects will be created on open. */
> -		goto validate_closed;
> -	}
> -
> -	if (!params->xdp_prog) {
> -		/* XSK objects will be created when an XDP program is set,
> -		 * and the channels are reopened.
> -		 */
> -		goto validate_closed;
> -	}
> -
> -	c = priv->channels.c[ix];
> -
> -	err = mlx5e_open_xsk(priv, params, &xsk, umem, c);
> -	if (unlikely(err))
> -		goto err_remove_umem;
> -
> -	mlx5e_activate_xsk(c);
> -
> -	/* Don't wait for WQEs, because the newer xdpsock sample doesn't provide
> -	 * any Fill Ring entries at the setup stage.
> -	 */
> -
> -	err = mlx5e_xsk_redirect_rqt_to_channel(priv, priv->channels.c[ix]);
> -	if (unlikely(err))
> -		goto err_deactivate;
> -
> -	return 0;
> -
> -err_deactivate:
> -	mlx5e_deactivate_xsk(c);
> -	mlx5e_close_xsk(c);
> -
> -err_remove_umem:
> -	mlx5e_xsk_remove_umem(&priv->xsk, ix);
> -
> -err_unmap_umem:
> -	mlx5e_xsk_unmap_umem(priv, umem);
> -
> -	return err;
> -
> -validate_closed:
> -	/* Check the configuration in advance, rather than fail at a later stage
> -	 * (in mlx5e_xdp_set or on open) and end up with no channels.
> -	 */
> -	if (!mlx5e_validate_xsk_param(params, &xsk, priv->mdev)) {
> -		err = -EINVAL;
> -		goto err_remove_umem;
> -	}
> -
> -	return 0;
> -}
> -
> -static int mlx5e_xsk_disable_locked(struct mlx5e_priv *priv, u16 ix)
> -{
> -	struct xdp_umem *umem = mlx5e_xsk_get_umem(&priv->channels.params,
> -						   &priv->xsk, ix);
> -	struct mlx5e_channel *c;
> -
> -	if (unlikely(!umem))
> -		return -EINVAL;
> -
> -	if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
> -		goto remove_umem;
> -
> -	/* XSK RQ and SQ are only created if XDP program is set. */
> -	if (!priv->channels.params.xdp_prog)
> -		goto remove_umem;
> -
> -	c = priv->channels.c[ix];
> -	mlx5e_xsk_redirect_rqt_to_drop(priv, ix);
> -	mlx5e_deactivate_xsk(c);
> -	mlx5e_close_xsk(c);
> -
> -remove_umem:
> -	mlx5e_xsk_remove_umem(&priv->xsk, ix);
> -	mlx5e_xsk_unmap_umem(priv, umem);
> -
> -	return 0;
> -}
> -
> -static int mlx5e_xsk_enable_umem(struct mlx5e_priv *priv, struct xdp_umem *umem,
> -				 u16 ix)
> -{
> -	int err;
> -
> -	mutex_lock(&priv->state_lock);
> -	err = mlx5e_xsk_enable_locked(priv, umem, ix);
> -	mutex_unlock(&priv->state_lock);
> -
> -	return err;
> -}
> -
> -static int mlx5e_xsk_disable_umem(struct mlx5e_priv *priv, u16 ix)
> -{
> -	int err;
> -
> -	mutex_lock(&priv->state_lock);
> -	err = mlx5e_xsk_disable_locked(priv, ix);
> -	mutex_unlock(&priv->state_lock);
> -
> -	return err;
> -}
> -
> -int mlx5e_xsk_setup_umem(struct net_device *dev, struct xdp_umem *umem, u16 qid)
> -{
> -	struct mlx5e_priv *priv = netdev_priv(dev);
> -	struct mlx5e_params *params = &priv->channels.params;
> -	u16 ix;
> -
> -	if (unlikely(!mlx5e_qid_get_ch_if_in_group(params, qid, MLX5E_RQ_GROUP_XSK, &ix)))
> -		return -EINVAL;
> -
> -	return umem ? mlx5e_xsk_enable_umem(priv, umem, ix) :
> -		      mlx5e_xsk_disable_umem(priv, ix);
> -}
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
> deleted file mode 100644
> index bada949..0000000
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
> -/* Copyright (c) 2019 Mellanox Technologies. */
> -
> -#ifndef __MLX5_EN_XSK_UMEM_H__
> -#define __MLX5_EN_XSK_UMEM_H__
> -
> -#include "en.h"
> -
> -static inline struct xdp_umem *mlx5e_xsk_get_umem(struct mlx5e_params *params,
> -						  struct mlx5e_xsk *xsk, u16 ix)
> -{
> -	if (!xsk || !xsk->umems)
> -		return NULL;
> -
> -	if (unlikely(ix >= params->num_channels))
> -		return NULL;
> -
> -	return xsk->umems[ix];
> -}
> -
> -struct mlx5e_xsk_param;
> -void mlx5e_build_xsk_param(struct xdp_umem *umem, struct mlx5e_xsk_param *xsk);
> -
> -/* .ndo_bpf callback. */
> -int mlx5e_xsk_setup_umem(struct net_device *dev, struct xdp_umem *umem, u16 qid);
> -
> -int mlx5e_xsk_resize_reuseq(struct xdp_umem *umem, u32 nentries);
> -
> -#endif /* __MLX5_EN_XSK_UMEM_H__ */
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> index af849bc..20eec70 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> @@ -32,7 +32,7 @@
>   
>   #include "en.h"
>   #include "en/port.h"
> -#include "en/xsk/umem.h"
> +#include "en/xsk/pool.h"
>   #include "lib/clock.h"
>   
>   void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> index 83c9b2b..b416a8e 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> @@ -33,7 +33,7 @@
>   #include <linux/mlx5/fs.h>
>   #include "en.h"
>   #include "en/params.h"
> -#include "en/xsk/umem.h"
> +#include "en/xsk/pool.h"
>   
>   struct mlx5e_ethtool_rule {
>   	struct list_head             list;
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> index 4e5d83f..fa42822 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> @@ -58,7 +58,7 @@
>   #include "en/monitor_stats.h"
>   #include "en/health.h"
>   #include "en/params.h"
> -#include "en/xsk/umem.h"
> +#include "en/xsk/pool.h"
>   #include "en/xsk/setup.h"
>   #include "en/xsk/rx.h"
>   #include "en/xsk/tx.h"
> @@ -365,7 +365,7 @@ static void mlx5e_rq_err_cqe_work(struct work_struct *recover_work)
>   static int mlx5e_alloc_rq(struct mlx5e_channel *c,
>   			  struct mlx5e_params *params,
>   			  struct mlx5e_xsk_param *xsk,
> -			  struct xdp_umem *umem,
> +			  struct xsk_buff_pool *xsk_pool,
>   			  struct mlx5e_rq_param *rqp,
>   			  struct mlx5e_rq *rq)
>   {
> @@ -391,9 +391,9 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
>   	rq->mdev    = mdev;
>   	rq->hw_mtu  = MLX5E_SW2HW_MTU(params, params->sw_mtu);
>   	rq->xdpsq   = &c->rq_xdpsq;
> -	rq->umem    = umem;
> +	rq->xsk_pool = xsk_pool;
>   
> -	if (rq->umem)
> +	if (rq->xsk_pool)
>   		rq->stats = &c->priv->channel_stats[c->ix].xskrq;
>   	else
>   		rq->stats = &c->priv->channel_stats[c->ix].rq;
> @@ -518,7 +518,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
>   	if (xsk) {
>   		err = xdp_rxq_info_reg_mem_model(&rq->xdp_rxq,
>   						 MEM_TYPE_XSK_BUFF_POOL, NULL);
> -		xsk_buff_set_rxq_info(rq->umem, &rq->xdp_rxq);
> +		xsk_buff_set_rxq_info(rq->xsk_pool->umem, &rq->xdp_rxq);
>   	} else {
>   		/* Create a page_pool and register it with rxq */
>   		pp_params.order     = 0;
> @@ -857,11 +857,11 @@ void mlx5e_free_rx_descs(struct mlx5e_rq *rq)
>   
>   int mlx5e_open_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
>   		  struct mlx5e_rq_param *param, struct mlx5e_xsk_param *xsk,
> -		  struct xdp_umem *umem, struct mlx5e_rq *rq)
> +		  struct xsk_buff_pool *xsk_pool, struct mlx5e_rq *rq)
>   {
>   	int err;
>   
> -	err = mlx5e_alloc_rq(c, params, xsk, umem, param, rq);
> +	err = mlx5e_alloc_rq(c, params, xsk, xsk_pool, param, rq);
>   	if (err)
>   		return err;
>   
> @@ -966,7 +966,7 @@ static int mlx5e_alloc_xdpsq_db(struct mlx5e_xdpsq *sq, int numa)
>   
>   static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
>   			     struct mlx5e_params *params,
> -			     struct xdp_umem *umem,
> +			     struct xsk_buff_pool *xsk_pool,
>   			     struct mlx5e_sq_param *param,
>   			     struct mlx5e_xdpsq *sq,
>   			     bool is_redirect)
> @@ -982,9 +982,9 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
>   	sq->uar_map   = mdev->mlx5e_res.bfreg.map;
>   	sq->min_inline_mode = params->tx_min_inline_mode;
>   	sq->hw_mtu    = MLX5E_SW2HW_MTU(params, params->sw_mtu);
> -	sq->umem      = umem;
> +	sq->xsk_pool  = xsk_pool;
>   
> -	sq->stats = sq->umem ?
> +	sq->stats = sq->xsk_pool ?
>   		&c->priv->channel_stats[c->ix].xsksq :
>   		is_redirect ?
>   			&c->priv->channel_stats[c->ix].xdpsq :
> @@ -1449,13 +1449,13 @@ void mlx5e_close_icosq(struct mlx5e_icosq *sq)
>   }
>   
>   int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
> -		     struct mlx5e_sq_param *param, struct xdp_umem *umem,
> +		     struct mlx5e_sq_param *param, struct xsk_buff_pool *xsk_pool,
>   		     struct mlx5e_xdpsq *sq, bool is_redirect)
>   {
>   	struct mlx5e_create_sq_param csp = {};
>   	int err;
>   
> -	err = mlx5e_alloc_xdpsq(c, params, umem, param, sq, is_redirect);
> +	err = mlx5e_alloc_xdpsq(c, params, xsk_pool, param, sq, is_redirect);
>   	if (err)
>   		return err;
>   
> @@ -1948,7 +1948,7 @@ static u8 mlx5e_enumerate_lag_port(struct mlx5_core_dev *mdev, int ix)
>   static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
>   			      struct mlx5e_params *params,
>   			      struct mlx5e_channel_param *cparam,
> -			      struct xdp_umem *umem,
> +			      struct xsk_buff_pool *xsk_pool,
>   			      struct mlx5e_channel **cp)
>   {
>   	int cpu = cpumask_first(mlx5_comp_irq_get_affinity_mask(priv->mdev, ix));
> @@ -1987,9 +1987,9 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
>   	if (unlikely(err))
>   		goto err_napi_del;
>   
> -	if (umem) {
> -		mlx5e_build_xsk_param(umem, &xsk);
> -		err = mlx5e_open_xsk(priv, params, &xsk, umem, c);
> +	if (xsk_pool) {
> +		mlx5e_build_xsk_param(xsk_pool, &xsk);
> +		err = mlx5e_open_xsk(priv, params, &xsk, xsk_pool, c);
>   		if (unlikely(err))
>   			goto err_close_queues;
>   	}
> @@ -2350,12 +2350,12 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,
>   
>   	mlx5e_build_channel_param(priv, &chs->params, cparam);
>   	for (i = 0; i < chs->num; i++) {
> -		struct xdp_umem *umem = NULL;
> +		struct xsk_buff_pool *xsk_pool = NULL;
>   
>   		if (chs->params.xdp_prog)
> -			umem = mlx5e_xsk_get_umem(&chs->params, chs->params.xsk, i);
> +			xsk_pool = mlx5e_xsk_get_pool(&chs->params, chs->params.xsk, i);
>   
> -		err = mlx5e_open_channel(priv, i, &chs->params, cparam, umem, &chs->c[i]);
> +		err = mlx5e_open_channel(priv, i, &chs->params, cparam, xsk_pool, &chs->c[i]);
>   		if (err)
>   			goto err_close_channels;
>   	}
> @@ -3914,13 +3914,14 @@ static bool mlx5e_xsk_validate_mtu(struct net_device *netdev,
>   	u16 ix;
>   
>   	for (ix = 0; ix < chs->params.num_channels; ix++) {
> -		struct xdp_umem *umem = mlx5e_xsk_get_umem(&chs->params, chs->params.xsk, ix);
> +		struct xsk_buff_pool *xsk_pool =
> +			mlx5e_xsk_get_pool(&chs->params, chs->params.xsk, ix);
>   		struct mlx5e_xsk_param xsk;
>   
> -		if (!umem)
> +		if (!xsk_pool)
>   			continue;
>   
> -		mlx5e_build_xsk_param(umem, &xsk);
> +		mlx5e_build_xsk_param(xsk_pool, &xsk);
>   
>   		if (!mlx5e_validate_xsk_param(new_params, &xsk, mdev)) {
>   			u32 hr = mlx5e_get_linear_rq_headroom(new_params, &xsk);
> @@ -4540,8 +4541,8 @@ static int mlx5e_xdp(struct net_device *dev, struct netdev_bpf *xdp)
>   	case XDP_QUERY_PROG:
>   		xdp->prog_id = mlx5e_xdp_query(dev);
>   		return 0;
> -	case XDP_SETUP_XSK_UMEM:
> -		return mlx5e_xsk_setup_umem(dev, xdp->xsk.umem,
> +	case XDP_SETUP_XSK_POOL:
> +		return mlx5e_xsk_setup_pool(dev, xdp->xsk.pool,
>   					    xdp->xsk.queue_id);
>   	default:
>   		return -EINVAL;
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> index 350f9c5..4f9a1d6 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> @@ -264,8 +264,8 @@ static inline int mlx5e_page_alloc_pool(struct mlx5e_rq *rq,
>   static inline int mlx5e_page_alloc(struct mlx5e_rq *rq,
>   				   struct mlx5e_dma_info *dma_info)
>   {
> -	if (rq->umem)
> -		return mlx5e_xsk_page_alloc_umem(rq, dma_info);
> +	if (rq->xsk_pool)
> +		return mlx5e_xsk_page_alloc_pool(rq, dma_info);
>   	else
>   		return mlx5e_page_alloc_pool(rq, dma_info);
>   }
> @@ -296,7 +296,7 @@ static inline void mlx5e_page_release(struct mlx5e_rq *rq,
>   				      struct mlx5e_dma_info *dma_info,
>   				      bool recycle)
>   {
> -	if (rq->umem)
> +	if (rq->xsk_pool)
>   		/* The `recycle` parameter is ignored, and the page is always
>   		 * put into the Reuse Ring, because there is no way to return
>   		 * the page to the userspace when the interface goes down.
> @@ -383,14 +383,14 @@ static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, u8 wqe_bulk)
>   	int err;
>   	int i;
>   
> -	if (rq->umem) {
> +	if (rq->xsk_pool) {
>   		int pages_desired = wqe_bulk << rq->wqe.info.log_num_frags;
>   
>   		/* Check in advance that we have enough frames, instead of
>   		 * allocating one-by-one, failing and moving frames to the
>   		 * Reuse Ring.
>   		 */
> -		if (unlikely(!xsk_buff_can_alloc(rq->umem, pages_desired)))
> +		if (unlikely(!xsk_buff_can_alloc(rq->xsk_pool->umem, pages_desired)))
>   			return -ENOMEM;
>   	}
>   
> @@ -488,8 +488,8 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
>   	/* Check in advance that we have enough frames, instead of allocating
>   	 * one-by-one, failing and moving frames to the Reuse Ring.
>   	 */
> -	if (rq->umem &&
> -	    unlikely(!xsk_buff_can_alloc(rq->umem, MLX5_MPWRQ_PAGES_PER_WQE))) {
> +	if (rq->xsk_pool &&
> +	    unlikely(!xsk_buff_can_alloc(rq->xsk_pool->umem, MLX5_MPWRQ_PAGES_PER_WQE))) {
>   		err = -ENOMEM;
>   		goto err;
>   	}
> @@ -737,7 +737,7 @@ bool mlx5e_post_rx_mpwqes(struct mlx5e_rq *rq)
>   	 * the driver when it refills the Fill Ring.
>   	 * 2. Otherwise, busy poll by rescheduling the NAPI poll.
>   	 */
> -	if (unlikely(alloc_err == -ENOMEM && rq->umem))
> +	if (unlikely(alloc_err == -ENOMEM && rq->xsk_pool))
>   		return true;
>   
>   	return false;
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index ac2cd3f..3939806 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -618,7 +618,7 @@ struct netdev_queue {
>   	/* Subordinate device that the queue has been assigned to */
>   	struct net_device	*sb_dev;
>   #ifdef CONFIG_XDP_SOCKETS
> -	struct xdp_umem         *umem;
> +	struct xsk_buff_pool    *pool;
>   #endif
>   /*
>    * write-mostly part
> @@ -751,7 +751,7 @@ struct netdev_rx_queue {
>   	struct net_device		*dev;
>   	struct xdp_rxq_info		xdp_rxq;
>   #ifdef CONFIG_XDP_SOCKETS
> -	struct xdp_umem                 *umem;
> +	struct xsk_buff_pool            *pool;
>   #endif
>   } ____cacheline_aligned_in_smp;
>   
> @@ -881,7 +881,7 @@ enum bpf_netdev_command {
>   	/* BPF program for offload callbacks, invoked at program load time. */
>   	BPF_OFFLOAD_MAP_ALLOC,
>   	BPF_OFFLOAD_MAP_FREE,
> -	XDP_SETUP_XSK_UMEM,
> +	XDP_SETUP_XSK_POOL,
>   };
>   
>   struct bpf_prog_offload_ops;
> @@ -908,9 +908,9 @@ struct netdev_bpf {
>   		struct {
>   			struct bpf_offloaded_map *offmap;
>   		};
> -		/* XDP_SETUP_XSK_UMEM */
> +		/* XDP_SETUP_XSK_POOL */
>   		struct {
> -			struct xdp_umem *umem;
> +			struct xsk_buff_pool *pool;
>   			u16 queue_id;
>   		} xsk;
>   	};
> diff --git a/include/net/xdp_sock_drv.h b/include/net/xdp_sock_drv.h
> index ccf848f..5dc8d3c 100644
> --- a/include/net/xdp_sock_drv.h
> +++ b/include/net/xdp_sock_drv.h
> @@ -14,7 +14,8 @@
>   void xsk_umem_complete_tx(struct xdp_umem *umem, u32 nb_entries);
>   bool xsk_umem_consume_tx(struct xdp_umem *umem, struct xdp_desc *desc);
>   void xsk_umem_consume_tx_done(struct xdp_umem *umem);
> -struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev, u16 queue_id);
> +struct xsk_buff_pool *xdp_get_xsk_pool_from_qid(struct net_device *dev,
> +						u16 queue_id);
>   void xsk_set_rx_need_wakeup(struct xdp_umem *umem);
>   void xsk_set_tx_need_wakeup(struct xdp_umem *umem);
>   void xsk_clear_rx_need_wakeup(struct xdp_umem *umem);
> @@ -125,8 +126,8 @@ static inline void xsk_umem_consume_tx_done(struct xdp_umem *umem)
>   {
>   }
>   
> -static inline struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev,
> -						     u16 queue_id)
> +static inline struct xsk_buff_pool *
> +xdp_get_xsk_pool_from_qid(struct net_device *dev, u16 queue_id)
>   {
>   	return NULL;
>   }
> diff --git a/include/net/xsk_buff_pool.h b/include/net/xsk_buff_pool.h
> index 6842990..f851b0a 100644
> --- a/include/net/xsk_buff_pool.h
> +++ b/include/net/xsk_buff_pool.h
> @@ -13,6 +13,7 @@ struct xsk_buff_pool;
>   struct xdp_rxq_info;
>   struct xsk_queue;
>   struct xdp_desc;
> +struct xdp_umem;
>   struct device;
>   struct page;
>   
> @@ -42,13 +43,14 @@ struct xsk_buff_pool {
>   	u32 frame_len;
>   	bool dma_need_sync;
>   	bool unaligned;
> +	struct xdp_umem *umem;
>   	void *addrs;
>   	struct device *dev;
>   	struct xdp_buff_xsk *free_heads[];
>   };
>   
>   /* AF_XDP core. */
> -struct xsk_buff_pool *xp_create(struct page **pages, u32 nr_pages, u32 chunks,
> +struct xsk_buff_pool *xp_create(struct xdp_umem *umem, u32 chunks,
>   				u32 chunk_size, u32 headroom, u64 size,
>   				bool unaligned);
>   void xp_set_fq(struct xsk_buff_pool *pool, struct xsk_queue *fq);
> diff --git a/net/ethtool/channels.c b/net/ethtool/channels.c
> index 9ef54cd..78d990b 100644
> --- a/net/ethtool/channels.c
> +++ b/net/ethtool/channels.c
> @@ -223,7 +223,7 @@ int ethnl_set_channels(struct sk_buff *skb, struct genl_info *info)
>   	from_channel = channels.combined_count +
>   		       min(channels.rx_count, channels.tx_count);
>   	for (i = from_channel; i < old_total; i++)
> -		if (xdp_get_umem_from_qid(dev, i)) {
> +		if (xdp_get_xsk_pool_from_qid(dev, i)) {
>   			GENL_SET_ERR_MSG(info, "requested channel counts are too low for existing zerocopy AF_XDP sockets");
>   			return -EINVAL;
>   		}
> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
> index 441794e..2e6a678 100644
> --- a/net/ethtool/ioctl.c
> +++ b/net/ethtool/ioctl.c
> @@ -1706,7 +1706,7 @@ static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
>   		min(channels.rx_count, channels.tx_count);
>   	to_channel = curr.combined_count + max(curr.rx_count, curr.tx_count);
>   	for (i = from_channel; i < to_channel; i++)
> -		if (xdp_get_umem_from_qid(dev, i))
> +		if (xdp_get_xsk_pool_from_qid(dev, i))
>   			return -EINVAL;
>   
>   	ret = dev->ethtool_ops->set_channels(dev, &channels);
> diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
> index e97db37..0b5f3b0 100644
> --- a/net/xdp/xdp_umem.c
> +++ b/net/xdp/xdp_umem.c
> @@ -51,8 +51,9 @@ void xdp_del_sk_umem(struct xdp_umem *umem, struct xdp_sock *xs)
>    * not know if the device has more tx queues than rx, or the opposite.
>    * This might also change during run time.
>    */
> -static int xdp_reg_umem_at_qid(struct net_device *dev, struct xdp_umem *umem,
> -			       u16 queue_id)
> +static int xdp_reg_xsk_pool_at_qid(struct net_device *dev,
> +				   struct xsk_buff_pool *pool,
> +				   u16 queue_id)
>   {
>   	if (queue_id >= max_t(unsigned int,
>   			      dev->real_num_rx_queues,
> @@ -60,31 +61,31 @@ static int xdp_reg_umem_at_qid(struct net_device *dev, struct xdp_umem *umem,
>   		return -EINVAL;
>   
>   	if (queue_id < dev->real_num_rx_queues)
> -		dev->_rx[queue_id].umem = umem;
> +		dev->_rx[queue_id].pool = pool;
>   	if (queue_id < dev->real_num_tx_queues)
> -		dev->_tx[queue_id].umem = umem;
> +		dev->_tx[queue_id].pool = pool;
>   
>   	return 0;
>   }
>   
> -struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev,
> -				       u16 queue_id)
> +struct xsk_buff_pool *xdp_get_xsk_pool_from_qid(struct net_device *dev,
> +						u16 queue_id)
>   {
>   	if (queue_id < dev->real_num_rx_queues)
> -		return dev->_rx[queue_id].umem;
> +		return dev->_rx[queue_id].pool;
>   	if (queue_id < dev->real_num_tx_queues)
> -		return dev->_tx[queue_id].umem;
> +		return dev->_tx[queue_id].pool;
>   
>   	return NULL;
>   }
> -EXPORT_SYMBOL(xdp_get_umem_from_qid);
> +EXPORT_SYMBOL(xdp_get_xsk_pool_from_qid);
>   
> -static void xdp_clear_umem_at_qid(struct net_device *dev, u16 queue_id)
> +static void xdp_clear_xsk_pool_at_qid(struct net_device *dev, u16 queue_id)
>   {
>   	if (queue_id < dev->real_num_rx_queues)
> -		dev->_rx[queue_id].umem = NULL;
> +		dev->_rx[queue_id].pool = NULL;
>   	if (queue_id < dev->real_num_tx_queues)
> -		dev->_tx[queue_id].umem = NULL;
> +		dev->_tx[queue_id].pool = NULL;
>   }
>   
>   int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
> @@ -102,10 +103,10 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
>   	if (force_zc && force_copy)
>   		return -EINVAL;
>   
> -	if (xdp_get_umem_from_qid(dev, queue_id))
> +	if (xdp_get_xsk_pool_from_qid(dev, queue_id))
>   		return -EBUSY;
>   
> -	err = xdp_reg_umem_at_qid(dev, umem, queue_id);
> +	err = xdp_reg_xsk_pool_at_qid(dev, umem->pool, queue_id);
>   	if (err)
>   		return err;
>   
> @@ -132,8 +133,8 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
>   		goto err_unreg_umem;
>   	}
>   
> -	bpf.command = XDP_SETUP_XSK_UMEM;
> -	bpf.xsk.umem = umem;
> +	bpf.command = XDP_SETUP_XSK_POOL;
> +	bpf.xsk.pool = umem->pool;
>   	bpf.xsk.queue_id = queue_id;
>   
>   	err = dev->netdev_ops->ndo_bpf(dev, &bpf);
> @@ -147,7 +148,7 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
>   	if (!force_zc)
>   		err = 0; /* fallback to copy mode */
>   	if (err)
> -		xdp_clear_umem_at_qid(dev, queue_id);
> +		xdp_clear_xsk_pool_at_qid(dev, queue_id);
>   	return err;
>   }
>   
> @@ -162,8 +163,8 @@ void xdp_umem_clear_dev(struct xdp_umem *umem)
>   		return;
>   
>   	if (umem->zc) {
> -		bpf.command = XDP_SETUP_XSK_UMEM;
> -		bpf.xsk.umem = NULL;
> +		bpf.command = XDP_SETUP_XSK_POOL;
> +		bpf.xsk.pool = NULL;
>   		bpf.xsk.queue_id = umem->queue_id;
>   
>   		err = umem->dev->netdev_ops->ndo_bpf(umem->dev, &bpf);
> @@ -172,7 +173,7 @@ void xdp_umem_clear_dev(struct xdp_umem *umem)
>   			WARN(1, "failed to disable umem!\n");
>   	}
>   
> -	xdp_clear_umem_at_qid(umem->dev, umem->queue_id);
> +	xdp_clear_xsk_pool_at_qid(umem->dev, umem->queue_id);
>   
>   	dev_put(umem->dev);
>   	umem->dev = NULL;
> @@ -373,8 +374,8 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
>   	if (err)
>   		goto out_account;
>   
> -	umem->pool = xp_create(umem->pgs, umem->npgs, chunks, chunk_size,
> -			       headroom, size, unaligned_chunks);
> +	umem->pool = xp_create(umem, chunks, chunk_size, headroom, size,
> +			       unaligned_chunks);
>   	if (!umem->pool) {
>   		err = -ENOMEM;
>   		goto out_pin;
> diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
> index a2044c2..f3df3cb 100644
> --- a/net/xdp/xsk_buff_pool.c
> +++ b/net/xdp/xsk_buff_pool.c
> @@ -29,7 +29,7 @@ void xp_destroy(struct xsk_buff_pool *pool)
>   	kvfree(pool);
>   }
>   
> -struct xsk_buff_pool *xp_create(struct page **pages, u32 nr_pages, u32 chunks,
> +struct xsk_buff_pool *xp_create(struct xdp_umem *umem, u32 chunks,
>   				u32 chunk_size, u32 headroom, u64 size,
>   				bool unaligned)
>   {
> @@ -54,6 +54,7 @@ struct xsk_buff_pool *xp_create(struct page **pages, u32 nr_pages, u32 chunks,
>   	pool->chunk_size = chunk_size;
>   	pool->unaligned = unaligned;
>   	pool->frame_len = chunk_size - headroom - XDP_PACKET_HEADROOM;
> +	pool->umem = umem;
>   	INIT_LIST_HEAD(&pool->free_list);
>   
>   	for (i = 0; i < pool->free_heads_cnt; i++) {
> @@ -63,7 +64,7 @@ struct xsk_buff_pool *xp_create(struct page **pages, u32 nr_pages, u32 chunks,
>   		pool->free_heads[i] = xskb;
>   	}
>   
> -	err = xp_addr_map(pool, pages, nr_pages);
> +	err = xp_addr_map(pool, umem->pgs, umem->npgs);
>   	if (!err)
>   		return pool;
>   
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ