Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions drivers/net/ethernet/intel/idpf/idpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ struct idpf_vport {
struct idpf_tx_queue **txqs;
bool crc_enable;

struct bpf_prog *xdp_prog;
bool xdpq_share;
u16 num_xdp_txq;
u16 xdp_txq_offset;
Expand Down Expand Up @@ -599,10 +600,7 @@ static inline int idpf_is_queue_model_split(u16 q_model)
*/
static inline bool idpf_xdp_is_prog_ena(const struct idpf_vport *vport)
{
if (!vport->adapter)
return false;

return !!vport->adapter->vport_config[vport->idx]->user_config.xdp.prog;
return !!vport->xdp_prog;
}

#define idpf_is_cap_ena(adapter, field, flag) \
Expand Down Expand Up @@ -836,6 +834,7 @@ void idpf_vf_dev_ops_init(struct idpf_adapter *adapter);
int idpf_intr_req(struct idpf_adapter *adapter);
void idpf_intr_rel(struct idpf_adapter *adapter);
u16 idpf_get_max_tx_hdr_size(struct idpf_adapter *adapter);
int idpf_vport_open(struct idpf_vport *vport);
int idpf_initiate_soft_reset(struct idpf_vport *vport,
enum idpf_vport_reset_cause reset_cause);
void idpf_deinit_task(struct idpf_adapter *adapter);
Expand Down
14 changes: 3 additions & 11 deletions drivers/net/ethernet/intel/idpf/idpf_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1314,7 +1314,7 @@ static void idpf_rx_init_buf_tail(struct idpf_vport *vport)
* idpf_vport_open - Bring up a vport
* @vport: vport to bring up
*/
static int idpf_vport_open(struct idpf_vport *vport)
int idpf_vport_open(struct idpf_vport *vport)
{
struct idpf_netdev_priv *np = netdev_priv(vport->netdev);
struct idpf_adapter *adapter = vport->adapter;
Expand Down Expand Up @@ -1901,7 +1901,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
new_vport->num_rxq,
new_vport->num_bufq);
if (err)
goto err_reset;
goto free_vport;

/* Same comment as above regarding avoiding copying the wait_queues and
* mutexes applies here. We do not want to mess with those if possible.
Expand All @@ -1915,7 +1915,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
vport->num_txq - vport->num_xdp_txq,
vport->num_xdp_txq);
if (err)
goto err_open;
goto free_vport;

if (current_state == __IDPF_VPORT_UP)
err = idpf_vport_open(vport);
Expand All @@ -1924,14 +1924,6 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,

return err;

err_reset:
idpf_send_add_queues_msg(vport, vport->num_txq, vport->num_complq,
vport->num_rxq, vport->num_bufq);

err_open:
if (current_state == __IDPF_VPORT_UP)
idpf_vport_open(vport);

free_vport:
kfree(new_vport);

Expand Down
3 changes: 2 additions & 1 deletion drivers/net/ethernet/intel/idpf/idpf_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1585,6 +1585,7 @@ void idpf_vport_init_num_qs(struct idpf_vport *vport,
config_data->num_req_tx_qs = le16_to_cpu(vport_msg->num_tx_q);
config_data->num_req_rx_qs = le16_to_cpu(vport_msg->num_rx_q);
}
vport->xdp_prog = config_data->xdp.prog;

if (idpf_is_queue_model_split(vport->txq_model))
vport->num_complq = le16_to_cpu(vport_msg->num_tx_complq);
Expand Down Expand Up @@ -2098,7 +2099,7 @@ int idpf_vport_queues_alloc(struct idpf_vport *vport)
if (err)
goto err_out;

prog = vport->adapter->vport_config[vport->idx]->user_config.xdp.prog;
prog = vport->xdp_prog;
idpf_copy_xdp_prog_to_qs(vport, prog);

return 0;
Expand Down
20 changes: 10 additions & 10 deletions drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2127,13 +2127,11 @@ idpf_send_map_unmap_queue_set_vector_msg(const struct idpf_queue_set *qs,

split = idpf_is_queue_model_split(qs->vport->txq_model);

for (u32 i = 0; i < qs->num; i++) {
for (u32 i = 0, j = 0; i < qs->num; i++) {
const struct idpf_queue_ptr *q = &qs->qs[i];
const struct idpf_q_vector *vec;
u32 qid, v_idx, itr_idx;

vqv[i].queue_type = cpu_to_le32(q->type);

switch (q->type) {
case VIRTCHNL2_QUEUE_TYPE_RX:
qid = q->rxq->q_id;
Expand All @@ -2147,8 +2145,8 @@ idpf_send_map_unmap_queue_set_vector_msg(const struct idpf_queue_set *qs,
v_idx = vec->v_idx;
itr_idx = vec->rx_itr_idx;
} else {
v_idx = 0;
itr_idx = VIRTCHNL2_ITR_IDX_0;
params.num_chunks--;
continue;
}
break;
case VIRTCHNL2_QUEUE_TYPE_TX:
Expand All @@ -2167,17 +2165,19 @@ idpf_send_map_unmap_queue_set_vector_msg(const struct idpf_queue_set *qs,
v_idx = vec->v_idx;
itr_idx = vec->tx_itr_idx;
} else {
v_idx = 0;
itr_idx = VIRTCHNL2_ITR_IDX_1;
params.num_chunks--;
continue;
}
break;
default:
return -EINVAL;
}

vqv[i].queue_id = cpu_to_le32(qid);
vqv[i].vector_id = cpu_to_le16(v_idx);
vqv[i].itr_idx = cpu_to_le32(itr_idx);
vqv[j].queue_type = cpu_to_le32(q->type);
vqv[j].queue_id = cpu_to_le32(qid);
vqv[j].vector_id = cpu_to_le16(v_idx);
vqv[j].itr_idx = cpu_to_le32(itr_idx);
j++;
}

return idpf_send_chunked_msg(qs->vport, &params);
Expand Down
27 changes: 23 additions & 4 deletions drivers/net/ethernet/intel/idpf/xdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,13 +467,16 @@ void idpf_xdp_set_features(const struct idpf_vport *vport)
static int
idpf_xdp_setup_prog(struct idpf_vport *vport, struct netdev_bpf *xdp)
{
struct idpf_netdev_priv *np = netdev_priv(vport->netdev);
enum idpf_vport_state current_state = np->state;
struct bpf_prog *prog = xdp->prog;
struct xdp_attachment_info *info;
bool reconfig;
int ret;

info = &vport->adapter->vport_config[vport->idx]->user_config.xdp;
reconfig = !!info->prog != !!prog;
reconfig = !!info->prog != !!prog &&
!test_bit(IDPF_REMOVE_IN_PROG, vport->adapter->flags);

xdp_attachment_setup(info, xdp);

Expand All @@ -482,16 +485,32 @@ idpf_xdp_setup_prog(struct idpf_vport *vport, struct netdev_bpf *xdp)
return 0;
}

libeth_xdp_set_redirect(vport->netdev, prog);

ret = idpf_initiate_soft_reset(vport, IDPF_SR_Q_CHANGE);
if (ret) {
NL_SET_ERR_MSG_MOD(xdp->extack,
"Could not reopen the vport after XDP setup");
return ret;
goto err_reset;
}

libeth_xdp_set_redirect(vport->netdev, prog);
return 0;

err_reset:
if (info->prog)
bpf_prog_put(info->prog);
info->prog = NULL;
info->flags = 0;

if (idpf_initiate_soft_reset(vport, IDPF_SR_Q_CHANGE)) {
NL_SET_ERR_MSG_MOD(xdp->extack,
"Could not restore the vport config after failed XDP setup");
return ret;
}

if (current_state == __IDPF_VPORT_UP)
idpf_vport_open(vport);

return ret;
}

/**
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/intel/libeth/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ int libeth_rx_fq_create(struct libeth_fq *fq, struct napi_struct *napi)
return 0;

err_mem:
xdp_unreg_page_pool(pool);
kvfree(fqes);
err_buf:
page_pool_destroy(pool);
Expand All @@ -205,6 +206,7 @@ void libeth_rx_fq_destroy(struct libeth_fq *fq)
{
xdp_unreg_page_pool(fq->pp);
kvfree(fq->fqes);
page_pool_destroy(fq->pp);
}
EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH);

Expand Down