Date: Fri, 5 Dec 2008 00:01:34 +0000 (UTC) From: Paul Saab <ps@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r185621 - user/kmacy/HEAD_fast_multi_xmit/sys/dev/e1000 Message-ID: <200812050001.mB501YNq037805@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ps Date: Fri Dec 5 00:01:34 2008 New Revision: 185621 URL: http://svn.freebsd.org/changeset/base/185621 Log: Free mbuf's when the buf_ring is full Fix a use after free bug in em_xmit if_transmit is now stable on em and no longer leaks mbufs or crashes my machine under load. Modified: user/kmacy/HEAD_fast_multi_xmit/sys/dev/e1000/if_em.c Modified: user/kmacy/HEAD_fast_multi_xmit/sys/dev/e1000/if_em.c ============================================================================== --- user/kmacy/HEAD_fast_multi_xmit/sys/dev/e1000/if_em.c Thu Dec 4 20:32:53 2008 (r185620) +++ user/kmacy/HEAD_fast_multi_xmit/sys/dev/e1000/if_em.c Fri Dec 5 00:01:34 2008 (r185621) @@ -981,9 +981,11 @@ em_transmit_locked(struct ifnet *ifp, st EM_TX_LOCK_ASSERT(adapter); if (((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING) - || (!adapter->link_active)) - - return (buf_ring_enqueue(adapter->br, m)); + || (!adapter->link_active)) { + if ((error = buf_ring_enqueue(adapter->br, m))) + m_freem(m); + return (error); + } if (buf_ring_empty(adapter->br) && (adapter->num_tx_desc_avail > EM_TX_OP_THRESHOLD)) { @@ -993,8 +995,10 @@ em_transmit_locked(struct ifnet *ifp, st return (error); } - } else if ((error = buf_ring_enqueue(adapter->br, m)) != 0) + } else if ((error = buf_ring_enqueue(adapter->br, m)) != 0) { + m_freem(m); return (error); + } if (!buf_ring_empty(adapter->br)) em_start_locked(ifp); @@ -1105,8 +1109,10 @@ em_transmit(struct ifnet *ifp, struct mb if (ifp->if_drv_flags & IFF_DRV_RUNNING) error = em_transmit_locked(ifp, m); EM_TX_UNLOCK(adapter); - } else - error = buf_ring_enqueue(adapter->br, m); + } else { + if ((error = buf_ring_enqueue(adapter->br, m))) + m_freem(m); + } return (error); } @@ -2177,22 +2183,14 @@ em_xmit(struct adapter *adapter, struct error = bus_dmamap_load_mbuf_sg(adapter->txtag, map, *m_headp, segs, &nsegs, BUS_DMA_NOWAIT); - if (error == ENOMEM) { - adapter->no_tx_dma_setup++; - return (error); - } else if (error != 0) { + if (error) { adapter->no_tx_dma_setup++; m_freem(*m_headp); *m_headp = NULL; return (error); } - } else if (error == ENOMEM) { - adapter->no_tx_dma_setup++; - return (error); } else if (error != 0) { adapter->no_tx_dma_setup++; - m_freem(*m_headp); - *m_headp = NULL; return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812050001.mB501YNq037805>