Module Name: src Committed By: maxv Date: Sun Jan 14 17:43:55 UTC 2018
Modified Files: src/sys/dev/pci: if_vge.c Log Message: Dedup. m_defrag is already a common function, no need to reimplement it there. Meanwhile this should fix two bugs (that I couldn't investigate more than that since I don't have this hardware): the mbuf passed to vge_m_defrag was leaked, and the tags were not copied in the returned mbuf. To generate a diff of this commit: cvs rdiff -u -r1.61 -r1.62 src/sys/dev/pci/if_vge.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_vge.c diff -u src/sys/dev/pci/if_vge.c:1.61 src/sys/dev/pci/if_vge.c:1.62 --- src/sys/dev/pci/if_vge.c:1.61 Tue Sep 26 07:42:06 2017 +++ src/sys/dev/pci/if_vge.c Sun Jan 14 17:43:55 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vge.c,v 1.61 2017/09/26 07:42:06 knakahara Exp $ */ +/* $NetBSD: if_vge.c,v 1.62 2018/01/14 17:43:55 maxv Exp $ */ /*- * Copyright (c) 2004 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.61 2017/09/26 07:42:06 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.62 2018/01/14 17:43:55 maxv Exp $"); /* * VIA Networking Technologies VT612x PCI gigabit ethernet NIC driver. @@ -358,64 +358,6 @@ vge_set_rxaddr(struct vge_rxdesc *rxd, b } /* - * Defragment mbuf chain contents to be as linear as possible. - * Returns new mbuf chain on success, NULL on failure. Old mbuf - * chain is always freed. - * XXX temporary until there would be generic function doing this. - */ -#define m_defrag vge_m_defrag -struct mbuf * vge_m_defrag(struct mbuf *, int); - -struct mbuf * -vge_m_defrag(struct mbuf *mold, int flags) -{ - struct mbuf *m0, *mn, *n; - size_t sz = mold->m_pkthdr.len; - -#ifdef DIAGNOSTIC - if ((mold->m_flags & M_PKTHDR) == 0) - panic("m_defrag: not a mbuf chain header"); -#endif - - MGETHDR(m0, flags, MT_DATA); - if (m0 == NULL) - return NULL; - m0->m_pkthdr.len = mold->m_pkthdr.len; - mn = m0; - - do { - if (sz > MHLEN) { - MCLGET(mn, M_DONTWAIT); - if ((mn->m_flags & M_EXT) == 0) { - m_freem(m0); - return NULL; - } - } - - mn->m_len = MIN(sz, MCLBYTES); - - m_copydata(mold, mold->m_pkthdr.len - sz, mn->m_len, - mtod(mn, void *)); - - sz -= mn->m_len; - - if (sz > 0) { - /* need more mbufs */ - MGET(n, M_NOWAIT, MT_DATA); - if (n == NULL) { - m_freem(m0); - return NULL; - } - - mn->m_next = n; - mn = n; - } - } while (sz > 0); - - return m0; -} - -/* * Read a word of data stored in the EEPROM at address 'addr.' */ static uint16_t