Skip to content

Commit bc59b55

Browse files
committed
Merge branch 'idpf-fix-3-bugs-revealed-by-the-chapter-i'
Tony Nguyen says: ==================== idpf: fix 3 bugs revealed by the Chapter I Alexander Lobakin says: The libeth conversion revealed 2 serious issues which lead to sporadic crashes or WARNs under certain configurations. Additional one was found while debugging these two with kmemleak. This one is targeted stable, the rest can be backported manually later if needed. They can be reproduced only after the conversion is applied anyway. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents da03f5d + 290f1c0 commit bc59b55

File tree

2 files changed

+33
-58
lines changed

2 files changed

+33
-58
lines changed

drivers/net/ethernet/intel/idpf/idpf_lib.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,8 @@ static void idpf_vport_stop(struct idpf_vport *vport)
900900

901901
vport->link_up = false;
902902
idpf_vport_intr_deinit(vport);
903-
idpf_vport_intr_rel(vport);
904903
idpf_vport_queues_rel(vport);
904+
idpf_vport_intr_rel(vport);
905905
np->state = __IDPF_VPORT_DOWN;
906906
}
907907

@@ -1335,9 +1335,8 @@ static void idpf_rx_init_buf_tail(struct idpf_vport *vport)
13351335
/**
13361336
* idpf_vport_open - Bring up a vport
13371337
* @vport: vport to bring up
1338-
* @alloc_res: allocate queue resources
13391338
*/
1340-
static int idpf_vport_open(struct idpf_vport *vport, bool alloc_res)
1339+
static int idpf_vport_open(struct idpf_vport *vport)
13411340
{
13421341
struct idpf_netdev_priv *np = netdev_priv(vport->netdev);
13431342
struct idpf_adapter *adapter = vport->adapter;
@@ -1350,45 +1349,43 @@ static int idpf_vport_open(struct idpf_vport *vport, bool alloc_res)
13501349
/* we do not allow interface up just yet */
13511350
netif_carrier_off(vport->netdev);
13521351

1353-
if (alloc_res) {
1354-
err = idpf_vport_queues_alloc(vport);
1355-
if (err)
1356-
return err;
1357-
}
1358-
13591352
err = idpf_vport_intr_alloc(vport);
13601353
if (err) {
13611354
dev_err(&adapter->pdev->dev, "Failed to allocate interrupts for vport %u: %d\n",
13621355
vport->vport_id, err);
1363-
goto queues_rel;
1356+
return err;
13641357
}
13651358

1359+
err = idpf_vport_queues_alloc(vport);
1360+
if (err)
1361+
goto intr_rel;
1362+
13661363
err = idpf_vport_queue_ids_init(vport);
13671364
if (err) {
13681365
dev_err(&adapter->pdev->dev, "Failed to initialize queue ids for vport %u: %d\n",
13691366
vport->vport_id, err);
1370-
goto intr_rel;
1367+
goto queues_rel;
13711368
}
13721369

13731370
err = idpf_vport_intr_init(vport);
13741371
if (err) {
13751372
dev_err(&adapter->pdev->dev, "Failed to initialize interrupts for vport %u: %d\n",
13761373
vport->vport_id, err);
1377-
goto intr_rel;
1374+
goto queues_rel;
13781375
}
13791376

13801377
err = idpf_rx_bufs_init_all(vport);
13811378
if (err) {
13821379
dev_err(&adapter->pdev->dev, "Failed to initialize RX buffers for vport %u: %d\n",
13831380
vport->vport_id, err);
1384-
goto intr_rel;
1381+
goto queues_rel;
13851382
}
13861383

13871384
err = idpf_queue_reg_init(vport);
13881385
if (err) {
13891386
dev_err(&adapter->pdev->dev, "Failed to initialize queue registers for vport %u: %d\n",
13901387
vport->vport_id, err);
1391-
goto intr_rel;
1388+
goto queues_rel;
13921389
}
13931390

13941391
idpf_rx_init_buf_tail(vport);
@@ -1455,10 +1452,10 @@ static int idpf_vport_open(struct idpf_vport *vport, bool alloc_res)
14551452
idpf_send_map_unmap_queue_vector_msg(vport, false);
14561453
intr_deinit:
14571454
idpf_vport_intr_deinit(vport);
1458-
intr_rel:
1459-
idpf_vport_intr_rel(vport);
14601455
queues_rel:
14611456
idpf_vport_queues_rel(vport);
1457+
intr_rel:
1458+
idpf_vport_intr_rel(vport);
14621459

14631460
return err;
14641461
}
@@ -1539,7 +1536,7 @@ void idpf_init_task(struct work_struct *work)
15391536
np = netdev_priv(vport->netdev);
15401537
np->state = __IDPF_VPORT_DOWN;
15411538
if (test_and_clear_bit(IDPF_VPORT_UP_REQUESTED, vport_config->flags))
1542-
idpf_vport_open(vport, true);
1539+
idpf_vport_open(vport);
15431540

