hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/net/virtio_net.c
....@@ -646,8 +646,13 @@
646646 int page_off,
647647 unsigned int *len)
648648 {
649
- struct page *page = alloc_page(GFP_ATOMIC);
649
+ int tailroom = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
650
+ struct page *page;
650651
652
+ if (page_off + *len + tailroom > PAGE_SIZE)
653
+ return NULL;
654
+
655
+ page = alloc_page(GFP_ATOMIC);
651656 if (!page)
652657 return NULL;
653658
....@@ -655,7 +660,6 @@
655660 page_off += *len;
656661
657662 while (--*num_buf) {
658
- int tailroom = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
659663 unsigned int buflen;
660664 void *buf;
661665 int off;
....@@ -1525,12 +1529,12 @@
15251529
15261530 received = virtnet_receive(rq, budget, &xdp_xmit);
15271531
1532
+ if (xdp_xmit & VIRTIO_XDP_REDIR)
1533
+ xdp_do_flush();
1534
+
15281535 /* Out of packets? */
15291536 if (received < budget)
15301537 virtqueue_napi_complete(napi, rq->vq, received);
1531
-
1532
- if (xdp_xmit & VIRTIO_XDP_REDIR)
1533
- xdp_do_flush();
15341538
15351539 if (xdp_xmit & VIRTIO_XDP_TX) {
15361540 sq = virtnet_xdp_get_sq(vi);
....@@ -1928,8 +1932,8 @@
19281932 cancel_delayed_work_sync(&vi->refill);
19291933
19301934 for (i = 0; i < vi->max_queue_pairs; i++) {
1931
- xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
19321935 napi_disable(&vi->rq[i].napi);
1936
+ xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
19331937 virtnet_napi_tx_disable(&vi->sq[i].napi);
19341938 }
19351939
....@@ -2746,6 +2750,27 @@
27462750 put_page(vi->rq[i].alloc_frag.page);
27472751 }
27482752
2753
+static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf)
2754
+{
2755
+ if (!is_xdp_frame(buf))
2756
+ dev_kfree_skb(buf);
2757
+ else
2758
+ xdp_return_frame(ptr_to_xdp(buf));
2759
+}
2760
+
2761
+static void virtnet_rq_free_unused_buf(struct virtqueue *vq, void *buf)
2762
+{
2763
+ struct virtnet_info *vi = vq->vdev->priv;
2764
+ int i = vq2rxq(vq);
2765
+
2766
+ if (vi->mergeable_rx_bufs)
2767
+ put_page(virt_to_head_page(buf));
2768
+ else if (vi->big_packets)
2769
+ give_pages(&vi->rq[i], buf);
2770
+ else
2771
+ put_page(virt_to_head_page(buf));
2772
+}
2773
+
27492774 static void free_unused_bufs(struct virtnet_info *vi)
27502775 {
27512776 void *buf;
....@@ -2753,26 +2778,16 @@
27532778
27542779 for (i = 0; i < vi->max_queue_pairs; i++) {
27552780 struct virtqueue *vq = vi->sq[i].vq;
2756
- while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
2757
- if (!is_xdp_frame(buf))
2758
- dev_kfree_skb(buf);
2759
- else
2760
- xdp_return_frame(ptr_to_xdp(buf));
2761
- }
2781
+ while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
2782
+ virtnet_sq_free_unused_buf(vq, buf);
2783
+ cond_resched();
27622784 }
27632785
27642786 for (i = 0; i < vi->max_queue_pairs; i++) {
27652787 struct virtqueue *vq = vi->rq[i].vq;
2766
-
2767
- while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
2768
- if (vi->mergeable_rx_bufs) {
2769
- put_page(virt_to_head_page(buf));
2770
- } else if (vi->big_packets) {
2771
- give_pages(&vi->rq[i], buf);
2772
- } else {
2773
- put_page(virt_to_head_page(buf));
2774
- }
2775
- }
2788
+ while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
2789
+ virtnet_rq_free_unused_buf(vq, buf);
2790
+ cond_resched();
27762791 }
27772792 }
27782793
....@@ -3220,6 +3235,8 @@
32203235
32213236 virtio_device_ready(vdev);
32223237
3238
+ _virtnet_set_queues(vi, vi->curr_queue_pairs);
3239
+
32233240 rtnl_unlock();
32243241
32253242 err = virtnet_cpu_notif_add(vi);
....@@ -3227,8 +3244,6 @@
32273244 pr_debug("virtio_net: registering cpu notifier failed\n");
32283245 goto free_unregister_netdev;
32293246 }
3230
-
3231
- virtnet_set_queues(vi, vi->curr_queue_pairs);
32323247
32333248 /* Assume link up if device can't report link status,
32343249 otherwise get link status from config. */