Author: erj
Date: Thu Jan  2 22:47:10 2020
New Revision: 356299
URL: https://svnweb.freebsd.org/changeset/base/356299

Log:
  MFC r354344: iflib: properly release memory allocated for DMA
  
  Prevents M_DEVBUF memory from leaking due to iflib DMA allocations.
  
  Sponsored by: Intel Corporation

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   Thu Jan  2 22:44:38 2020        (r356298)
+++ stable/12/sys/net/iflib.c   Thu Jan  2 22:47:10 2020        (r356299)
@@ -1735,20 +1735,16 @@ iflib_txsd_destroy(if_ctx_t ctx, iflib_txq_t txq, int 
 {
        bus_dmamap_t map;
 
-       map = NULL;
-       if (txq->ift_sds.ifsd_map != NULL)
+       if (txq->ift_sds.ifsd_map != NULL) {
                map = txq->ift_sds.ifsd_map[i];
-       if (map != NULL) {
                bus_dmamap_sync(txq->ift_buf_tag, map, BUS_DMASYNC_POSTWRITE);
                bus_dmamap_unload(txq->ift_buf_tag, map);
                bus_dmamap_destroy(txq->ift_buf_tag, map);
                txq->ift_sds.ifsd_map[i] = NULL;
        }
 
-       map = NULL;
-       if (txq->ift_sds.ifsd_tso_map != NULL)
+       if (txq->ift_sds.ifsd_tso_map != NULL) {
                map = txq->ift_sds.ifsd_tso_map[i];
-       if (map != NULL) {
                bus_dmamap_sync(txq->ift_tso_buf_tag, map,
                    BUS_DMASYNC_POSTWRITE);
                bus_dmamap_unload(txq->ift_tso_buf_tag, map);
@@ -2158,9 +2154,6 @@ iflib_fl_bufs_free(iflib_fl_t fl)
                        bus_dmamap_unload(fl->ifl_buf_tag, sd_map);
                        if (*sd_cl != NULL)
                                uma_zfree(fl->ifl_zone, *sd_cl);
-                       // XXX: Should this get moved out?
-                       if (iflib_in_detach(fl->ifl_rxq->ifr_ctx))
-                               bus_dmamap_destroy(fl->ifl_buf_tag, sd_map);
                        if (*sd_m != NULL) {
                                m_init(*sd_m, M_NOWAIT, MT_DATA, 0);
                                uma_zfree(zone_mbuf, *sd_m);
@@ -2248,9 +2241,6 @@ iflib_rx_sds_free(iflib_rxq_t rxq)
                        if (fl->ifl_buf_tag != NULL) {
                                if (fl->ifl_sds.ifsd_map != NULL) {
                                        for (j = 0; j < fl->ifl_size; j++) {
-                                               if (fl->ifl_sds.ifsd_map[j] ==
-                                                   NULL)
-                                                       continue;
                                                bus_dmamap_sync(
                                                    fl->ifl_buf_tag,
                                                    fl->ifl_sds.ifsd_map[j],
@@ -2258,6 +2248,9 @@ iflib_rx_sds_free(iflib_rxq_t rxq)
                                                bus_dmamap_unload(
                                                    fl->ifl_buf_tag,
                                                    fl->ifl_sds.ifsd_map[j]);
+                                               bus_dmamap_destroy(
+                                                   fl->ifl_buf_tag,
+                                                   fl->ifl_sds.ifsd_map[j]);
                                        }
                                }
                                bus_dma_tag_destroy(fl->ifl_buf_tag);
@@ -5676,9 +5669,12 @@ static void
 iflib_rx_structures_free(if_ctx_t ctx)
 {
        iflib_rxq_t rxq = ctx->ifc_rxqs;
-       int i;
+       if_shared_ctx_t sctx = ctx->ifc_sctx;
+       int i, j;
 
        for (i = 0; i < ctx->ifc_softc_ctx.isc_nrxqsets; i++, rxq++) {
+               for (j = 0; j < sctx->isc_nrxqs; j++)
+                       iflib_dma_free(&rxq->ifr_ifdi[j]);
                iflib_rx_sds_free(rxq);
 #if defined(INET6) || defined(INET)
                if (if_getcapabilities(ctx->ifc_ifp) & IFCAP_LRO)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to