linux/drivers/net/ethernet
Arthur Kiyanovski e02ae6ed51 net: ena: fix request of incorrect number of IRQ vectors
Bug:
In short the main issue is caused by the fact that the number of queues
is changed using ethtool after ena_probe() has been called and before
ena_up() was executed. Here is the full scenario in detail:

* ena_probe() is called when the driver is loaded, the driver is not up
  yet at the end of ena_probe().
* The number of queues is changed -> io_queue_count is changed as well -
  ena_up() is not called since the "dev_was_up" boolean in
  ena_update_queue_count() is false.
* ena_up() is called by the kernel (it's called asynchronously some
  time after ena_probe()). ena_setup_io_intr() is called by ena_up() and
  it uses io_queue_count to get the suitable irq lines for each msix
  vector. The function ena_request_io_irq() is called right after that
  and it uses msix_vecs - This value only changes during ena_probe() and
  ena_restore() - to request the irq vectors. This results in "Failed to
  request I/O IRQ" error for i > io_queue_count.

Numeric example:
* After ena_probe() io_queue_count = 8, msix_vecs = 9.
* The number of queues changes to 4 -> io_queue_count = 4, msix_vecs = 9.
* ena_up() is executed for the first time:
  ** ena_setup_io_intr() inits the vectors only up to io_queue_count.
  ** ena_request_io_irq() calls request_irq() and fails for i = 5.

How to reproduce:
simply run the following commands:
    sudo rmmod ena && sudo insmod ena.ko;
    sudo ethtool -L eth1 combined 3;

Fix:
Use ENA_MAX_MSIX_VEC(adapter->num_io_queues + adapter->xdp_num_queues)
instead of adapter->msix_vecs. We need to take XDP queues into
consideration as they need to have msix vectors assigned to them as well.
Note that the XDP cannot be attached before the driver is up and running
but in XDP mode the issue might occur when the number of queues changes
right after a reset trigger.
The ENA_MAX_MSIX_VEC simply adds one to the argument since the first msix
vector is reserved for management queue.

