Commit 9ad94c23 authored by Joshua Hay's avatar Joshua Hay Committed by Tony Nguyen
Browse files

idpf: remove vport pointer from queue sets



Replace vport pointer in queue sets struct with adapter backpointer and
vport_id as those are the primary fields necessary for virtchnl
communication. Otherwise, pass the vport pointer as a separate parameter
where available. Also move xdp_txq_offset to queue vector resource
struct since we no longer have the vport pointer.

Reviewed-by: default avatarMadhu Chittim <madhu.chittim@intel.com>
Signed-off-by: default avatarJoshua Hay <joshua.a.hay@intel.com>
Reviewed-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: default avatarSamuel Salin <Samuel.salin@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent cfa7029a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -306,6 +306,7 @@ struct idpf_fsteer_fltr {
 * @num_txq: number of allocated TX queues
 * @num_complq: number of allocated completion queues
 * @num_txq_grp: number of TX queue groups
 * @xdp_txq_offset: index of the first XDPSQ (== number of regular SQs)
 * @num_rxq_grp: number of RX queues in a group
 * @rxq_model: splitq queue or single queue queuing model
 * @rxq_grps: total number of RX groups. Number of groups * number of RX per
@@ -335,6 +336,7 @@ struct idpf_q_vec_rsrc {
	u16			num_txq;
	u16			num_complq;
	u16			num_txq_grp;
	u16			xdp_txq_offset;

	u16			num_rxq_grp;
	u32			rxq_model;
@@ -353,7 +355,6 @@ struct idpf_q_vec_rsrc {
 * @txqs: Used only in hotpath to get to the right queue very fast
 * @num_txq: Number of allocated TX queues
 * @num_xdp_txq: number of XDPSQs
 * @xdp_txq_offset: index of the first XDPSQ (== number of regular SQs)
 * @xdpsq_share: whether XDPSQ sharing is enabled
 * @xdp_prog: installed XDP program
 * @vdev_info: IDC vport device info pointer
@@ -384,7 +385,6 @@ struct idpf_vport {
	struct idpf_tx_queue **txqs;
	u16 num_txq;
	u16 num_xdp_txq;
	u16 xdp_txq_offset;
	bool xdpsq_share;
	struct bpf_prog *xdp_prog;

+22 −19
Original line number Diff line number Diff line
@@ -961,9 +961,9 @@ static int idpf_rx_desc_alloc_all(struct idpf_vport *vport,
	return err;
}

static int idpf_init_queue_set(const struct idpf_queue_set *qs)
static int idpf_init_queue_set(const struct idpf_vport *vport,
			       const struct idpf_queue_set *qs)
{
	const struct idpf_vport *vport = qs->vport;
	bool splitq;
	int err;

@@ -1115,7 +1115,8 @@ static void idpf_qvec_ena_irq(struct idpf_q_vector *qv)
static struct idpf_queue_set *
idpf_vector_to_queue_set(struct idpf_q_vector *qv)
{
	bool xdp = qv->vport->xdp_txq_offset && !qv->num_xsksq;
	u32 xdp_txq_offset = qv->vport->dflt_qv_rsrc.xdp_txq_offset;
	bool xdp = xdp_txq_offset && !qv->num_xsksq;
	struct idpf_vport *vport = qv->vport;
	struct idpf_queue_set *qs;
	u32 num;
@@ -1125,7 +1126,8 @@ idpf_vector_to_queue_set(struct idpf_q_vector *qv)
	if (!num)
		return NULL;

	qs = idpf_alloc_queue_set(vport, &vport->dflt_qv_rsrc, num);
	qs = idpf_alloc_queue_set(vport->adapter, &vport->dflt_qv_rsrc,
				  vport->vport_id, num);
	if (!qs)
		return NULL;

@@ -1151,12 +1153,12 @@ idpf_vector_to_queue_set(struct idpf_q_vector *qv)
		qs->qs[num++].complq = qv->complq[i];
	}

	if (!vport->xdp_txq_offset)
	if (!xdp_txq_offset)
		goto finalize;

	if (xdp) {
		for (u32 i = 0; i < qv->num_rxq; i++) {
			u32 idx = vport->xdp_txq_offset + qv->rx[i]->idx;
			u32 idx = xdp_txq_offset + qv->rx[i]->idx;

			qs->qs[num].type = VIRTCHNL2_QUEUE_TYPE_TX;
			qs->qs[num++].txq = vport->txqs[idx];
@@ -1183,23 +1185,23 @@ idpf_vector_to_queue_set(struct idpf_q_vector *qv)
	return qs;
}

static int idpf_qp_enable(const struct idpf_queue_set *qs, u32 qid)
static int idpf_qp_enable(const struct idpf_vport *vport,
			  const struct idpf_queue_set *qs, u32 qid)
{
	struct idpf_q_vec_rsrc *rsrc = qs->qv_rsrc;
	struct idpf_vport *vport = qs->vport;
	const struct idpf_q_vec_rsrc *rsrc = &vport->dflt_qv_rsrc;
	struct idpf_q_vector *q_vector;
	int err;

	q_vector = idpf_find_rxq_vec(vport, qid);

	err = idpf_init_queue_set(qs);
	err = idpf_init_queue_set(vport, qs);
	if (err) {
		netdev_err(vport->netdev, "Could not initialize queues in pair %u: %pe\n",
			   qid, ERR_PTR(err));
		return err;
	}

	if (!vport->xdp_txq_offset)
	if (!rsrc->xdp_txq_offset)
		goto config;

	q_vector->xsksq = kcalloc(DIV_ROUND_UP(rsrc->num_rxq_grp,
@@ -1246,9 +1248,9 @@ static int idpf_qp_enable(const struct idpf_queue_set *qs, u32 qid)
	return 0;
}

static int idpf_qp_disable(const struct idpf_queue_set *qs, u32 qid)
static int idpf_qp_disable(const struct idpf_vport *vport,
			   const struct idpf_queue_set *qs, u32 qid)
{
	struct idpf_vport *vport = qs->vport;
	struct idpf_q_vector *q_vector;
	int err;

@@ -1293,7 +1295,8 @@ int idpf_qp_switch(struct idpf_vport *vport, u32 qid, bool en)
	if (!qs)
		return -ENOMEM;

	return en ? idpf_qp_enable(qs, qid) : idpf_qp_disable(qs, qid);
	return en ? idpf_qp_enable(vport, qs, qid) :
		    idpf_qp_disable(vport, qs, qid);
}

/**
@@ -1491,12 +1494,12 @@ void idpf_vport_init_num_qs(struct idpf_vport *vport,

	vport->xdp_prog = config_data->xdp_prog;
	if (idpf_xdp_enabled(vport)) {
		vport->xdp_txq_offset = config_data->num_req_tx_qs;
		rsrc->xdp_txq_offset = config_data->num_req_tx_qs;
		vport->num_xdp_txq = le16_to_cpu(vport_msg->num_tx_q) -
				     vport->xdp_txq_offset;
				     rsrc->xdp_txq_offset;
		vport->xdpsq_share = libeth_xdpsq_shared(vport->num_xdp_txq);
	} else {
		vport->xdp_txq_offset = 0;
		rsrc->xdp_txq_offset = 0;
		vport->num_xdp_txq = 0;
		vport->xdpsq_share = false;
	}
@@ -4450,7 +4453,7 @@ static void idpf_vport_intr_map_vector_to_qs(struct idpf_vport *vport,
		struct idpf_tx_queue *xdpsq;
		struct idpf_q_vector *qv;

		xdpsq = vport->txqs[vport->xdp_txq_offset + i];
		xdpsq = vport->txqs[rsrc->xdp_txq_offset + i];
		if (!idpf_queue_has(XSK, xdpsq))
			continue;

@@ -4609,7 +4612,7 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport,
		if (!q_vector->complq)
			goto error;

		if (!vport->xdp_txq_offset)
		if (!rsrc->xdp_txq_offset)
			continue;

		q_vector->xsksq = kcalloc(rxqs_per_vector,
+43 −37
Original line number Diff line number Diff line
@@ -717,9 +717,8 @@ int idpf_recv_mb_msg(struct idpf_adapter *adapter)
}

struct idpf_chunked_msg_params {
	u32			(*prepare_msg)(const struct idpf_vport *vport,
					       void *buf, const void *pos,
					       u32 num);
	u32			(*prepare_msg)(u32 vport_id, void *buf,
					       const void *pos, u32 num);

	const void		*chunks;
	u32			num_chunks;
@@ -728,11 +727,12 @@ struct idpf_chunked_msg_params {
	u32			config_sz;

	u32			vc_op;
	u32			vport_id;
};

struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_vport *vport,
struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_adapter *adapter,
					    struct idpf_q_vec_rsrc *qv_rsrc,
					    u32 num)
					    u32 vport_id, u32 num)
{
	struct idpf_queue_set *qp;

@@ -740,8 +740,9 @@ struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_vport *vport,
	if (!qp)
		return NULL;

	qp->vport = vport;
	qp->adapter = adapter;
	qp->qv_rsrc = qv_rsrc;
	qp->vport_id = vport_id;
	qp->num = num;

	return qp;
@@ -749,7 +750,7 @@ struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_vport *vport,

/**
 * idpf_send_chunked_msg - send VC message consisting of chunks
 * @vport: virtual port data structure
 * @adapter: Driver specific private structure
 * @params: message params
 *
 * Helper function for preparing a message describing queues to be enabled
@@ -757,7 +758,7 @@ struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_vport *vport,
 *
 * Return: the total size of the prepared message.
 */
static int idpf_send_chunked_msg(struct idpf_vport *vport,
static int idpf_send_chunked_msg(struct idpf_adapter *adapter,
				 const struct idpf_chunked_msg_params *params)
{
	struct idpf_vc_xn_params xn_params = {
@@ -768,6 +769,7 @@ static int idpf_send_chunked_msg(struct idpf_vport *vport,
	u32 num_chunks, num_msgs, buf_sz;
	void *buf __free(kfree) = NULL;
	u32 totqs = params->num_chunks;
	u32 vid = params->vport_id;

	num_chunks = min(IDPF_NUM_CHUNKS_PER_MSG(params->config_sz,
						 params->chunk_sz), totqs);
@@ -786,10 +788,10 @@ static int idpf_send_chunked_msg(struct idpf_vport *vport,
		memset(buf, 0, buf_sz);
		xn_params.send_buf.iov_len = buf_sz;

		if (params->prepare_msg(vport, buf, pos, num_chunks) != buf_sz)
		if (params->prepare_msg(vid, buf, pos, num_chunks) != buf_sz)
			return -EINVAL;

		reply_sz = idpf_vc_xn_exec(vport->adapter, &xn_params);
		reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
		if (reply_sz < 0)
			return reply_sz;

@@ -812,6 +814,7 @@ static int idpf_send_chunked_msg(struct idpf_vport *vport,
 */
static int idpf_wait_for_marker_event_set(const struct idpf_queue_set *qs)
{
	struct net_device *netdev;
	struct idpf_tx_queue *txq;
	bool markers_rcvd = true;

@@ -820,6 +823,8 @@ static int idpf_wait_for_marker_event_set(const struct idpf_queue_set *qs)
		case VIRTCHNL2_QUEUE_TYPE_TX:
			txq = qs->qs[i].txq;

			netdev = txq->netdev;

			idpf_queue_set(SW_MARKER, txq);
			idpf_wait_for_sw_marker_completion(txq);
			markers_rcvd &= !idpf_queue_has(SW_MARKER, txq);
@@ -830,7 +835,7 @@ static int idpf_wait_for_marker_event_set(const struct idpf_queue_set *qs)
	}

	if (!markers_rcvd) {
		netdev_warn(qs->vport->netdev,
		netdev_warn(netdev,
			    "Failed to receive marker packets\n");
		return -ETIMEDOUT;
	}
@@ -848,7 +853,8 @@ static int idpf_wait_for_marker_event(struct idpf_vport *vport)
{
	struct idpf_queue_set *qs __free(kfree) = NULL;

	qs = idpf_alloc_queue_set(vport, &vport->dflt_qv_rsrc, vport->num_txq);
	qs = idpf_alloc_queue_set(vport->adapter, &vport->dflt_qv_rsrc,
				  vport->vport_id, vport->num_txq);
	if (!qs)
		return -ENOMEM;

@@ -1792,7 +1798,7 @@ static void idpf_fill_complq_config_chunk(const struct idpf_q_vec_rsrc *rsrc,

/**
 * idpf_prepare_cfg_txqs_msg - prepare message to configure selected Tx queues
 * @vport: virtual port data structure
 * @vport_id: ID of virtual port queues are associated with
 * @buf: buffer containing the message
 * @pos: pointer to the first chunk describing the tx queue
 * @num_chunks: number of chunks in the message
@@ -1802,13 +1808,12 @@ static void idpf_fill_complq_config_chunk(const struct idpf_q_vec_rsrc *rsrc,
 *
 * Return: the total size of the prepared message.
 */
static u32 idpf_prepare_cfg_txqs_msg(const struct idpf_vport *vport,
				     void *buf, const void *pos,
static u32 idpf_prepare_cfg_txqs_msg(u32 vport_id, void *buf, const void *pos,
				     u32 num_chunks)
{
	struct virtchnl2_config_tx_queues *ctq = buf;

	ctq->vport_id = cpu_to_le32(vport->vport_id);
	ctq->vport_id = cpu_to_le32(vport_id);
	ctq->num_qinfo = cpu_to_le16(num_chunks);
	memcpy(ctq->qinfo, pos, num_chunks * sizeof(*ctq->qinfo));

@@ -1829,6 +1834,7 @@ static int idpf_send_config_tx_queue_set_msg(const struct idpf_queue_set *qs)
{
	struct virtchnl2_txq_info *qi __free(kfree) = NULL;
	struct idpf_chunked_msg_params params = {
		.vport_id	= qs->vport_id,
		.vc_op		= VIRTCHNL2_OP_CONFIG_TX_QUEUES,
		.prepare_msg	= idpf_prepare_cfg_txqs_msg,
		.config_sz	= sizeof(struct virtchnl2_config_tx_queues),
@@ -1851,7 +1857,7 @@ static int idpf_send_config_tx_queue_set_msg(const struct idpf_queue_set *qs)
						      &qi[params.num_chunks++]);
	}

	return idpf_send_chunked_msg(qs->vport, &params);
	return idpf_send_chunked_msg(qs->adapter, &params);
}

/**
@@ -1868,7 +1874,7 @@ static int idpf_send_config_tx_queues_msg(struct idpf_vport *vport,
	u32 totqs = rsrc->num_txq + rsrc->num_complq;
	u32 k = 0;

	qs = idpf_alloc_queue_set(vport, rsrc, totqs);
	qs = idpf_alloc_queue_set(vport->adapter, rsrc, vport->vport_id, totqs);
	if (!qs)
		return -ENOMEM;

@@ -1979,7 +1985,7 @@ static void idpf_fill_bufq_config_chunk(const struct idpf_q_vec_rsrc *rsrc,

/**
 * idpf_prepare_cfg_rxqs_msg - prepare message to configure selected Rx queues
 * @vport: virtual port data structure
 * @vport_id: ID of virtual port queues are associated with
 * @buf: buffer containing the message
 * @pos: pointer to the first chunk describing the rx queue
 * @num_chunks: number of chunks in the message
@@ -1989,13 +1995,12 @@ static void idpf_fill_bufq_config_chunk(const struct idpf_q_vec_rsrc *rsrc,
 *
 * Return: the total size of the prepared message.
 */
static u32 idpf_prepare_cfg_rxqs_msg(const struct idpf_vport *vport,
				     void *buf, const void *pos,
static u32 idpf_prepare_cfg_rxqs_msg(u32 vport_id, void *buf, const void *pos,
				     u32 num_chunks)
{
	struct virtchnl2_config_rx_queues *crq = buf;

	crq->vport_id = cpu_to_le32(vport->vport_id);
	crq->vport_id = cpu_to_le32(vport_id);
	crq->num_qinfo = cpu_to_le16(num_chunks);
	memcpy(crq->qinfo, pos, num_chunks * sizeof(*crq->qinfo));

@@ -2016,6 +2021,7 @@ static int idpf_send_config_rx_queue_set_msg(const struct idpf_queue_set *qs)
{
	struct virtchnl2_rxq_info *qi __free(kfree) = NULL;
	struct idpf_chunked_msg_params params = {
		.vport_id	= qs->vport_id,
		.vc_op		= VIRTCHNL2_OP_CONFIG_RX_QUEUES,
		.prepare_msg	= idpf_prepare_cfg_rxqs_msg,
		.config_sz	= sizeof(struct virtchnl2_config_rx_queues),
@@ -2037,7 +2043,7 @@ static int idpf_send_config_rx_queue_set_msg(const struct idpf_queue_set *qs)
						    &qi[params.num_chunks++]);
	}

	return idpf_send_chunked_msg(qs->vport, &params);
	return idpf_send_chunked_msg(qs->adapter, &params);
}

/**
@@ -2055,7 +2061,7 @@ static int idpf_send_config_rx_queues_msg(struct idpf_vport *vport,
	u32 totqs = rsrc->num_rxq + rsrc->num_bufq;
	u32 k = 0;

	qs = idpf_alloc_queue_set(vport, rsrc, totqs);
	qs = idpf_alloc_queue_set(vport->adapter, rsrc, vport->vport_id, totqs);
	if (!qs)
		return -ENOMEM;

@@ -2098,7 +2104,7 @@ static int idpf_send_config_rx_queues_msg(struct idpf_vport *vport,
/**
 * idpf_prepare_ena_dis_qs_msg - prepare message to enable/disable selected
 *				 queues
 * @vport: virtual port data structure
 * @vport_id: ID of virtual port queues are associated with
 * @buf: buffer containing the message
 * @pos: pointer to the first chunk describing the queue
 * @num_chunks: number of chunks in the message
@@ -2108,13 +2114,12 @@ static int idpf_send_config_rx_queues_msg(struct idpf_vport *vport,
 *
 * Return: the total size of the prepared message.
 */
static u32 idpf_prepare_ena_dis_qs_msg(const struct idpf_vport *vport,
				       void *buf, const void *pos,
static u32 idpf_prepare_ena_dis_qs_msg(u32 vport_id, void *buf, const void *pos,
				       u32 num_chunks)
{
	struct virtchnl2_del_ena_dis_queues *eq = buf;

	eq->vport_id = cpu_to_le32(vport->vport_id);
	eq->vport_id = cpu_to_le32(vport_id);
	eq->chunks.num_chunks = cpu_to_le16(num_chunks);
	memcpy(eq->chunks.chunks, pos,
	       num_chunks * sizeof(*eq->chunks.chunks));
@@ -2139,6 +2144,7 @@ static int idpf_send_ena_dis_queue_set_msg(const struct idpf_queue_set *qs,
{
	struct virtchnl2_queue_chunk *qc __free(kfree) = NULL;
	struct idpf_chunked_msg_params params = {
		.vport_id	= qs->vport_id,
		.vc_op		= en ? VIRTCHNL2_OP_ENABLE_QUEUES :
				       VIRTCHNL2_OP_DISABLE_QUEUES,
		.prepare_msg	= idpf_prepare_ena_dis_qs_msg,
@@ -2180,7 +2186,7 @@ static int idpf_send_ena_dis_queue_set_msg(const struct idpf_queue_set *qs,
		qc[i].start_queue_id = cpu_to_le32(qid);
	}

	return idpf_send_chunked_msg(qs->vport, &params);
	return idpf_send_chunked_msg(qs->adapter, &params);
}

/**
@@ -2201,7 +2207,7 @@ static int idpf_send_ena_dis_queues_msg(struct idpf_vport *vport, bool en)
	num_txq = rsrc->num_txq + rsrc->num_complq;
	num_q = num_txq + rsrc->num_rxq + rsrc->num_bufq;

	qs = idpf_alloc_queue_set(vport, rsrc, num_q);
	qs = idpf_alloc_queue_set(vport->adapter, rsrc, vport->vport_id, num_q);
	if (!qs)
		return -ENOMEM;

@@ -2264,7 +2270,7 @@ static int idpf_send_ena_dis_queues_msg(struct idpf_vport *vport, bool en)
/**
 * idpf_prep_map_unmap_queue_set_vector_msg - prepare message to map or unmap
 *					      queue set to the interrupt vector
 * @vport: virtual port data structure
 * @vport_id: ID of virtual port queues are associated with
 * @buf: buffer containing the message
 * @pos: pointer to the first chunk describing the vector mapping
 * @num_chunks: number of chunks in the message
@@ -2275,13 +2281,12 @@ static int idpf_send_ena_dis_queues_msg(struct idpf_vport *vport, bool en)
 * Return: the total size of the prepared message.
 */
static u32
idpf_prep_map_unmap_queue_set_vector_msg(const struct idpf_vport *vport,
					 void *buf, const void *pos,
					 u32 num_chunks)
idpf_prep_map_unmap_queue_set_vector_msg(u32 vport_id, void *buf,
					 const void *pos, u32 num_chunks)
{
	struct virtchnl2_queue_vector_maps *vqvm = buf;

	vqvm->vport_id = cpu_to_le32(vport->vport_id);
	vqvm->vport_id = cpu_to_le32(vport_id);
	vqvm->num_qv_maps = cpu_to_le16(num_chunks);
	memcpy(vqvm->qv_maps, pos, num_chunks * sizeof(*vqvm->qv_maps));

@@ -2302,6 +2307,7 @@ idpf_send_map_unmap_queue_set_vector_msg(const struct idpf_queue_set *qs,
{
	struct virtchnl2_queue_vector *vqv __free(kfree) = NULL;
	struct idpf_chunked_msg_params params = {
		.vport_id	= qs->vport_id,
		.vc_op		= map ? VIRTCHNL2_OP_MAP_QUEUE_VECTOR :
					VIRTCHNL2_OP_UNMAP_QUEUE_VECTOR,
		.prepare_msg	= idpf_prep_map_unmap_queue_set_vector_msg,
@@ -2372,7 +2378,7 @@ idpf_send_map_unmap_queue_set_vector_msg(const struct idpf_queue_set *qs,
		vqv[i].itr_idx = cpu_to_le32(itr_idx);
	}

	return idpf_send_chunked_msg(qs->vport, &params);
	return idpf_send_chunked_msg(qs->adapter, &params);
}

/**
@@ -2392,7 +2398,7 @@ int idpf_send_map_unmap_queue_vector_msg(struct idpf_vport *vport,
	u32 num_q = rsrc->num_txq + rsrc->num_rxq;
	u32 k = 0;

	qs = idpf_alloc_queue_set(vport, rsrc, num_q);
	qs = idpf_alloc_queue_set(vport->adapter, rsrc, vport->vport_id, num_q);
	if (!qs)
		return -ENOMEM;

+4 −3
Original line number Diff line number Diff line
@@ -138,16 +138,17 @@ struct idpf_queue_ptr {
};

struct idpf_queue_set {
	struct idpf_vport		*vport;
	struct idpf_adapter		*adapter;
	struct idpf_q_vec_rsrc		*qv_rsrc;
	u32				vport_id;

	u32				num;
	struct idpf_queue_ptr		qs[] __counted_by(num);
};

struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_vport *vport,
struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_adapter *adapter,
					    struct idpf_q_vec_rsrc *rsrc,
					    u32 num);
					    u32 vport_id, u32 num);

int idpf_send_enable_queue_set_msg(const struct idpf_queue_set *qs);
int idpf_send_disable_queue_set_msg(const struct idpf_queue_set *qs);
+7 −4
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ static int __idpf_xdp_rxq_info_init(struct idpf_rx_queue *rxq, void *arg)
	if (!split)
		return 0;

	rxq->xdpsqs = &vport->txqs[vport->xdp_txq_offset];
	rxq->xdpsqs = &vport->txqs[rsrc->xdp_txq_offset];
	rxq->num_xdp_txq = vport->num_xdp_txq;

	return 0;
@@ -169,7 +169,7 @@ int idpf_xdpsqs_get(const struct idpf_vport *vport)
	}

	dev = vport->netdev;
	sqs = vport->xdp_txq_offset;
	sqs = vport->dflt_qv_rsrc.xdp_txq_offset;

	for (u32 i = sqs; i < vport->num_txq; i++) {
		struct idpf_tx_queue *xdpsq = vport->txqs[i];
@@ -206,7 +206,7 @@ void idpf_xdpsqs_put(const struct idpf_vport *vport)
		return;

	dev = vport->netdev;
	sqs = vport->xdp_txq_offset;
	sqs = vport->dflt_qv_rsrc.xdp_txq_offset;

	for (u32 i = sqs; i < vport->num_txq; i++) {
		struct idpf_tx_queue *xdpsq = vport->txqs[i];
@@ -362,12 +362,15 @@ int idpf_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
{
	const struct idpf_netdev_priv *np = netdev_priv(dev);
	const struct idpf_vport *vport = np->vport;
	u32 xdp_txq_offset;

	if (unlikely(!netif_carrier_ok(dev) || !vport->link_up))
		return -ENETDOWN;

	xdp_txq_offset = vport->dflt_qv_rsrc.xdp_txq_offset;

	return libeth_xdp_xmit_do_bulk(dev, n, frames, flags,
				       &vport->txqs[vport->xdp_txq_offset],
				       &vport->txqs[xdp_txq_offset],
				       vport->num_xdp_txq,
				       idpf_xdp_xmit_flush_bulk,
				       idpf_xdp_tx_finalize);
Loading