|
31 | 31 | #include <linux/average.h>
|
32 | 32 | #include <linux/filter.h>
|
33 | 33 | #include <net/route.h>
|
| 34 | +#include <net/xdp.h> |
34 | 35 |
|
35 | 36 | static int napi_weight = NAPI_POLL_WEIGHT;
|
36 | 37 | module_param(napi_weight, int, 0444);
|
@@ -115,6 +116,8 @@ struct receive_queue {
|
115 | 116 |
|
116 | 117 | /* Name of this receive queue: input.$index */
|
117 | 118 | char name[40];
|
| 119 | + |
| 120 | + struct xdp_rxq_info xdp_rxq; |
118 | 121 | };
|
119 | 122 |
|
120 | 123 | struct virtnet_info {
|
@@ -559,6 +562,7 @@ static struct sk_buff *receive_small(struct net_device *dev,
|
559 | 562 | xdp.data = xdp.data_hard_start + xdp_headroom;
|
560 | 563 | xdp_set_data_meta_invalid(&xdp);
|
561 | 564 | xdp.data_end = xdp.data + len;
|
| 565 | + xdp.rxq = &rq->xdp_rxq; |
562 | 566 | orig_data = xdp.data;
|
563 | 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 | 696 | xdp.data = data + vi->hdr_len;
|
693 | 697 | xdp_set_data_meta_invalid(&xdp);
|
694 | 698 | xdp.data_end = xdp.data + (len - vi->hdr_len);
|
| 699 | + xdp.rxq = &rq->xdp_rxq; |
| 700 | + |
695 | 701 | act = bpf_prog_run_xdp(xdp_prog, &xdp);
|
696 | 702 |
|
697 | 703 | if (act != XDP_PASS)
|
@@ -1225,13 +1231,18 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
|
1225 | 1231 | static int virtnet_open(struct net_device *dev)
|
1226 | 1232 | {
|
1227 | 1233 | struct virtnet_info *vi = netdev_priv(dev);
|
1228 |
| - int i; |
| 1234 | + int i, err; |
1229 | 1235 |
|
1230 | 1236 | for (i = 0; i < vi->max_queue_pairs; i++) {
|
1231 | 1237 | if (i < vi->curr_queue_pairs)
|
1232 | 1238 | /* Make sure we have some buffers: if oom use wq. */
|
1233 | 1239 | if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
|
1234 | 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 | 1246 | virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
|
1236 | 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 | 1571 | cancel_delayed_work_sync(&vi->refill);
|
1561 | 1572 |
|
1562 | 1573 | for (i = 0; i < vi->max_queue_pairs; i++) {
|
| 1574 | + xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq); |
1563 | 1575 | napi_disable(&vi->rq[i].napi);
|
1564 | 1576 | virtnet_napi_tx_disable(&vi->sq[i].napi);
|
1565 | 1577 | }
|
|
0 commit comments