svn commit: r320099 - stable/11/sys/dev/vmware/vmxnet3
Andriy Gapon
avg at FreeBSD.org
Mon Jun 19 14:45:21 UTC 2017
Author: avg
Date: Mon Jun 19 14:45:20 2017
New Revision: 320099
URL: https://svnweb.freebsd.org/changeset/base/320099
Log:
MFC r318867: fix vmxnet3 crash when LRO is enabled
The crash can occur when all of the following conditions are true:
- a packet consists of multiple segments (requires LRO enabled)
- there has been a failure to allocate an mbuf for the packet and
the packet has to be dropped
- a host (vmware) still owned at least one segment of the packet,
so the driver had to wait for another interrupt to proceed to
discarding the remaining segment(s)
Reviewed by: rstone
Approved by: re (gjb)
Sponsored by: Panzura
Modified:
stable/11/sys/dev/vmware/vmxnet3/if_vmx.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/vmware/vmxnet3/if_vmx.c
==============================================================================
--- stable/11/sys/dev/vmware/vmxnet3/if_vmx.c Mon Jun 19 14:30:01 2017 (r320098)
+++ stable/11/sys/dev/vmware/vmxnet3/if_vmx.c Mon Jun 19 14:45:20 2017 (r320099)
@@ -2194,6 +2194,20 @@ vmxnet3_rxq_eof(struct vmxnet3_rxqueue *rxq)
} else {
KASSERT(rxd->btype == VMXNET3_BTYPE_BODY,
("%s: non start of frame w/o body buffer", __func__));
+
+ if (m_head == NULL && m_tail == NULL) {
+ /*
+ * This is a continuation of a packet that we
+ * started to drop, but could not drop entirely
+ * because this segment was still owned by the
+ * host. So, drop the remainder now.
+ */
+ vmxnet3_rxq_eof_discard(rxq, rxr, idx);
+ if (!rxcd->eop)
+ vmxnet3_rxq_discard_chain(rxq);
+ goto nextp;
+ }
+
KASSERT(m_head != NULL,
("%s: frame not started?", __func__));
More information about the svn-src-stable-11
mailing list