Hi,
I have committed the vio diff with some tweaks to remove some more now
unused code. But I think this diff is actually incorrect:
On Tue, 31 Mar 2015, Kimberley Manning wrote:
> Index: if_pcn.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_pcn.c,v
> retrieving revision 1.36
> diff -u -p -r1.36 if_pcn.c
> --- if_pcn.c 14 Mar 2015 03:38:48 -0000 1.36
> +++ if_pcn.c 27 Mar 2015 12:17:24 -0000
> @@ -851,25 +851,23 @@ pcn_start(struct ifnet *ifp)
> * were short on resources. In this case, we'll copy
> * and try again.
> */
> - if (bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
> - BUS_DMA_WRITE|BUS_DMA_NOWAIT) != 0) {
> - MGETHDR(m, M_DONTWAIT, MT_DATA);
> - if (m == NULL)
> - break;
> - if (m0->m_pkthdr.len > MHLEN) {
> - MCLGET(m, M_DONTWAIT);
> - if ((m->m_flags & M_EXT) == 0) {
> - m_freem(m);
> - break;
> - }
> - }
> - m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t));
> - m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
> - error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap,
> - m, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
> - if (error)
> - break;
> - }
> + error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
> + BUS_DMA_WRITE|BUS_DMA_NOWAIT);
> + switch (error) {
> + case 0:
> + break;
> + case EFBIG:
> + if ((error = m_defrag(m0, M_DONTWAIT)) == 0 &&
> + (error = bus_dmamap_load_mbuf(sc->sc_dmat,
> dmamap,
> + m0, BUS_DMA_WRITE|BUS_DMA_NOWAIT)) == 0)
> + break;
> +
> + /* FALLTHROUGH */
> + default:
> + IFQ_DEQUEUE(&ifp->if_snd, m0);
> + m_freem(m);
m is always NULL. Therefore you leak m0 in the error path. You should
remove the m variable which is no longer necessary, and possibly rename m0
to m. But the rename should probably be done in a second diff for easier
review.
> + continue;
> + }
Other drivers don't dequeue mbufs in out of mem situations. I think you
should just set IFF_OACTIVE and break out of the for loop (not shown in
the diff). The old code just does the break, but I think setting
IFF_OACTIVE would be correct here.
>
> /*
> * Ensure we have enough descriptors free to describe
>
>