Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
40GbE Intel Wired LAN Driver Updates 2021-03-16

This series contains updates to i40e, ixgbe, and ice drivers.

Magnus Karlsson says:

Optimize run_xdp_zc() for the XDP program verdict being XDP_REDIRECT
in the xsk zero-copy path. This path is only used when having AF_XDP
zero-copy on and in that case most packets will be directed to user
space. This provides around 100k extra packets in throughput on my
server when running l2fwd in xdpsock.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+22 -12
+7 -4
drivers/net/ethernet/intel/i40e/i40e_xsk.c
··· 160 160 xdp_prog = READ_ONCE(rx_ring->xdp_prog); 161 161 act = bpf_prog_run_xdp(xdp_prog, xdp); 162 162 163 + if (likely(act == XDP_REDIRECT)) { 164 + err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 165 + result = !err ? I40E_XDP_REDIR : I40E_XDP_CONSUMED; 166 + rcu_read_unlock(); 167 + return result; 168 + } 169 + 163 170 switch (act) { 164 171 case XDP_PASS: 165 172 break; 166 173 case XDP_TX: 167 174 xdp_ring = rx_ring->vsi->xdp_rings[rx_ring->queue_index]; 168 175 result = i40e_xmit_xdp_tx_ring(xdp, xdp_ring); 169 - break; 170 - case XDP_REDIRECT: 171 - err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 172 - result = !err ? I40E_XDP_REDIR : I40E_XDP_CONSUMED; 173 176 break; 174 177 default: 175 178 bpf_warn_invalid_xdp_action(act);
+8 -4
drivers/net/ethernet/intel/ice/ice_xsk.c
··· 473 473 xdp_prog = READ_ONCE(rx_ring->xdp_prog); 474 474 475 475 act = bpf_prog_run_xdp(xdp_prog, xdp); 476 + 477 + if (likely(act == XDP_REDIRECT)) { 478 + err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 479 + result = !err ? ICE_XDP_REDIR : ICE_XDP_CONSUMED; 480 + rcu_read_unlock(); 481 + return result; 482 + } 483 + 476 484 switch (act) { 477 485 case XDP_PASS: 478 486 break; 479 487 case XDP_TX: 480 488 xdp_ring = rx_ring->vsi->xdp_rings[rx_ring->q_index]; 481 489 result = ice_xmit_xdp_buff(xdp, xdp_ring); 482 - break; 483 - case XDP_REDIRECT: 484 - err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 485 - result = !err ? ICE_XDP_REDIR : ICE_XDP_CONSUMED; 486 490 break; 487 491 default: 488 492 bpf_warn_invalid_xdp_action(act);
+7 -4
drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
··· 104 104 xdp_prog = READ_ONCE(rx_ring->xdp_prog); 105 105 act = bpf_prog_run_xdp(xdp_prog, xdp); 106 106 107 + if (likely(act == XDP_REDIRECT)) { 108 + err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 109 + result = !err ? IXGBE_XDP_REDIR : IXGBE_XDP_CONSUMED; 110 + rcu_read_unlock(); 111 + return result; 112 + } 113 + 107 114 switch (act) { 108 115 case XDP_PASS: 109 116 break; ··· 121 114 break; 122 115 } 123 116 result = ixgbe_xmit_xdp_ring(adapter, xdpf); 124 - break; 125 - case XDP_REDIRECT: 126 - err = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog); 127 - result = !err ? IXGBE_XDP_REDIR : IXGBE_XDP_CONSUMED; 128 117 break; 129 118 default: 130 119 bpf_warn_invalid_xdp_action(act);