On 16-11-21 03:45 AM, Daniel Borkmann wrote: > On 11/20/2016 03:51 AM, John Fastabend wrote: >> XDP requires using isolated transmit queues to avoid interference >> with normal networking stack (BQL, NETDEV_TX_BUSY, etc). This patch >> adds a XDP queue per cpu when a XDP program is loaded and does not >> expose the queues to the OS via the normal API call to >> netif_set_real_num_tx_queues(). This way the stack will never push >> an skb to these queues. >> >> However virtio/vhost/qemu implementation only allows for creating >> TX/RX queue pairs at this time so creating only TX queues was not >> possible. And because the associated RX queues are being created I >> went ahead and exposed these to the stack and let the backend use >> them. This creates more RX queues visible to the network stack than >> TX queues which is worth mentioning but does not cause any issues as >> far as I can tell. >> >> Signed-off-by: John Fastabend <john.r.fastab...@intel.com> >> ---
[...] >> } >> >> + curr_qp = vi->curr_queue_pairs - vi->xdp_queue_pairs; >> + if (prog) >> + xdp_qp = nr_cpu_ids; >> + >> + /* XDP requires extra queues for XDP_TX */ >> + if (curr_qp + xdp_qp > vi->max_queue_pairs) { >> + netdev_warn(dev, "request %i queues but max is %i\n", >> + curr_qp + xdp_qp, vi->max_queue_pairs); >> + return -ENOMEM; >> + } >> + >> + err = virtnet_set_queues(vi, curr_qp + xdp_qp); >> + if (err) { >> + dev_warn(&dev->dev, "XDP Device queue allocation failure.\n"); >> + return err; >> + } >> + >> if (prog) { >> - prog = bpf_prog_add(prog, vi->max_queue_pairs - 1); >> - if (IS_ERR(prog)) >> + prog = bpf_prog_add(prog, vi->max_queue_pairs); > > I think this change is not correct, it would be off by one now. > The previous 'vi->max_queue_pairs - 1' was actually correct here. > dev_change_xdp_fd() already gives you a reference (see the doc on > enum xdp_netdev_command in netdevice.h). Right, this was an error thanks for checking it I'll send a v3. And maybe draft a test for XDP ref counting to test it in the future. .John