1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00
linux/drivers/net/ethernet
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
..
3com 3c589_cs: Fix an error handling path in tc589_probe() 2023-05-22 19:17:58 -07:00
8390 net: fill in MODULE_DESCRIPTION()s for 8390 2024-01-24 15:12:20 -08:00
actions net: ethernet: actions: Convert to platform remove callback returning void 2023-09-20 09:06:37 +01:00
adaptec
adi Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-29 14:24:56 -08:00
aeroflex net: ethernet: aeroflex: Convert to platform remove callback returning void 2023-09-20 09:06:37 +01:00
agere et131x: Use pci_dev_id() to simplify the code 2023-08-13 12:30:39 +01:00
alacritech net: ethernet: slicoss: remove redundant increment of pointer data 2023-07-28 15:37:08 -07:00
allwinner net: ethernet: allwinner: Convert to platform remove callback returning void 2023-09-20 09:06:37 +01:00
alteon
altera net: ethernet: Use device_get_match_data() 2023-10-13 10:04:53 +01:00
amazon net: ena: Remove ena_select_queue 2024-02-18 19:47:45 +00:00
amd Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
apm Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2023-10-26 13:46:28 -07:00
apple powerpc/macio: Make remove callback of macio driver void returned 2024-03-07 23:06:19 +11:00
aquantia net: atlantic: convert EEE handling to use linkmode bitmaps 2024-02-09 12:55:46 -08:00
arc net: ethernet: arc: Convert to platform remove callback returning void 2023-09-20 09:06:37 +01:00
asix net: asix: fix fortify warning 2023-12-12 13:20:37 -08:00
atheros ethernet: atheros: fix a memleak in atl1e_setup_ring_resources 2023-12-15 10:55:35 +00:00
broadcom Including fixes from CAN, netfilter, wireguard and IPsec. 2024-03-21 14:50:39 -07:00
brocade bnad: fix work_queue type mismatch 2024-02-14 12:49:47 +00:00
cadence net: macb: Convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() 2023-11-18 14:52:57 +00:00
calxeda net: ethernet: calxeda: Convert to platform remove callback returning void 2023-09-20 09:06:38 +01:00
cavium net: fill in MODULE_DESCRIPTION()s for liquidio 2024-01-24 15:12:20 -08:00
chelsio Thermal control updates for 6.9-rc1 2024-03-13 12:03:57 -07:00
cirrus net: fill in MODULE_DESCRIPTION()s for ep93xxx_eth 2024-01-24 15:12:20 -08:00
cisco Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-22 15:29:26 -08:00
cortina net: ethernet: cortina: Drop TSO support 2024-01-07 16:05:00 +00:00
davicom net: ethernet: davicom: Convert to platform remove callback returning void 2023-09-20 09:06:38 +01:00
dec net: tulip: Annotate struct mediatable with __counted_by 2023-10-02 11:24:55 -07:00
dlink net: dl2k: Use proper conversion of dev_addr before IO to device 2023-12-12 11:25:36 +01:00
emulex net: ethtool: pass a pointer to parameters to get/set_rxfh ethtool ops 2023-12-13 22:07:16 -08:00
engleder Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-08 15:30:33 -08:00
ezchip net: fill in MODULE_DESCRIPTION()s for nps_enet 2024-01-24 15:12:20 -08:00
faraday net: ethernet: faraday: Convert to platform remove callback returning void 2023-09-20 09:06:38 +01:00
freescale net: fec: Fixup EEE 2024-03-05 19:21:17 -08:00
fujitsu
fungible net: ethtool: pass a pointer to parameters to get/set_rxfh ethtool ops 2023-12-13 22:07:16 -08:00
google net: introduce page_frag_cache_drain() 2024-03-05 11:38:14 +01:00
hisilicon net: hns3: mark unexcuted loopback test result as UNEXECUTED 2024-03-26 15:32:39 +01:00
huawei net: ethtool: pass a pointer to parameters to get/set_rxfh ethtool ops 2023-12-13 22:07:16 -08:00
i825xx net/sun3_82586: Avoid reading past buffer in debug output 2024-02-08 18:41:10 -08:00
ibm mm, treewide: rename MAX_ORDER to MAX_PAGE_ORDER 2024-01-08 15:27:15 -08:00
intel i40e: Enforce software interrupt during busy-poll exit 2024-03-26 08:34:40 -07:00
litex net: fill in MODULE_DESCRIPTION()s for litex 2024-01-24 15:12:21 -08:00
marvell octeontx2-af: Use separate handlers for interrupts 2024-03-20 10:49:07 +00:00
mediatek net: ethernet: mtk_eth_soc: fix PPE hanging issue 2024-03-15 14:03:45 +00:00
mellanox mlxbf_gige: stop PHY during open() error paths 2024-03-25 11:05:21 +00:00
micrel net: ks8851: Follow renaming of SPI "master" to "controller" 2024-02-08 11:54:45 +00:00
microchip Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
microsoft net: mana: Assigning IRQ affinity on HT cores 2024-02-01 13:06:40 +01:00
moxa net: ethernet: moxa:: Convert to platform remove callback returning void 2023-09-20 09:06:39 +01:00
mscc net: ocelot: update the MODULE_DESCRIPTION() 2024-02-05 12:35:18 +00:00
myricom net: move gso declarations and functions to their own files 2023-06-10 00:11:41 -07:00
natsemi net: ethernet: natsemi: Convert to platform remove callback returning void 2023-09-20 09:06:40 +01:00
neterion net: fill in MODULE_DESCRIPTION()s for s2io 2024-01-11 16:16:08 -08:00
netronome Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-11 20:38:36 -07:00
ni netdev: replace napi_reschedule with napi_schedule 2023-10-11 17:28:06 -07:00
nvidia net: remove stale mentions of dev_base_lock in comments 2024-02-14 11:20:13 +00:00
nxp net: ethernet: nxp: Convert to platform remove callback returning void 2023-09-20 09:06:40 +01:00
oki-semi net: pch_gbe: Allow build on MIPS_GENERIC kernel 2023-06-08 19:18:32 -07:00
packetengines
pasemi
pensando ionic: keep stats struct local to error handling 2024-03-08 11:54:35 +00:00
qlogic net: adopt skb_network_offset() and similar helpers 2024-03-04 08:47:06 +00:00
qualcomm TTY/Serial driver update for 6.9-rc1 2024-03-21 12:44:10 -07:00
rdc
realtek r8169: switch to new function phy_support_eee 2024-03-11 13:46:58 -07:00
renesas ravb: Correct buffer size to map for R-Car Rx 2024-03-11 15:16:57 -07:00
rocker rocker: Don't bother filling in ethtool driver version 2024-02-23 18:03:53 -08:00
samsung net: sxgbe: remove eee_enabled/eee_active in sxgbe_get_eee() 2024-02-07 09:03:37 -08:00
seeq net: ethernet: seeq: Convert to platform remove callback returning void 2023-09-20 09:06:40 +01:00
sfc net: introduce include/net/rps.h 2024-03-07 21:12:43 -08:00
sgi net: ethernet: sgi: Convert to platform remove callback returning void 2023-09-20 09:06:40 +01:00
silan
sis
smsc net: fill in MODULE_DESCRIPTION()s for SMSC drivers 2024-01-29 12:12:51 +00:00
socionext eth: link netdev to page_pools in drivers 2023-11-28 15:48:39 +01:00
stmicro Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-29 14:24:56 -08:00
sun - Kuan-Wei Chiu has developed the well-named series "lib min_heap: Min 2024-03-14 18:03:09 -07:00
sunplus net: ethernet: sunplus: Convert to platform remove callback returning void 2023-09-20 09:06:41 +01:00
synopsys
tehuti
ti Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
toshiba Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-29 14:24:56 -08:00
tundra net: ethernet: tundra: Convert to platform remove callback returning void 2023-09-20 09:06:41 +01:00
vertexcom net: vertexcom: mse102x: Follow renaming of SPI "master" to "controller" 2024-02-08 11:54:46 +00:00
via net: ethernet: via: Convert to platform remove callback returning void 2023-09-20 09:06:41 +01:00
wangxun net: txgbe: fix clk_name exceed MAX_DEV_ID limits 2024-03-14 13:49:02 +01:00
wiznet ethernet: wiznet: Use devm_platform_get_and_ioremap_resource() in w5300_hw_probe() 2024-02-09 12:27:36 -08:00
xilinx net: ll_temac: platform_get_resource replaced by wrong function 2024-03-25 19:46:56 -07:00
xircom xirc2ps_cs: remove redundant assignment to variable okay, clean up freespace 2024-02-08 19:04:28 -08:00
xscale net: xscale: Drop unused PHY number 2023-11-01 22:15:15 -07:00
dnet.c net: ethernet: dnet: Convert to platform remove callback returning void 2023-09-20 09:06:38 +01:00
dnet.h
ec_bhf.c net: fill in MODULE_DESCRIPTION()s for ec_bhf 2024-01-29 12:12:51 +00:00
ethoc.c net: ethernet: ethoc: Convert to platform remove callback returning void 2023-09-20 09:06:38 +01:00
fealnx.c
jme.c
jme.h
Kconfig net: ethernet: remove duplicated CONFIG_SUNGEM_PHY entry 2024-02-07 13:17:51 +00:00
korina.c net: ethernet: korina: Convert to platform remove callback returning void 2023-09-20 09:06:39 +01:00
lantiq_etop.c net: ethernet: lantiq_etop: Convert to platform remove callback returning void 2023-09-20 09:06:39 +01:00
lantiq_xrx200.c net: ethernet: lantiq_xrx200: Convert to platform remove callback returning void 2023-09-20 09:06:39 +01:00
Makefile