Commit f3fef2b6 authored by Jan Sokolowski's avatar Jan Sokolowski Committed by Jeff Kirsher
Browse files

i40e: Remove umem from VSI



As current implementation of netdev already contains and provides
umems for us, we no longer have the need to contain these
structures in i40e_vsi.

Refactor the code to operate on netdev-provided umems.

Signed-off-by: default avatarJan Sokolowski <jan.sokolowski@intel.com>
Acked-by: default avatarBjörn Töpel <bjorn.topel@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 5f4f3b2d
Loading
Loading
Loading
Loading
+3 −7
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@
#include <net/pkt_cls.h>
#include <net/pkt_cls.h>
#include <net/tc_act/tc_gact.h>
#include <net/tc_act/tc_gact.h>
#include <net/tc_act/tc_mirred.h>
#include <net/tc_act/tc_mirred.h>
#include <net/xdp_sock.h>
#include "i40e_type.h"
#include "i40e_type.h"
#include "i40e_prototype.h"
#include "i40e_prototype.h"
#include "i40e_client.h"
#include "i40e_client.h"
@@ -787,11 +788,6 @@ struct i40e_vsi {


	/* VSI specific handlers */
	/* VSI specific handlers */
	irqreturn_t (*irq_handler)(int irq, void *data);
	irqreturn_t (*irq_handler)(int irq, void *data);

	/* AF_XDP zero-copy */
	struct xdp_umem **xsk_umems;
	u16 num_xsk_umems_used;
	u16 num_xsk_umems;
} ____cacheline_internodealigned_in_smp;
} ____cacheline_internodealigned_in_smp;


struct i40e_netdev_priv {
struct i40e_netdev_priv {
@@ -1104,10 +1100,10 @@ static inline struct xdp_umem *i40e_xsk_umem(struct i40e_ring *ring)
	if (ring_is_xdp(ring))
	if (ring_is_xdp(ring))
		qid -= ring->vsi->alloc_queue_pairs;
		qid -= ring->vsi->alloc_queue_pairs;


	if (!ring->vsi->xsk_umems || !ring->vsi->xsk_umems[qid] || !xdp_on)
	if (!xdp_on)
		return NULL;
		return NULL;


	return ring->vsi->xsk_umems[qid];
	return xdp_get_umem_from_qid(ring->vsi->netdev, qid);
}
}


int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch);
int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch);
+18 −92
Original line number Original line Diff line number Diff line
@@ -9,69 +9,6 @@
#include "i40e_txrx_common.h"
#include "i40e_txrx_common.h"
#include "i40e_xsk.h"
#include "i40e_xsk.h"


/**
 * i40e_alloc_xsk_umems - Allocate an array to store per ring UMEMs
 * @vsi: Current VSI
 *
 * Returns 0 on success, <0 on failure
 **/
static int i40e_alloc_xsk_umems(struct i40e_vsi *vsi)
{
	if (vsi->xsk_umems)
		return 0;

	vsi->num_xsk_umems_used = 0;
	vsi->num_xsk_umems = vsi->alloc_queue_pairs;
	vsi->xsk_umems = kcalloc(vsi->num_xsk_umems, sizeof(*vsi->xsk_umems),
				 GFP_KERNEL);
	if (!vsi->xsk_umems) {
		vsi->num_xsk_umems = 0;
		return -ENOMEM;
	}

	return 0;
}

/**
 * i40e_add_xsk_umem - Store a UMEM for a certain ring/qid
 * @vsi: Current VSI
 * @umem: UMEM to store
 * @qid: Ring/qid to associate with the UMEM
 *
 * Returns 0 on success, <0 on failure
 **/
static int i40e_add_xsk_umem(struct i40e_vsi *vsi, struct xdp_umem *umem,
			     u16 qid)
{
	int err;

	err = i40e_alloc_xsk_umems(vsi);
	if (err)
		return err;

	vsi->xsk_umems[qid] = umem;
	vsi->num_xsk_umems_used++;

	return 0;
}

/**
 * i40e_remove_xsk_umem - Remove a UMEM for a certain ring/qid
 * @vsi: Current VSI
 * @qid: Ring/qid associated with the UMEM
 **/
static void i40e_remove_xsk_umem(struct i40e_vsi *vsi, u16 qid)
{
	vsi->xsk_umems[qid] = NULL;
	vsi->num_xsk_umems_used--;

	if (vsi->num_xsk_umems == 0) {
		kfree(vsi->xsk_umems);
		vsi->xsk_umems = NULL;
		vsi->num_xsk_umems = 0;
	}
}

