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