Commit ac8a861f authored by Michal Kubiak's avatar Michal Kubiak Committed by Tony Nguyen
Browse files

idpf: prepare structures to support XDP



Extend basic structures of the driver (e.g. 'idpf_vport', 'idpf_*_queue',
'idpf_vport_user_config_data') by adding members necessary to support XDP.
Add extra XDP Tx queues needed to support XDP_TX and XDP_REDIRECT actions
without interfering with regular Tx traffic.
Also add functions dedicated to support XDP initialization for Rx and
Tx queues and call those functions from the existing algorithms of
queues configuration.

Signed-off-by: default avatarMichal Kubiak <michal.kubiak@intel.com>
Co-developed-by: default avatarAlexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: default avatarAlexander Lobakin <aleksander.lobakin@intel.com>
Tested-by: default avatarRamu R <ramu.r@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent a0c60b07
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ config IDPF
	depends on PCI_MSI
	depends on PTP_1588_CLOCK_OPTIONAL
	select DIMLIB
	select LIBETH
	select LIBETH_XDP
	help
	  This driver supports Intel(R) Infrastructure Data Path Function
	  devices.
+2 −0
Original line number Diff line number Diff line
@@ -21,3 +21,5 @@ idpf-$(CONFIG_IDPF_SINGLEQ) += idpf_singleq_txrx.o

idpf-$(CONFIG_PTP_1588_CLOCK)	+= idpf_ptp.o
idpf-$(CONFIG_PTP_1588_CLOCK)	+= idpf_virtchnl_ptp.o

idpf-y				+= xdp.o
+16 −0
Original line number Diff line number Diff line
@@ -287,6 +287,10 @@ struct idpf_fsteer_fltr {
 * @txq_model: Split queue or single queue queuing model
 * @txqs: Used only in hotpath to get to the right queue very fast
 * @crc_enable: Enable CRC insertion offload
 * @xdpsq_share: whether XDPSQ sharing is enabled
 * @num_xdp_txq: number of XDPSQs
 * @xdp_txq_offset: index of the first XDPSQ (== number of regular SQs)
 * @xdp_prog: installed XDP program
 * @num_rxq: Number of allocated RX queues
 * @num_bufq: Number of allocated buffer queues
 * @rxq_desc_count: RX queue descriptor count. *MUST* have enough descriptors
@@ -337,6 +341,11 @@ struct idpf_vport {
	struct idpf_tx_queue **txqs;
	bool crc_enable;

	bool xdpsq_share;
	u16 num_xdp_txq;
	u16 xdp_txq_offset;
	struct bpf_prog *xdp_prog;

	u16 num_rxq;
	u16 num_bufq;
	u32 rxq_desc_count;
@@ -438,6 +447,7 @@ struct idpf_q_coalesce {
 *		      ethtool
 * @num_req_rxq_desc: Number of user requested RX queue descriptors through
 *		      ethtool
 * @xdp_prog: requested XDP program to install
 * @user_flags: User toggled config flags
 * @mac_filter_list: List of MAC filters
 * @num_fsteer_fltrs: number of flow steering filters
@@ -452,6 +462,7 @@ struct idpf_vport_user_config_data {
	u16 num_req_rx_qs;
	u32 num_req_txq_desc;
	u32 num_req_rxq_desc;
	struct bpf_prog *xdp_prog;
	DECLARE_BITMAP(user_flags, __IDPF_USER_FLAGS_NBITS);
	struct list_head mac_filter_list;
	u32 num_fsteer_fltrs;
@@ -681,6 +692,11 @@ static inline int idpf_is_queue_model_split(u16 q_model)
	       q_model == VIRTCHNL2_QUEUE_MODEL_SPLIT;
}

static inline bool idpf_xdp_enabled(const struct idpf_vport *vport)
{
	return vport->adapter && vport->xdp_prog;
}

#define idpf_is_cap_ena(adapter, field, flag) \
	idpf_is_capability_ena(adapter, false, field, flag)
#define idpf_is_cap_ena_all(adapter, field, flag) \
+17 −4
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
#include "idpf.h"
#include "idpf_virtchnl.h"
#include "idpf_ptp.h"
#include "xdp.h"

static const struct net_device_ops idpf_netdev_ops;

@@ -914,6 +915,7 @@ static void idpf_vport_stop(struct idpf_vport *vport, bool rtnl)

	vport->link_up = false;
	idpf_vport_intr_deinit(vport);
	idpf_xdp_rxq_info_deinit_all(vport);
	idpf_vport_queues_rel(vport);
	idpf_vport_intr_rel(vport);
	np->state = __IDPF_VPORT_DOWN;
@@ -1316,13 +1318,13 @@ static void idpf_restore_features(struct idpf_vport *vport)
 */
static int idpf_set_real_num_queues(struct idpf_vport *vport)
{
	int err;
	int err, txq = vport->num_txq - vport->num_xdp_txq;

	err = netif_set_real_num_rx_queues(vport->netdev, vport->num_rxq);
	if (err)
		return err;

	return netif_set_real_num_tx_queues(vport->netdev, vport->num_txq);
	return netif_set_real_num_tx_queues(vport->netdev, txq);
}

/**
@@ -1435,20 +1437,29 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)
	}

	idpf_rx_init_buf_tail(vport);

	err = idpf_xdp_rxq_info_init_all(vport);
	if (err) {
		netdev_err(vport->netdev,
			   "Failed to initialize XDP RxQ info for vport %u: %pe\n",
			   vport->vport_id, ERR_PTR(err));
		goto intr_deinit;
	}

	idpf_vport_intr_ena(vport);

	err = idpf_send_config_queues_msg(vport);
	if (err) {
		dev_err(&adapter->pdev->dev, "Failed to configure queues for vport %u, %d\n",
			vport->vport_id, err);
		goto intr_deinit;
		goto rxq_deinit;
	}

	err = idpf_send_map_unmap_queue_vector_msg(vport, true);
	if (err) {
		dev_err(&adapter->pdev->dev, "Failed to map queue vectors for vport %u: %d\n",
			vport->vport_id, err);
		goto intr_deinit;
		goto rxq_deinit;
	}

	err = idpf_send_enable_queues_msg(vport);
@@ -1499,6 +1510,8 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)
	idpf_send_disable_queues_msg(vport);
unmap_queue_vectors:
	idpf_send_map_unmap_queue_vector_msg(vport, false);
rxq_deinit:
	idpf_xdp_rxq_info_deinit_all(vport);
intr_deinit:
	idpf_vport_intr_deinit(vport);
queues_rel:
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

MODULE_DESCRIPTION(DRV_SUMMARY);
MODULE_IMPORT_NS("LIBETH");
MODULE_IMPORT_NS("LIBETH_XDP");
MODULE_LICENSE("GPL");

/**
Loading