PERFORCE change 65116 for review
Robert Watson
rwatson at FreeBSD.org
Sun Nov 14 12:36:22 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=65116
Change 65116 by rwatson at rwatson_paprika on 2004/11/14 20:35:38
Integ if_em "out of mbuf" fix for vlan scenario.
Affected files ...
.. //depot/projects/netperf_socket/sys/dev/em/if_em.c#14 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/dev/em/if_em.c#14 (text+ko) ====
@@ -31,7 +31,7 @@
***************************************************************************/
-/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.53 2004/11/12 11:03:07 rwatson Exp $*/
+/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.54 2004/11/14 20:20:28 rwatson Exp $*/
#include <dev/em/if_em.h>
@@ -598,8 +598,14 @@
IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
if (m_head == NULL) break;
-
+
+ /*
+ * em_encap() can modify our pointer, and or make it NULL on
+ * failure. In that event, we can't requeue.
+ */
if (em_encap(adapter, &m_head)) {
+ if (m_head == NULL)
+ break;
ifp->if_flags |= IFF_OACTIVE;
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
break;
@@ -1248,15 +1254,24 @@
struct ether_header eh;
m_head = m_pullup(m_head, sizeof(eh));
- if (m_head == NULL)
+ if (m_head == NULL) {
+ *m_headp = NULL;
+ bus_dmamap_destroy(adapter->txtag, q.map);
return (ENOBUFS);
+ }
eh = *mtod(m_head, struct ether_header *);
M_PREPEND(m_head, sizeof(*evl), M_DONTWAIT);
- if (m_head == NULL)
+ if (m_head == NULL) {
+ *m_headp = NULL;
+ bus_dmamap_destroy(adapter->txtag, q.map);
return (ENOBUFS);
+ }
m_head = m_pullup(m_head, sizeof(*evl));
- if (m_head == NULL)
+ if (m_head == NULL) {
+ *m_headp = NULL;
+ bus_dmamap_destroy(adapter->txtag, q.map);
return (ENOBUFS);
+ }
evl = mtod(m_head, struct ether_vlan_header *);
bcopy(&eh, evl, sizeof(*evl));
evl->evl_proto = evl->evl_encap_proto;
More information about the p4-projects
mailing list