svn commit: r348332 - head/sys/dev/oce
Alexander Motin
mav at FreeBSD.org
Tue May 28 18:32:05 UTC 2019
Author: mav
Date: Tue May 28 18:32:04 2019
New Revision: 348332
URL: https://svnweb.freebsd.org/changeset/base/348332
Log:
Fix array out of bound panic introduced in r306219.
As I see, different NICs in different configurations may have different
numbers of TX and RX queues. The code was assuming 1:1 mapping between
event queues (interrupts) and TX/RX queues. Since number of interrupts
is set to maximum of TX and RX queues, when those two are different, the
system is doomed.
I have no documentation or deep knowledge about this hardware, so this
change is based on general observations and code reading. If some of my
guesses are wrong, please do better. I just confirmed HP NC550SFP NICs
are working now.
MFC after: 2 weeks
Sponsored by: iXsystems, Inc.
Modified:
head/sys/dev/oce/oce_if.c
Modified: head/sys/dev/oce/oce_if.c
==============================================================================
--- head/sys/dev/oce/oce_if.c Tue May 28 18:05:10 2019 (r348331)
+++ head/sys/dev/oce/oce_if.c Tue May 28 18:32:04 2019 (r348332)
@@ -2394,10 +2394,20 @@ oce_eqd_set_periodic(POCE_SOFTC sc)
goto modify_eqd;
}
- rq = sc->rq[i];
- rxpkts = rq->rx_stats.rx_pkts;
- wq = sc->wq[i];
- tx_reqs = wq->tx_stats.tx_reqs;
+ if (i == 0) {
+ rq = sc->rq[0];
+ rxpkts = rq->rx_stats.rx_pkts;
+ } else
+ rxpkts = 0;
+ if (i + 1 < sc->nrqs) {
+ rq = sc->rq[i + 1];
+ rxpkts += rq->rx_stats.rx_pkts;
+ }
+ if (i < sc->nwqs) {
+ wq = sc->wq[i];
+ tx_reqs = wq->tx_stats.tx_reqs;
+ } else
+ tx_reqs = 0;
now = ticks;
if (!aic->ticks || now < aic->ticks ||
More information about the svn-src-all
mailing list