Skip to content

Commit 915c82f

Browse files
kuba-mooPaolo Abeni
authored andcommitted
netdevsim: allocate rqs individually
Make nsim->rqs an array of pointers and allocate them individually so that we can swap them out one by one. Reviewed-by: Willem de Bruijn <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 00adf88 commit 915c82f

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

drivers/net/netdevsim/netdev.c

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
6969
rxq = skb_get_queue_mapping(skb);
7070
if (rxq >= peer_dev->num_rx_queues)
7171
rxq = rxq % peer_dev->num_rx_queues;
72-
rq = &peer_ns->rq[rxq];
72+
rq = peer_ns->rq[rxq];
7373

7474
skb_tx_timestamp(skb);
7575
if (unlikely(nsim_forward_skb(peer_dev, skb, rq) == NET_RX_DROP))
@@ -388,13 +388,13 @@ static int nsim_init_napi(struct netdevsim *ns)
388388
int err, i;
389389

390390
for (i = 0; i < dev->num_rx_queues; i++) {
391-
rq = &ns->rq[i];
391+
rq = ns->rq[i];
392392

393393
netif_napi_add_config(dev, &rq->napi, nsim_poll, i);
394394
}
395395

396396
for (i = 0; i < dev->num_rx_queues; i++) {
397-
rq = &ns->rq[i];
397+
rq = ns->rq[i];
398398

399399
err = nsim_create_page_pool(rq);
400400
if (err)
@@ -405,12 +405,12 @@ static int nsim_init_napi(struct netdevsim *ns)
405405

406406
err_pp_destroy:
407407
while (i--) {
408-
page_pool_destroy(ns->rq[i].page_pool);
409-
ns->rq[i].page_pool = NULL;
408+
page_pool_destroy(ns->rq[i]->page_pool);
409+
ns->rq[i]->page_pool = NULL;
410410
}
411411

412412
for (i = 0; i < dev->num_rx_queues; i++)
413-
__netif_napi_del(&ns->rq[i].napi);
413+
__netif_napi_del(&ns->rq[i]->napi);
414414

415415
return err;
416416
}
@@ -421,7 +421,7 @@ static void nsim_enable_napi(struct netdevsim *ns)
421421
int i;
422422

423423
for (i = 0; i < dev->num_rx_queues; i++) {
424-
struct nsim_rq *rq = &ns->rq[i];
424+
struct nsim_rq *rq = ns->rq[i];
425425

426426
netif_queue_set_napi(dev, i, NETDEV_QUEUE_TYPE_RX, &rq->napi);
427427
napi_enable(&rq->napi);
@@ -448,16 +448,16 @@ static void nsim_del_napi(struct netdevsim *ns)
448448
int i;
449449

450450
for (i = 0; i < dev->num_rx_queues; i++) {
451-
struct nsim_rq *rq = &ns->rq[i];
451+
struct nsim_rq *rq = ns->rq[i];
452452

453453
napi_disable(&rq->napi);
454454
__netif_napi_del(&rq->napi);
455455
}
456456
synchronize_net();
457457

458458
for (i = 0; i < dev->num_rx_queues; i++) {
459-
page_pool_destroy(ns->rq[i].page_pool);
460-
ns->rq[i].page_pool = NULL;
459+
page_pool_destroy(ns->rq[i]->page_pool);
460+
ns->rq[i]->page_pool = NULL;
461461
}
462462
}
463463

@@ -628,7 +628,7 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
628628
if (!netif_running(ns->netdev) && val) {
629629
ret = -ENETDOWN;
630630
} else if (val) {
631-
ns->page = page_pool_dev_alloc_pages(ns->rq[0].page_pool);
631+
ns->page = page_pool_dev_alloc_pages(ns->rq[0]->page_pool);
632632
if (!ns->page)
633633
ret = -ENOMEM;
634634
} else {
@@ -677,27 +677,40 @@ static int nsim_queue_init(struct netdevsim *ns)
677677
struct net_device *dev = ns->netdev;
678678
int i;
679679

680-
ns->rq = kvcalloc(dev->num_rx_queues, sizeof(*ns->rq),
681-
GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL);
680+
ns->rq = kcalloc(dev->num_rx_queues, sizeof(*ns->rq),
681+
GFP_KERNEL_ACCOUNT);
682682
if (!ns->rq)
683683
return -ENOMEM;
684684

685-
for (i = 0; i < dev->num_rx_queues; i++)
686-
skb_queue_head_init(&ns->rq[i].skb_queue);
685+
for (i = 0; i < dev->num_rx_queues; i++) {
686+
ns->rq[i] = kzalloc(sizeof(**ns->rq), GFP_KERNEL_ACCOUNT);
687+
if (!ns->rq[i])
688+
goto err_free_prev;
689+
690+
skb_queue_head_init(&ns->rq[i]->skb_queue);
691+
}
687692

688693
return 0;
694+
695+
err_free_prev:
696+
while (i--)
697+
kfree(ns->rq[i]);
698+
kfree(ns->rq);
699+
return -ENOMEM;
689700
}
690701

691702
static void nsim_queue_free(struct netdevsim *ns)
692703
{
693704
struct net_device *dev = ns->netdev;
694705
int i;
695706

696-
for (i = 0; i < dev->num_rx_queues; i++)
697-
skb_queue_purge_reason(&ns->rq[i].skb_queue,
707+
for (i = 0; i < dev->num_rx_queues; i++) {
708+
skb_queue_purge_reason(&ns->rq[i]->skb_queue,
698709
SKB_DROP_REASON_QUEUE_PURGE);
710+
kfree(ns->rq[i]);
711+
}
699712

700-
kvfree(ns->rq);
713+
kfree(ns->rq);
701714
ns->rq = NULL;
702715
}
703716

drivers/net/netdevsim/netdevsim.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct netdevsim {
101101
struct nsim_dev *nsim_dev;
102102
struct nsim_dev_port *nsim_dev_port;
103103
struct mock_phc *phc;
104-
struct nsim_rq *rq;
104+
struct nsim_rq **rq;
105105

106106
u64 tx_packets;
107107
u64 tx_bytes;

0 commit comments

Comments
 (0)