15441541
/* Spawn and return 'idpf_init_task' work queue until all the
15451542
* default vports are created
@@ -1898,9 +1895,6 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
18981895
goto free_vport;
18991896
}
19001897

1901-
err = idpf_vport_queues_alloc(new_vport);
1902-
if (err)
1903-
goto free_vport;
19041898
if (current_state <= __IDPF_VPORT_DOWN) {
19051899
idpf_send_delete_queues_msg(vport);
19061900
} else {
@@ -1932,17 +1926,23 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
19321926

19331927
err = idpf_set_real_num_queues(vport);
19341928
if (err)
1935-
goto err_reset;
1929+
goto err_open;
19361930

19371931
if (current_state == __IDPF_VPORT_UP)
1938-
err = idpf_vport_open(vport, false);
1932+
err = idpf_vport_open(vport);
19391933

19401934
kfree(new_vport);
19411935

19421936
return err;
19431937

19441938
err_reset:
1945-
idpf_vport_queues_rel(new_vport);
1939+
idpf_send_add_queues_msg(vport, vport->num_txq, vport->num_complq,
1940+
vport->num_rxq, vport->num_bufq);
1941+
1942+
err_open:
1943+
if (current_state == __IDPF_VPORT_UP)
1944+
idpf_vport_open(vport);
1945+
19461946
free_vport:
19471947
kfree(new_vport);
19481948

@@ -2171,7 +2171,7 @@ static int idpf_open(struct net_device *netdev)
21712171
idpf_vport_ctrl_lock(netdev);
21722172
vport = idpf_netdev_to_vport(netdev);
21732173

2174-
err = idpf_vport_open(vport, true);
2174+
err = idpf_vport_open(vport);
21752175

21762176
idpf_vport_ctrl_unlock(netdev);
21772177

drivers/net/ethernet/intel/idpf/idpf_txrx.c

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3576,9 +3576,7 @@ static void idpf_vport_intr_napi_dis_all(struct idpf_vport *vport)
35763576
*/
35773577
void idpf_vport_intr_rel(struct idpf_vport *vport)
35783578
{
3579-
int i, j, v_idx;
3580-
3581-
for (v_idx = 0; v_idx < vport->num_q_vectors; v_idx++) {
3579+
for (u32 v_idx = 0; v_idx < vport->num_q_vectors; v_idx++) {
35823580
struct idpf_q_vector *q_vector = &vport->q_vectors[v_idx];
35833581

35843582
kfree(q_vector->complq);
@@ -3593,26 +3591,6 @@ void idpf_vport_intr_rel(struct idpf_vport *vport)
35933591
free_cpumask_var(q_vector->affinity_mask);
35943592
}
35953593

3596-
/* Clean up the mapping of queues to vectors */
3597-
for (i = 0; i < vport->num_rxq_grp; i++) {
3598-
struct idpf_rxq_group *rx_qgrp = &vport->rxq_grps[i];
3599-
3600-
if (idpf_is_queue_model_split(vport->rxq_model))
3601-
for (j = 0; j < rx_qgrp->splitq.num_rxq_sets; j++)
3602-
rx_qgrp->splitq.rxq_sets[j]->rxq.q_vector = NULL;
3603-
else
3604-
for (j = 0; j < rx_qgrp->singleq.num_rxq; j++)
3605-
rx_qgrp->singleq.rxqs[j]->q_vector = NULL;
3606-
}
3607-
3608-
if (idpf_is_queue_model_split(vport->txq_model))
3609-
for (i = 0; i < vport->num_txq_grp; i++)
3610-
vport->txq_grps[i].complq->q_vector = NULL;
3611-
else
3612-
for (i = 0; i < vport->num_txq_grp; i++)
3613-
for (j = 0; j < vport->txq_grps[i].num_txq; j++)
3614-
vport->txq_grps[i].txqs[j]->q_vector = NULL;
3615-
36163594
kfree(vport->q_vectors);
36173595
vport->q_vectors = NULL;
36183596
}
@@ -3780,13 +3758,15 @@ void idpf_vport_intr_update_itr_ena_irq(struct idpf_q_vector *q_vector)
37803758
/**
37813759
* idpf_vport_intr_req_irq - get MSI-X vectors from the OS for the vport
37823760
* @vport: main vport structure
3783-
* @basename: name for the vector
37843761
*/
3785-
static int idpf_vport_intr_req_irq(struct idpf_vport *vport, char *basename)
3762+
static int idpf_vport_intr_req_irq(struct idpf_vport *vport)
37863763
{
37873764
struct idpf_adapter *adapter = vport->adapter;
3765+
const char *drv_name, *if_name, *vec_name;
37883766
int vector, err, irq_num, vidx;
3789-
const char *vec_name;
3767+
3768+
drv_name = dev_driver_string(&adapter->pdev->dev);
3769+
if_name = netdev_name(vport->netdev);
37903770

37913771
for (vector = 0; vector < vport->num_q_vectors; vector++) {
37923772
struct idpf_q_vector *q_vector = &vport->q_vectors[vector];
@@ -3804,8 +3784,8 @@ static int idpf_vport_intr_req_irq(struct idpf_vport *vport, char *basename)
38043784
else
38053785
continue;
38063786

3807-
name = kasprintf(GFP_KERNEL, "%s-%s-%d", basename, vec_name,
3808-
vidx);
3787+
name = kasprintf(GFP_KERNEL, "%s-%s-%s-%d", drv_name, if_name,
3788+
vec_name, vidx);
38093789

38103790
err = request_irq(irq_num, idpf_vport_intr_clean_queues, 0,
38113791
name, q_vector);
@@ -4326,7 +4306,6 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport)
43264306
*/
43274307
int idpf_vport_intr_init(struct idpf_vport *vport)
43284308
{
4329-
char *int_name;
43304309
int err;
43314310

43324311
err = idpf_vport_intr_init_vec_idx(vport);
@@ -4340,11 +4319,7 @@ int idpf_vport_intr_init(struct idpf_vport *vport)
43404319
if (err)
43414320
goto unroll_vectors_alloc;
43424321

4343-
int_name = kasprintf(GFP_KERNEL, "%s-%s",
4344-
dev_driver_string(&vport->adapter->pdev->dev),
4345-
vport->netdev->name);
4346-
4347-
err = idpf_vport_intr_req_irq(vport, int_name);
4322+
err = idpf_vport_intr_req_irq(vport);
43484323
if (err)
43494324
goto unroll_vectors_alloc;
43504325

0 commit comments

Comments
 (0)