Module Name: src Committed By: cegger Date: Thu Oct 8 08:57:19 UTC 2009
Modified Files: src/sys/dev/pci: if_age.c if_ale.c Log Message: Use m_pullup to handle defragmentation. Reinject mbuf into TX queue when it couldn't be loaded. diff for age(4) reviewed/discussed with plunky@ several weeks ago. To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/sys/dev/pci/if_age.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pci/if_ale.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_age.c diff -u src/sys/dev/pci/if_age.c:1.33 src/sys/dev/pci/if_age.c:1.34 --- src/sys/dev/pci/if_age.c:1.33 Sat Sep 5 14:09:55 2009 +++ src/sys/dev/pci/if_age.c Thu Oct 8 08:57:19 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_age.c,v 1.33 2009/09/05 14:09:55 tsutsui Exp $ */ +/* $NetBSD: if_age.c,v 1.34 2009/10/08 08:57:19 cegger Exp $ */ /* $OpenBSD: if_age.c,v 1.1 2009/01/16 05:00:34 kevlo Exp $ */ /*- @@ -31,7 +31,7 @@ /* Driver for Attansic Technology Corp. L1 Gigabit Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.33 2009/09/05 14:09:55 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.34 2009/10/08 08:57:19 cegger Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -1052,6 +1052,7 @@ if (age_encap(sc, &m_head)) { if (m_head == NULL) break; + IF_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; } @@ -1204,41 +1205,19 @@ if (error == EFBIG) { error = 0; - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { + *m_head = m_pullup(*m_head, MHLEN); + if (*m_head == NULL) { printf("%s: can't defrag TX mbuf\n", device_xname(sc->sc_dev)); - m_freem(*m_head); - *m_head = NULL; return ENOBUFS; } - M_COPY_PKTHDR(m, *m_head); - if ((*m_head)->m_pkthdr.len > MHLEN) { - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - m_freem(*m_head); - m_freem(m); - *m_head = NULL; - return ENOBUFS; - } - } - m_copydata(*m_head, 0, (*m_head)->m_pkthdr.len, - mtod(m, void *)); - m_freem(*m_head); - m->m_len = m->m_pkthdr.len; - *m_head = m; - error = bus_dmamap_load_mbuf(sc->sc_dmat, map, *m_head, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load defragged TX mbuf\n", device_xname(sc->sc_dev)); - if (!error) { - bus_dmamap_unload(sc->sc_dmat, map); - error = EFBIG; - } m_freem(*m_head); *m_head = NULL; return error; Index: src/sys/dev/pci/if_ale.c diff -u src/sys/dev/pci/if_ale.c:1.8 src/sys/dev/pci/if_ale.c:1.9 --- src/sys/dev/pci/if_ale.c:1.8 Sat Sep 5 14:09:55 2009 +++ src/sys/dev/pci/if_ale.c Thu Oct 8 08:57:19 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ale.c,v 1.8 2009/09/05 14:09:55 tsutsui Exp $ */ +/* $NetBSD: if_ale.c,v 1.9 2009/10/08 08:57:19 cegger Exp $ */ /*- * Copyright (c) 2008, Pyun YongHyeon <yong...@freebsd.org> @@ -32,7 +32,7 @@ /* Driver for Atheros AR8121/AR8113/AR8114 PCIe Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.8 2009/09/05 14:09:55 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.9 2009/10/08 08:57:19 cegger Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -933,41 +933,19 @@ if (error == EFBIG) { error = 0; - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { + *m_head = m_pullup(*m_head, MHLEN); + if (*m_head == NULL) { printf("%s: can't defrag TX mbuf\n", device_xname(sc->sc_dev)); - m_freem(*m_head); - *m_head = NULL; return ENOBUFS; } - M_COPY_PKTHDR(m, *m_head); - if ((*m_head)->m_pkthdr.len > MHLEN) { - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - m_freem(*m_head); - m_freem(m); - *m_head = NULL; - return ENOBUFS; - } - } - m_copydata(*m_head, 0, (*m_head)->m_pkthdr.len, - mtod(m, void *)); - m_freem(*m_head); - m->m_len = m->m_pkthdr.len; - *m_head = m; - error = bus_dmamap_load_mbuf(sc->sc_dmat, map, *m_head, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load defragged TX mbuf\n", device_xname(sc->sc_dev)); - if (!error) { - bus_dmamap_unload(sc->sc_dmat, map); - error = EFBIG; - } m_freem(*m_head); *m_head = NULL; return error; @@ -1092,6 +1070,7 @@ if (ale_encap(sc, &m_head)) { if (m_head == NULL) break; + IF_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; }