xdp: change ndo_xdp_xmit API to support bulking
authorJesper Dangaard Brouer <brouer@redhat.com>
Thu, 24 May 2018 14:46:12 +0000 (16:46 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 25 May 2018 01:36:15 +0000 (18:36 -0700)
commit735fc4054b3a25034445c6713d259da0f96f8131
tree355f7a0672e6239fa4227d562f7d5b65fac9c011
parent389ab7f01af988c2a1ec5617eb0c7e220df1ef1c
xdp: change ndo_xdp_xmit API to support bulking

This patch change the API for ndo_xdp_xmit to support bulking
xdp_frames.

When kernel is compiled with CONFIG_RETPOLINE, XDP sees a huge slowdown.
Most of the slowdown is caused by DMA API indirect function calls, but
also the net_device->ndo_xdp_xmit() call.

Benchmarked patch with CONFIG_RETPOLINE, using xdp_redirect_map with
single flow/core test (CPU E5-1650 v4 @ 3.60GHz), showed
performance improved:
 for driver ixgbe: 6,042,682 pps -> 6,853,768 pps = +811,086 pps
 for driver i40e : 6,187,169 pps -> 6,724,519 pps = +537,350 pps

With frames avail as a bulk inside the driver ndo_xdp_xmit call,
further optimizations are possible, like bulk DMA-mapping for TX.

Testing without CONFIG_RETPOLINE show the same performance for
physical NIC drivers.

The virtual NIC driver tun sees a huge performance boost, as it can
avoid doing per frame producer locking, but instead amortize the
locking cost over the bulk.

V2: Fix compile errors reported by kbuild test robot <lkp@intel.com>
V4: Isolated ndo, driver changes and callers.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
drivers/net/ethernet/intel/i40e/i40e_txrx.c
drivers/net/ethernet/intel/i40e/i40e_txrx.h
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/tun.c
drivers/net/virtio_net.c
include/linux/netdevice.h
kernel/bpf/devmap.c
net/core/filter.c