Author: shurd
Date: Mon Nov 19 16:40:19 2018
New Revision: 340634
URL: https://svnweb.freebsd.org/changeset/base/340634

Log:
  MFS r340629
  
  r340434:
  Fix leaks caused by ifc_nhwtxqs never being initialized (broken by r333502)
  and clear the last ring in the case where isc_nfl != isc_nrxqs
  
  r340445:
  Clear RX completion queue state variables in iflib_stop()
  
  Approved by:  re (gjb)
  Sponsored by: Limelight Networks

Modified:
  releng/12.0/sys/net/iflib.c
Directory Properties:
  releng/12.0/   (props changed)

Modified: releng/12.0/sys/net/iflib.c
==============================================================================
--- releng/12.0/sys/net/iflib.c Mon Nov 19 15:49:39 2018        (r340633)
+++ releng/12.0/sys/net/iflib.c Mon Nov 19 16:40:19 2018        (r340634)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to