xdp-project / xdp-tutorial

XDP tutorial
2.49k stars 579 forks source link

AF_XDP zero copy - Operation not supported error #127

Open sadsiddi opened 4 years ago

sadsiddi commented 4 years ago

Hi, I am trying to enable AF_XDP zero copy mode and i see the error in Cent OS 8(kernel 4.18), but SKB mode and DRV mode with copy works fine. The driver is ixgbe 5.6.5 which supports AF_XDP zero copy as per the documentation. strace shows the failure is during bind ./af_xdp_user -d eth2 -z -q 1

bind(3, {safamily=0x2c /* AF??? */, sa_data="\4\0006\1\0\0\0\0\0\0\0\0\0\0"}, 16) = -1 EOPNOTSUPP (Operation not supported)

The ethtool shows i have combined queues and not separate rx/tx queues. Is that a problem? [root@localhost ~]# ethtool -l eth2 Channel parameters for eth2: Pre-set maximums: RX: 0 TX: 0 Other: 1 Combined: 63 Current hardware settings: RX: 0 TX: 0 Other: 1 Combined: 9

[root@localhost ~]# ethtool -i eth2 driver: ixgbe version: 5.6.5 firmware-version: 0x61c10001 expansion-rom-version: bus-info: 0000:00:06.0 supports-statistics: yes supports-test: yes supports-eeprom-access: yes supports-register-dump: yes supports-priv-flags: yes

Any ideas what is missing?

Thank you Saddique

chaudron commented 4 years ago

Did a quick test here on my setup which is an older 5.4.0 bpf-next kernel, and an older ixgbe driver but it works fine here, even with not combining the queues (this should only result in not receiving all traffic).

Channel parameters for eno2:
Pre-set maximums:
RX:     0
TX:     0
Other:      1
Combined:   63
Current hardware settings:
RX:     0
TX:     0
Other:      1
Combined:   28

ethtool -i eno2
driver: ixgbe
version: 5.1.0-k
firmware-version: 0x800007f4, 17.5.10
expansion-rom-version: 
bus-info: 0000:01:00.1
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

Does it work without zero copy?

Looking at the kernel code, I see the following in xdp_umem_assign_dev():

130     if (!dev->netdev_ops->ndo_bpf || !dev->netdev_ops->ndo_xsk_wakeup) {
131         err = -EOPNOTSUPP;
132         goto err_unreg_umem;
133     }

So it looks like a drive operation not being supported. Check the driver to make sure both functions are registered and supported.

sadsiddi commented 4 years ago

Thanks for your reply. The skb mode and driver mode with copy works fine for the same nic/driver. drvmode with copy: bind(3, {safamily=0x2c /* AF??? */, sa_data="\2\0006\1\0\0\0\0\0\0\0\0\0\0"}, 16) = 0

The driver 5.6.5 from intel clearly mentions that this Zero-copy is supported from Kernel 4.18

"This driver supports XDP (Express Data Path) on kernel 4.14 and later. Note that XDP is blocked for frame sizes larger than 3KB. This driver supports AF_XDP zero-copy on kernel 4.18 and later"

Can i dump anything which can tell if ndo_bpf is not registered?