Author: sbruno
Date: Wed Apr  5 19:52:49 2017
New Revision: 316541
URL: https://svnweb.freebsd.org/changeset/base/316541

Log:
  Fix a double free in ixgbe_rxeof()
  
  Submitted by: rstone
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D10255

Modified:
  head/sys/dev/ixgbe/ix_txrx.c

Modified: head/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- head/sys/dev/ixgbe/ix_txrx.c        Wed Apr  5 19:46:24 2017        
(r316540)
+++ head/sys/dev/ixgbe/ix_txrx.c        Wed Apr  5 19:52:49 2017        
(r316541)
@@ -1431,20 +1431,10 @@ fail:
 
 static void     
 ixgbe_free_receive_ring(struct rx_ring *rxr)
-{ 
-       struct ixgbe_rx_buf       *rxbuf;
+{
 
        for (int i = 0; i < rxr->num_desc; i++) {
-               rxbuf = &rxr->rx_buffers[i];
-               if (rxbuf->buf != NULL) {
-                       bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
-                           BUS_DMASYNC_POSTREAD);
-                       bus_dmamap_unload(rxr->ptag, rxbuf->pmap);
-                       rxbuf->buf->m_flags |= M_PKTHDR;
-                       m_freem(rxbuf->buf);
-                       rxbuf->buf = NULL;
-                       rxbuf->flags = 0;
-               }
+               ixgbe_rx_discard(rxr, i);
        }
 }
 
@@ -1596,7 +1586,9 @@ fail:
         */
        for (int i = 0; i < j; ++i) {
                rxr = &adapter->rx_rings[i];
+               IXGBE_RX_LOCK(rxr);
                ixgbe_free_receive_ring(rxr);
+               IXGBE_RX_UNLOCK(rxr);
        }
 
        return (ENOBUFS);
@@ -1645,14 +1637,7 @@ ixgbe_free_receive_buffers(struct rx_rin
        if (rxr->rx_buffers != NULL) {
                for (int i = 0; i < adapter->num_rx_desc; i++) {
                        rxbuf = &rxr->rx_buffers[i];
-                       if (rxbuf->buf != NULL) {
-                               bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
-                                   BUS_DMASYNC_POSTREAD);
-                               bus_dmamap_unload(rxr->ptag, rxbuf->pmap);
-                               rxbuf->buf->m_flags |= M_PKTHDR;
-                               m_freem(rxbuf->buf);
-                       }
-                       rxbuf->buf = NULL;
+                       ixgbe_rx_discard(rxr, i);
                        if (rxbuf->pmap != NULL) {
                                bus_dmamap_destroy(rxr->ptag, rxbuf->pmap);
                                rxbuf->pmap = NULL;
@@ -1722,11 +1707,12 @@ ixgbe_rx_discard(struct rx_ring *rxr, in
        */
 
        if (rbuf->fmp != NULL) {/* Partial chain ? */
-               rbuf->fmp->m_flags |= M_PKTHDR;
+               bus_dmamap_sync(rxr->ptag, rbuf->pmap, BUS_DMASYNC_POSTREAD);
                m_freem(rbuf->fmp);
                rbuf->fmp = NULL;
                rbuf->buf = NULL; /* rbuf->buf is part of fmp's chain */
        } else if (rbuf->buf) {
+               bus_dmamap_sync(rxr->ptag, rbuf->pmap, BUS_DMASYNC_POSTREAD);
                m_free(rbuf->buf);
                rbuf->buf = NULL;
        }
@@ -1814,6 +1800,8 @@ ixgbe_rxeof(struct ix_queue *que)
                        goto next_desc;
                }
 
+               bus_dmamap_sync(rxr->ptag, rbuf->pmap, BUS_DMASYNC_POSTREAD);
+
                /*
                ** On 82599 which supports a hardware
                ** LRO (called HW RSC), packets need
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to