mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
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: Madhu Chittim <madhu.chittim@intel.com> Signed-off-by: Joshua Hay <joshua.a.hay@intel.com> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Tested-by: Samuel Salin <Samuel.salin@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
cfa7029a25
commit
9ad94c235a
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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, ¶ms);
|
||||
return idpf_send_chunked_msg(qs->adapter, ¶ms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -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, ¶ms);
|
||||
return idpf_send_chunked_msg(qs->adapter, ¶ms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -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, ¶ms);
|
||||
return idpf_send_chunked_msg(qs->adapter, ¶ms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -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, ¶ms);
|
||||
return idpf_send_chunked_msg(qs->adapter, ¶ms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ static void idpf_xsk_setup_txq(const struct idpf_vport *vport,
|
|||
if (!idpf_queue_has(XDP, txq))
|
||||
return;
|
||||
|
||||
qid = txq->idx - vport->xdp_txq_offset;
|
||||
qid = txq->idx - vport->dflt_qv_rsrc.xdp_txq_offset;
|
||||
|
||||
pool = xsk_get_pool_from_qid(vport->netdev, qid);
|
||||
if (!pool || !pool->dev)
|
||||
|
|
@ -87,7 +87,8 @@ static void idpf_xsk_setup_complq(const struct idpf_vport *vport,
|
|||
if (!idpf_queue_has(XDP, complq))
|
||||
return;
|
||||
|
||||
qid = complq->txq_grp->txqs[0]->idx - vport->xdp_txq_offset;
|
||||
qid = complq->txq_grp->txqs[0]->idx -
|
||||
vport->dflt_qv_rsrc.xdp_txq_offset;
|
||||
|
||||
pool = xsk_get_pool_from_qid(vport->netdev, qid);
|
||||
if (!pool || !pool->dev)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user