1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00
linux/drivers/net
Ivan Vecera ea558de723 i40e: Enforce software interrupt during busy-poll exit
As for ice bug fixed by commit b7306b42be ("ice: manage interrupts
during poll exit") followed by commit 23be7075b3 ("ice: fix software
generating extra interrupts") I'm seeing the similar issue also with
i40e driver.

In certain situation when busy-loop is enabled together with adaptive
coalescing, the driver occasionally misses that there are outstanding
descriptors to clean when exiting busy poll.

Try to catch the remaining work by triggering a software interrupt
when exiting busy poll. No extra interrupts will be generated when
busy polling is not used.

The issue was found when running sockperf ping-pong tcp test with
adaptive coalescing and busy poll enabled (50 as value busy_pool
and busy_read sysctl knobs) and results in huge latency spikes
with more than 100000us.

The fix is inspired from the ice driver and do the following:
1) During napi poll exit in case of busy-poll (napo_complete_done()
   returns false) this is recorded to q_vector that we were in busy
   loop.
2) Extends i40e_buildreg_itr() to be able to add an enforced software
   interrupt into built value
2) In i40e_update_enable_itr() enforces a software interrupt trigger
   if we are exiting busy poll to catch any pending clean-ups
3) Reuses unused 3rd ITR (interrupt throttle) index and set it to
   20K interrupts per second to limit the number of these sw interrupts.

Test results
============
Prior:
[root@dell-per640-07 net]# sockperf ping-pong -i 10.9.9.1 --tcp -m 1000 --mps=max -t 120
sockperf: == version #3.10-no.git ==
sockperf[CLIENT] send on:sockperf: using recvfrom() to block on socket(s)

[ 0] IP = 10.9.9.1        PORT = 11111 # TCP
sockperf: Warmup stage (sending a few dummy messages)...
sockperf: Starting test...
sockperf: Test end (interrupted by timer)
sockperf: Test ended
sockperf: [Total Run] RunTime=119.999 sec; Warm up time=400 msec; SentMessages=2438563; ReceivedMessages=2438562
sockperf: ========= Printing statistics for Server No: 0
sockperf: [Valid Duration] RunTime=119.549 sec; SentMessages=2429473; ReceivedMessages=2429473
sockperf: ====> avg-latency=24.571 (std-dev=93.297, mean-ad=4.904, median-ad=1.510, siqr=1.063, cv=3.797, std-error=0.060, 99.0% ci=[24.417, 24.725])
sockperf: # dropped messages = 0; # duplicated messages = 0; # out-of-order messages = 0
sockperf: Summary: Latency is 24.571 usec
sockperf: Total 2429473 observations; each percentile contains 24294.73 observations
sockperf: ---> <MAX> observation = 103294.331
sockperf: ---> percentile 99.999 =   45.633
sockperf: ---> percentile 99.990 =   37.013
sockperf: ---> percentile 99.900 =   35.910
sockperf: ---> percentile 99.000 =   33.390
sockperf: ---> percentile 90.000 =   28.626
sockperf: ---> percentile 75.000 =   27.741
sockperf: ---> percentile 50.000 =   26.743
sockperf: ---> percentile 25.000 =   25.614
sockperf: ---> <MIN> observation =   12.220

After:
[root@dell-per640-07 net]# sockperf ping-pong -i 10.9.9.1 --tcp -m 1000 --mps=max -t 120
sockperf: == version #3.10-no.git ==
sockperf[CLIENT] send on:sockperf: using recvfrom() to block on socket(s)

[ 0] IP = 10.9.9.1        PORT = 11111 # TCP
sockperf: Warmup stage (sending a few dummy messages)...
sockperf: Starting test...
sockperf: Test end (interrupted by timer)
sockperf: Test ended
sockperf: [Total Run] RunTime=119.999 sec; Warm up time=400 msec; SentMessages=2400055; ReceivedMessages=2400054
sockperf: ========= Printing statistics for Server No: 0
sockperf: [Valid Duration] RunTime=119.549 sec; SentMessages=2391186; ReceivedMessages=2391186
sockperf: ====> avg-latency=24.965 (std-dev=5.934, mean-ad=4.642, median-ad=1.485, siqr=1.067, cv=0.238, std-error=0.004, 99.0% ci=[24.955, 24.975])
sockperf: # dropped messages = 0; # duplicated messages = 0; # out-of-order messages = 0
sockperf: Summary: Latency is 24.965 usec
sockperf: Total 2391186 observations; each percentile contains 23911.86 observations
sockperf: ---> <MAX> observation =  195.841
sockperf: ---> percentile 99.999 =   45.026
sockperf: ---> percentile 99.990 =   39.009
sockperf: ---> percentile 99.900 =   35.922
sockperf: ---> percentile 99.000 =   33.482
sockperf: ---> percentile 90.000 =   28.902
sockperf: ---> percentile 75.000 =   27.821
sockperf: ---> percentile 50.000 =   26.860
sockperf: ---> percentile 25.000 =   25.685
sockperf: ---> <MIN> observation =   12.277