Fixes: 1738cd3ed3 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
Signed-off-by: Sameeh Jubran <sameehj@amazon.com>
Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-03-17 21:24:23 -07:00
..
3com net: 3com: 3c59x: remove set but not used variable 'mii_reg1' 2020-01-08 12:40:03 -08:00
8390 netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
adaptec netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
aeroflex
agere net: convert suitable network drivers to use phy_do_ioctl 2020-01-21 10:50:41 +01:00
alacritech remove ioremap_nocache and devm_ioremap_nocache 2020-01-06 09:45:59 +01:00
allwinner net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
alteon netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
altera remove ioremap_nocache and devm_ioremap_nocache 2020-01-06 09:45:59 +01:00
amazon net: ena: fix request of incorrect number of IRQ vectors 2020-03-17 21:24:23 -07:00
amd Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
apm drivers: net: xgene: Fix the order of the arguments of 'alloc_etherdev_mqs()' 2020-01-27 11:23:13 +01:00
apple netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
aquantia net: atlantic: fix out of range usage of active_vlans array 2020-02-16 19:03:40 -08:00
arc net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
atheros Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
aurora net: convert additional drivers to use phy_do_ioctl 2020-01-22 21:16:32 +01:00
broadcom net: bcmgenet: keep MAC in reset until PHY is up 2020-03-17 21:00:15 -07:00
brocade Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
cadence net: macb: Properly handle phylink on at91rm9200 2020-02-20 15:00:31 -08:00
calxeda netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
cavium net: thunderx: workaround BGX TX Underflow issue 2020-02-20 15:49:20 -08:00
chelsio cxgb4: fix delete filter entry fail in unload path 2020-03-15 00:12:33 -07:00
cirrus netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
cisco enic: prevent waking up stopped tx queues over watchdog reset 2020-02-12 09:43:26 -08:00
cortina Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2019-12-22 15:15:05 -08:00
davicom net: ethernet: dm9000: Handle -EPROBE_DEFER in dm9000_parse_dt() 2020-02-16 20:01:43 -08:00
dec net: ethernet: dec: tulip: Fix length mask in receive length calculation 2020-02-05 14:21:31 +01:00
dlink netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
emulex Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2019-12-22 15:15:05 -08:00
ezchip
faraday net: convert suitable network drivers to use phy_do_ioctl 2020-01-21 10:50:41 +01:00
freescale net: fsl/fman: treat all RGMII modes in memac_adjust_link() 2020-03-16 14:58:32 -07:00
fujitsu netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
google Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-01-09 12:13:43 -08:00
hisilicon net: hns3: clear port base VLAN when unload PF 2020-03-12 11:38:26 -07:00
huawei hinic: fix a bug of rss configuration 2020-02-27 11:08:01 -08:00
i825xx Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
ibm ibmvnic: Do not process device remove during device reset 2020-03-10 15:50:42 -07:00
intel ice: Wait for VF to be reset/ready before configuration 2020-02-19 11:50:41 -08:00
marvell net: mvmdio: avoid error message for optional IRQ 2020-03-17 20:54:37 -07:00
mediatek netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
mellanox net: mlx4: Use scnprintf() for avoiding potential buffer overflow 2020-03-15 17:06:22 -07:00
micrel net: ks8851-ml: Fix IRQ handling and locking 2020-02-23 20:53:42 -08:00
microchip net: Introduce peer to peer one step PTP time stamping. 2019-12-25 19:51:34 -08:00
moxa
mscc net: mscc: ocelot: properly account for VLAN header length when setting MRU 2020-03-09 18:58:17 -07:00
myricom net: myri10ge: use skb_list_walk_safe helper for gso segments 2020-01-08 15:19:55 -08:00
natsemi Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
neterion net: vxge: fix wrong __VA_ARGS__ usage 2020-03-16 15:03:59 -07:00
netronome net: nfp: Use scnprintf() for avoiding potential buffer overflow 2020-03-15 17:06:22 -07:00
ni
nvidia netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
nxp net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
oki-semi Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2019-12-22 15:15:05 -08:00
packetengines netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
pasemi
pensando net: ionic: Use scnprintf() for avoiding potential buffer overflow 2020-03-15 17:06:22 -07:00
qlogic qede: Fix race between rdma destroy workqueue and link change event 2020-02-18 12:05:53 -08:00
qualcomm net: rmnet: fix packet forwarding in rmnet bridge mode 2020-02-27 11:45:07 -08:00
rdc net: convert suitable network drivers to use phy_do_ioctl 2020-01-21 10:50:41 +01:00
realtek r8169: fix performance regression related to PCIe max read request size 2020-02-06 14:17:44 +01:00
renesas net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
rocker ipv4: Remove old route notifications and convert listeners 2019-12-16 16:14:43 -08:00
samsung sxgbe: Fix off by one in samsung driver strncpy size arg 2020-03-11 23:07:34 -07:00
seeq netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
sfc net: sfc: Use scnprintf() for avoiding potential buffer overflow 2020-03-15 17:06:22 -07:00
sgi net: sgi: ioc3-eth: Remove leftover free_irq() 2020-02-05 13:53:54 +01:00
silan netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
sis netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
smsc Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
socionext net: ethernet: ave: Add capability of rgmii-id mode 2020-02-12 09:55:04 -08:00
stmicro net: stmmac: platform: Fix misleading interrupt error msg 2020-03-14 21:00:28 -07:00
sun sunvnet: use icmp_ndo_send helper 2020-02-13 14:19:00 -08:00
synopsys netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
tehuti
ti Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
toshiba net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
tundra
via via-velocity: allow nesting of ethtool_ops begin() and complete() 2020-01-06 13:54:55 -08:00
wiznet netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
xilinx net: ll_temac: Handle DMA halt condition caused by buffer underrun 2020-02-24 10:58:48 -08:00
xircom netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
xscale net: ethernet: ixp4xx: Use parent dev for DMA pool 2020-01-12 12:59:53 -08:00
dnet.c net: convert suitable drivers to use phy_do_ioctl_running 2020-01-23 10:49:30 +01:00
dnet.h
ec_bhf.c
ethoc.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
fealnx.c netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
jme.c netdev: pass the stuck queue to the timeout handler 2019-12-12 21:38:57 -08:00
jme.h
Kconfig
korina.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
lantiq_etop.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-01-28 16:02:33 -08:00
lantiq_xrx200.c
Makefile