Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Nov 2018 15:18:30 +0000 (UTC)
From:      Stephen Hurd <shurd@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: r340629 - stable/12/sys/net
Message-ID:  <201811191518.wAJFIUg0093136@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: shurd
Date: Mon Nov 19 15:18:30 2018
New Revision: 340629
URL: https://svnweb.freebsd.org/changeset/base/340629

Log:
  MFC r340434, r340445
  
  r340434:
  Fix leaks caused by ifc_nhwtxqs never being initialized
  
  r333502 removed initialization of ifc_nhwtxqs, and it's not clear
  there's a need to copy it into the struct iflib_ctx at all. Use
  ctx->ifc_sctx->isc_ntxqs instead.
  
  Further, iflib_stop() did not clear the last ring in the case where
  isc_nfl != isc_nrxqs (such as when IFLIB_HAS_RXCQ is set). Use
  ctx->ifc_sctx->isc_nrxqs here instead of isc_nfl.
  
  Reported by:	pkelsey
  Reviewed by:	pkelsey
  Sponsored by:	Limelight Networks
  Differential Revision:	https://reviews.freebsd.org/D17979
  
  r340445:
  Clear RX completion queue state veriables in iflib_stop()
  
  iflib_stop() was not resetting the rxq completion queue state variables.
  This meant that for any driver that has receive completion queues, after a
  reinit, iflib would start asking what's available on the rx side starting at
  whatever the completion queue index was prior to the stop, instead of at 0.
  
  Submitted by:	pkelsey
  Reported by:	pkelsey
  Sponsored by:	Limelight Networks

Modified:
  stable/12/sys/net/iflib.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/net/iflib.c
==============================================================================
--- stable/12/sys/net/iflib.c	Mon Nov 19 14:19:27 2018	(r340628)
+++ stable/12/sys/net/iflib.c	Mon Nov 19 15:18:30 2018	(r340629)
@@ -175,8 +175,6 @@ struct iflib_ctx {
 	struct sx ifc_ctx_sx;
 	struct mtx ifc_state_mtx;
 
-	uint16_t ifc_nhwtxqs;
-
 	iflib_txq_t ifc_txqs;
 	iflib_rxq_t ifc_rxqs;
 	uint32_t ifc_if_flags;
@@ -1771,6 +1769,7 @@ iflib_txq_setup(iflib_txq_t txq)
 {
 	if_ctx_t ctx = txq->ift_ctx;
 	if_softc_ctx_t scctx = &ctx->ifc_softc_ctx;
+	if_shared_ctx_t sctx = ctx->ifc_sctx;
 	iflib_dma_info_t di;
 	int i;
 
@@ -1784,11 +1783,11 @@ iflib_txq_setup(iflib_txq_t txq)
 	txq->ift_pidx = txq->ift_cidx = txq->ift_npending = 0;
 	txq->ift_size = scctx->isc_ntxd[txq->ift_br_offset];
 
-	for (i = 0, di = txq->ift_ifdi; i < ctx->ifc_nhwtxqs; i++, di++)
+	for (i = 0, di = txq->ift_ifdi; i < sctx->isc_ntxqs; i++, di++)
 		bzero((void *)di->idi_vaddr, di->idi_size);
 
 	IFDI_TXQ_SETUP(ctx, txq->ift_id);
-	for (i = 0, di = txq->ift_ifdi; i < ctx->ifc_nhwtxqs; i++, di++)
+	for (i = 0, di = txq->ift_ifdi; i < sctx->isc_ntxqs; i++, di++)
 		bus_dmamap_sync(di->idi_tag, di->idi_map,
 						BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	return (0);
@@ -2375,6 +2374,7 @@ iflib_stop(if_ctx_t ctx)
 	iflib_txq_t txq = ctx->ifc_txqs;
 	iflib_rxq_t rxq = ctx->ifc_rxqs;
 	if_softc_ctx_t scctx = &ctx->ifc_softc_ctx;
+	if_shared_ctx_t sctx = ctx->ifc_sctx;
 	iflib_dma_info_t di;
 	iflib_fl_t fl;
 	int i, j;
@@ -2408,13 +2408,14 @@ iflib_stop(if_ctx_t ctx)
 		txq->ift_no_tx_dma_setup = txq->ift_txd_encap_efbig = txq->ift_map_failed = 0;
 		txq->ift_pullups = 0;
 		ifmp_ring_reset_stats(txq->ift_br);
-		for (j = 0, di = txq->ift_ifdi; j < ctx->ifc_nhwtxqs; j++, di++)
+		for (j = 0, di = txq->ift_ifdi; j < sctx->isc_ntxqs; j++, di++)
 			bzero((void *)di->idi_vaddr, di->idi_size);
 	}
 	for (i = 0; i < scctx->isc_nrxqsets; i++, rxq++) {
 		/* make sure all transmitters have completed before proceeding XXX */
 
-		for (j = 0, di = rxq->ifr_ifdi; j < rxq->ifr_nfl; j++, di++)
+		rxq->ifr_cq_gen = rxq->ifr_cq_cidx = rxq->ifr_cq_pidx = 0;
+		for (j = 0, di = rxq->ifr_ifdi; j < sctx->isc_nrxqs; j++, di++)
 			bzero((void *)di->idi_vaddr, di->idi_size);
 		/* also resets the free lists pidx/cidx */
 		for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++)
@@ -5516,11 +5517,12 @@ static void
 iflib_tx_structures_free(if_ctx_t ctx)
 {
 	iflib_txq_t txq = ctx->ifc_txqs;
+	if_shared_ctx_t sctx = ctx->ifc_sctx;
 	int i, j;
 
 	for (i = 0; i < NTXQSETS(ctx); i++, txq++) {
 		iflib_txq_destroy(txq);
-		for (j = 0; j < ctx->ifc_nhwtxqs; j++)
+		for (j = 0; j < sctx->isc_ntxqs; j++)
 			iflib_dma_free(&txq->ift_ifdi[j]);
 	}
 	free(ctx->ifc_txqs, M_IFLIB);



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