diff options
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r-- | drivers/net/virtio_net.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 6fb7b658a6cc..ed8299343728 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/average.h> | 31 | #include <linux/average.h> |
32 | #include <linux/filter.h> | 32 | #include <linux/filter.h> |
33 | #include <net/route.h> | 33 | #include <net/route.h> |
34 | #include <net/xdp.h> | ||
34 | 35 | ||
35 | static int napi_weight = NAPI_POLL_WEIGHT; | 36 | static int napi_weight = NAPI_POLL_WEIGHT; |
36 | module_param(napi_weight, int, 0444); | 37 | module_param(napi_weight, int, 0444); |
@@ -115,6 +116,8 @@ struct receive_queue { | |||
115 | 116 | ||
116 | /* Name of this receive queue: input.$index */ | 117 | /* Name of this receive queue: input.$index */ |
117 | char name[40]; | 118 | char name[40]; |
119 | |||
120 | struct xdp_rxq_info xdp_rxq; | ||
118 | }; | 121 | }; |
119 | 122 | ||
120 | struct virtnet_info { | 123 | struct virtnet_info { |
@@ -559,6 +562,7 @@ static struct sk_buff *receive_small(struct net_device *dev, | |||
559 | xdp.data = xdp.data_hard_start + xdp_headroom; | 562 | xdp.data = xdp.data_hard_start + xdp_headroom; |
560 | xdp_set_data_meta_invalid(&xdp); | 563 | xdp_set_data_meta_invalid(&xdp); |
561 | xdp.data_end = xdp.data + len; | 564 | xdp.data_end = xdp.data + len; |
565 | xdp.rxq = &rq->xdp_rxq; | ||
562 | orig_data = xdp.data; | 566 | orig_data = xdp.data; |
563 | act = bpf_prog_run_xdp(xdp_prog, &xdp); | 567 | act = bpf_prog_run_xdp(xdp_prog, &xdp); |
564 | 568 | ||
@@ -692,6 +696,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, | |||
692 | xdp.data = data + vi->hdr_len; | 696 | xdp.data = data + vi->hdr_len; |
693 | xdp_set_data_meta_invalid(&xdp); | 697 | xdp_set_data_meta_invalid(&xdp); |
694 | xdp.data_end = xdp.data + (len - vi->hdr_len); | 698 | xdp.data_end = xdp.data + (len - vi->hdr_len); |
699 | xdp.rxq = &rq->xdp_rxq; | ||
700 | |||
695 | act = bpf_prog_run_xdp(xdp_prog, &xdp); | 701 | act = bpf_prog_run_xdp(xdp_prog, &xdp); |
696 | 702 | ||
697 | if (act != XDP_PASS) | 703 | if (act != XDP_PASS) |
@@ -1225,13 +1231,18 @@ static int virtnet_poll(struct napi_struct *napi, int budget) | |||
1225 | static int virtnet_open(struct net_device *dev) | 1231 | static int virtnet_open(struct net_device *dev) |
1226 | { | 1232 | { |
1227 | struct virtnet_info *vi = netdev_priv(dev); | 1233 | struct virtnet_info *vi = netdev_priv(dev); |
1228 | int i; | 1234 | int i, err; |
1229 | 1235 | ||
1230 | for (i = 0; i < vi->max_queue_pairs; i++) { | 1236 | for (i = 0; i < vi->max_queue_pairs; i++) { |
1231 | if (i < vi->curr_queue_pairs) | 1237 | if (i < vi->curr_queue_pairs) |
1232 | /* Make sure we have some buffers: if oom use wq. */ | 1238 | /* Make sure we have some buffers: if oom use wq. */ |
1233 | if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL)) | 1239 | if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL)) |
1234 | schedule_delayed_work(&vi->refill, 0); | 1240 | schedule_delayed_work(&vi->refill, 0); |
1241 | |||
1242 | err = xdp_rxq_info_reg(&vi->rq[i].xdp_rxq, dev, i); | ||
1243 | if (err < 0) | ||
1244 | return err; | ||
1245 | |||
1235 | virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi); | 1246 | virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi); |
1236 | virtnet_napi_tx_enable(vi, vi->sq[i].vq, &vi->sq[i].napi); | 1247 | virtnet_napi_tx_enable(vi, vi->sq[i].vq, &vi->sq[i].napi); |
1237 | } | 1248 | } |
@@ -1560,6 +1571,7 @@ static int virtnet_close(struct net_device *dev) | |||
1560 | cancel_delayed_work_sync(&vi->refill); | 1571 | cancel_delayed_work_sync(&vi->refill); |
1561 | 1572 | ||
1562 | for (i = 0; i < vi->max_queue_pairs; i++) { | 1573 | for (i = 0; i < vi->max_queue_pairs; i++) { |
1574 | xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq); | ||
1563 | napi_disable(&vi->rq[i].napi); | 1575 | napi_disable(&vi->rq[i].napi); |
1564 | virtnet_napi_tx_disable(&vi->sq[i].napi); | 1576 | virtnet_napi_tx_disable(&vi->sq[i].napi); |
1565 | } | 1577 | } |