[SRU B/D][SRU X][Unstable][PATCH 0/1] ixgbe{vf} - Physical Function gets IRQ when VF checks link state

Guilherme G. Piccoli gpiccoli at canonical.com
Tue Jul 16 20:13:41 UTC 2019

BugLink: https://bugs.launchpad.net/bugs/1836760


* Intel NICs that are SR-IOV capable and are managed by ixgbe driver presents a
potentially harmful behavior when the ixgbevf-managed VFs (Virtual Functions)
perform an ethtool link check. The ixgbevf driver issues a mailbox command in
the ethtool link state handler, which induces one IRQ in the PF (Physical
Function) per link check.

* This was reported as a sort of "denial-of-service" from a guest; due to some
link check loop running inside a guest with PCI-PT of a ixgbevf-managed VF, the
host received a huge amount of IRQs causing soft-lockups.

* The patch proposed in this SRU request fix this behavior by relying in the
saved link state (obtained in the ixgbevf's watchdog routine) instead of issuing
a mailbox command to the PF in every link state check request. The commit is
available on Linus tree:
1e1b0c658d9b ("ixgbevf: Use cached link state instead of re-reading the value for ethtool")

[Test case]

Reproducing the behavior is pretty simple; having a machine with an Intel NIC
managed by ixgbe, proceed with the following steps:

a) Create one or more VFs
(echo 1 > /sys/class/net/<PF iface>/device/sriov_numvfs)

b) In a different terminal, monitor the non-TxRx PF IRQs:
(watch -n1 "cat /proc/interrupts | grep <PF iface> | grep -v Tx")

c) Run "ethtool <VF iface>" in a loop

Without the hereby proposed patch, the PF IRQs will increase.

[Regression potential]

The patch scope is restricted to ixgbevf ethtool link-check procedure, and was
developed by the vendor itself. Being a self-contained patch affecting only this
driver's ethtool handler, the worst potential regression would be a wrong link
state report.

Alexander Duyck (1):
  ixgbevf: Use cached link state instead of re-reading the value for ethtool

 drivers/net/ethernet/intel/ixgbevf/ethtool.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)


More information about the kernel-team mailing list