Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Jun 2019 01:09:55 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r348888 - stable/12/sys/dev/oce
Message-ID:  <201906110109.x5B19tS6094704@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue Jun 11 01:09:54 2019
New Revision: 348888
URL: https://svnweb.freebsd.org/changeset/base/348888

Log:
  MFC r348332: 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.

Modified:
  stable/12/sys/dev/oce/oce_if.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/oce/oce_if.c
==============================================================================
--- stable/12/sys/dev/oce/oce_if.c	Tue Jun 11 00:59:46 2019	(r348887)
+++ stable/12/sys/dev/oce/oce_if.c	Tue Jun 11 01:09:54 2019	(r348888)
@@ -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 ||



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906110109.x5B19tS6094704>