/**
/**
 * i40e_xsk_umem_dma_map - DMA maps all UMEM memory for the netdev
 * i40e_xsk_umem_dma_map - DMA maps all UMEM memory for the netdev
 * @vsi: Current VSI
 * @vsi: Current VSI
@@ -140,6 +77,7 @@ static void i40e_xsk_umem_dma_unmap(struct i40e_vsi *vsi, struct xdp_umem *umem)
static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
				u16 qid)
				u16 qid)
{
{
	struct net_device *netdev = vsi->netdev;
	struct xdp_umem_fq_reuse *reuseq;
	struct xdp_umem_fq_reuse *reuseq;
	bool if_running;
	bool if_running;
	int err;
	int err;
@@ -150,12 +88,9 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
	if (qid >= vsi->num_queue_pairs)
	if (qid >= vsi->num_queue_pairs)
		return -EINVAL;
		return -EINVAL;


	if (vsi->xsk_umems) {
	if (qid >= netdev->real_num_rx_queues ||
		if (qid >= vsi->num_xsk_umems)
	    qid >= netdev->real_num_tx_queues)
		return -EINVAL;
		return -EINVAL;
		if (vsi->xsk_umems[qid])
			return -EBUSY;
	}


	reuseq = xsk_reuseq_prepare(vsi->rx_rings[0]->count);
	reuseq = xsk_reuseq_prepare(vsi->rx_rings[0]->count);
	if (!reuseq)
	if (!reuseq)
@@ -173,13 +108,7 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
		err = i40e_queue_pair_disable(vsi, qid);
		err = i40e_queue_pair_disable(vsi, qid);
		if (err)
		if (err)
			return err;
			return err;
	}

	err = i40e_add_xsk_umem(vsi, umem, qid);
	if (err)
		return err;


	if (if_running) {
		err = i40e_queue_pair_enable(vsi, qid);
		err = i40e_queue_pair_enable(vsi, qid);
		if (err)
		if (err)
			return err;
			return err;
@@ -197,11 +126,13 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
 **/
 **/
static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
{
{
	struct net_device *netdev = vsi->netdev;
	struct xdp_umem *umem;
	bool if_running;
	bool if_running;
	int err;
	int err;


	if (!vsi->xsk_umems || qid >= vsi->num_xsk_umems ||
	umem = xdp_get_umem_from_qid(netdev, qid);
	    !vsi->xsk_umems[qid])
	if (!umem)
		return -EINVAL;
		return -EINVAL;


	if_running = netif_running(vsi->netdev) && i40e_enabled_xdp_vsi(vsi);
	if_running = netif_running(vsi->netdev) && i40e_enabled_xdp_vsi(vsi);
@@ -212,8 +143,7 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
			return err;
			return err;
	}
	}


	i40e_xsk_umem_dma_unmap(vsi, vsi->xsk_umems[qid]);
	i40e_xsk_umem_dma_unmap(vsi, umem);
	i40e_remove_xsk_umem(vsi, qid);


	if (if_running) {
	if (if_running) {
		err = i40e_queue_pair_enable(vsi, qid);
		err = i40e_queue_pair_enable(vsi, qid);
@@ -237,20 +167,18 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
int i40e_xsk_umem_query(struct i40e_vsi *vsi, struct xdp_umem **umem,
int i40e_xsk_umem_query(struct i40e_vsi *vsi, struct xdp_umem **umem,
			u16 qid)
			u16 qid)
{
{
	struct net_device *netdev = vsi->netdev;
	struct xdp_umem *queried_umem;

	if (vsi->type != I40E_VSI_MAIN)
	if (vsi->type != I40E_VSI_MAIN)
		return -EINVAL;
		return -EINVAL;


	if (qid >= vsi->num_queue_pairs)
	queried_umem = xdp_get_umem_from_qid(netdev, qid);
		return -EINVAL;


	if (vsi->xsk_umems) {
	if (!queried_umem)
		if (qid >= vsi->num_xsk_umems)
		return -EINVAL;
		return -EINVAL;
		*umem = vsi->xsk_umems[qid];
		return 0;
	}


	*umem = NULL;
	*umem = queried_umem;
	return 0;
	return 0;
}
}


@@ -945,13 +873,11 @@ void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring)
 **/
 **/
bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi)
bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi)
{
{
	struct net_device *netdev = vsi->netdev;
	int i;
	int i;


	if (!vsi->xsk_umems)
		return false;

	for (i = 0; i < vsi->num_queue_pairs; i++) {
	for (i = 0; i < vsi->num_queue_pairs; i++) {
		if (vsi->xsk_umems[i])
		if (xdp_get_umem_from_qid(netdev, i))
			return true;
			return true;
	}
	}