Fixes: 0bcd952fee ("ethernet/intel: consolidate NAPI and NAPI exit")
Reported-by: Hugo Ferreira <hferreir@redhat.com>
Reviewed-by: Michal Schmidt <mschmidt@redhat.com>
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2024-03-26 08:34:40 -07:00
..
arcnet Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-15 16:20:04 -08:00
bonding Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
caif
can can: kvaser_pciefd: Add additional Xilinx interrupts 2024-03-19 15:26:01 +01:00
dsa net: dsa: mt7530: fix improper frames on all 25MHz and 40MHz XTAL MT7530 2024-03-26 09:17:33 +01:00
ethernet i40e: Enforce software interrupt during busy-poll exit 2024-03-26 08:34:40 -07:00
fddi net: fill in MODULE_DESCRIPTION()s for fddik/skfp 2024-02-15 08:03:46 -08:00
fjes fjes: fix memleaks in fjes_hw_setup 2024-01-24 18:03:53 -08:00
hamradio
hippi
hyperv hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed 2024-02-04 13:38:08 +00:00
ieee802154 spi: Updates for v6.9 2024-03-13 11:07:37 -07:00
ipa Power management updates for 6.9-rc1 2024-03-13 11:40:06 -07:00
ipvlan rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
mctp
mdio net: phy: mdio-bcm-unimac: Add asp v2.2 support 2024-03-01 09:22:50 +00:00
netdevsim netdevsim: add ndo_get_iflink() implementation 2024-03-01 10:43:10 +00:00
pcs net: pcs: rzn1-miic: update PCS driver to use neg_mode 2024-03-07 20:49:14 -08:00
phy net: phy: fix phy_read_poll_timeout argument type in genphy_loopback 2024-03-19 16:09:34 +01:00
plip net: fill in MODULE_DESCRIPTION()s for plip 2024-02-15 08:03:46 -08:00
ppp - Kuan-Wei Chiu has developed the well-named series "lib min_heap: Min 2024-03-14 18:03:09 -07:00
pse-pd
slip net: fill in MODULE_DESCRIPTION()s for SLIP 2024-01-11 16:16:08 -08:00
team net: team: Don't bother filling in ethtool driver version 2024-02-23 18:03:53 -08:00
thunderbolt
usb Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-11 20:38:36 -07:00
vmxnet3 vmxnet3: Fix missing reserved tailroom 2024-03-14 12:46:24 +01:00
vxlan vxlan: Remove generic .ndo_get_stats64 2024-03-11 16:01:06 -07:00
wan net: wan: fsl_qmc_hdlc: Fix module compilation 2024-03-18 09:25:58 +00:00
wireguard wireguard: netlink: access device through ctx instead of peer 2024-03-19 11:22:50 +01:00
wireless Thermal control updates for 6.9-rc1 2024-03-13 12:03:57 -07:00
wwan net: wwan: t7xx: Split 64bit accesses to fix alignment issues 2024-03-25 19:51:57 -07:00
xen-netback net: fill in MODULE_DESCRIPTION()s for xen-netback 2024-02-15 08:03:45 -08:00
amt.c net: amt: Remove generic .ndo_get_stats64 2024-03-11 15:16:13 -07:00
bareudp.c net: bareudp: Remove generic .ndo_get_stats64 2024-03-04 08:55:44 +00:00
dummy.c net/dummy: Move stats allocation to core 2024-02-21 11:20:56 +00:00
eql.c
geneve.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
gtp.c net: gtp: Move net_device assigned in setup 2024-03-06 20:37:18 -08:00
ifb.c
Kconfig
LICENSE.SRC
loopback.c net: add netdev_lockdep_set_classes() to virtual drivers 2024-02-13 18:45:06 -08:00
macsec.c net: macsec: Leverage core stats allocator 2024-03-06 20:36:21 -08:00
macvlan.c rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
macvtap.c
Makefile
mdio.c
mhi_net.c
mii.c
net_failover.c
netconsole.c net: netconsole: Add continuation line prefix to userdata messages 2024-03-11 14:07:57 -07:00
netkit.c rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
nlmon.c net: nlmon: Simplify nlmon_get_stats64 2024-03-04 10:18:02 +00:00
ntb_netdev.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c
tun.c net: introduce include/net/rps.h 2024-03-07 21:12:43 -08:00
veth.c net: veth: do not manipulate GRO when using XDP 2024-03-18 12:25:52 +00:00
virtio_net.c virtio_net: rename free_old_xmit_skbs to free_old_xmit 2024-03-19 03:19:22 -04:00
vrf.c
vsockmon.c net/vsockmon: Do not set zeroed statistics 2024-02-26 18:39:10 -08:00
xen-netfront.c