aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/vmware/vmxnet3
diff options
context:
space:
mode:
authorBryan Venteicher <bryanv@FreeBSD.org>2014-06-20 02:49:03 +0000
committerBryan Venteicher <bryanv@FreeBSD.org>2014-06-20 02:49:03 +0000
commit1204e3745ae0e205c567e561a8e27ba6b46e07d8 (patch)
treed2e448a7f5cabccdda87e23613e41742757c44ff /sys/dev/vmware/vmxnet3
parentd701c1992d4365eedaae6d5e56839ed5a36a52b9 (diff)
Notes
Diffstat (limited to 'sys/dev/vmware/vmxnet3')
-rw-r--r--sys/dev/vmware/vmxnet3/if_vmx.c18
-rw-r--r--sys/dev/vmware/vmxnet3/if_vmxvar.h2
2 files changed, 18 insertions, 2 deletions
diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c
index 0e0315e335a5..2cc04962f99f 100644
--- a/sys/dev/vmware/vmxnet3/if_vmx.c
+++ b/sys/dev/vmware/vmxnet3/if_vmx.c
@@ -2087,17 +2087,25 @@ vmxnet3_rxq_eof(struct vmxnet3_rxqueue *rxq)
sc = rxq->vxrxq_sc;
ifp = sc->vmx_ifp;
rxc = &rxq->vxrxq_comp_ring;
- m_head = m_tail = NULL;
VMXNET3_RXQ_LOCK_ASSERT(rxq);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
return;
+ m_head = rxq->vxrxq_mhead;
+ rxq->vxrxq_mhead = NULL;
+ m_tail = rxq->vxrxq_mtail;
+ rxq->vxrxq_mtail = NULL;
+ MPASS(m_head == NULL || m_tail != NULL);
+
for (;;) {
rxcd = &rxc->vxcr_u.rxcd[rxc->vxcr_next];
- if (rxcd->gen != rxc->vxcr_gen)
+ if (rxcd->gen != rxc->vxcr_gen) {
+ rxq->vxrxq_mhead = m_head;
+ rxq->vxrxq_mtail = m_tail;
break;
+ }
vmxnet3_barrier(sc, VMXNET3_BARRIER_RD);
if (++rxc->vxcr_next == rxc->vxcr_ndesc) {
@@ -2329,6 +2337,12 @@ vmxnet3_rxstop(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq)
struct vmxnet3_rxbuf *rxb;
int i, j;
+ if (rxq->vxrxq_mhead != NULL) {
+ m_freem(rxq->vxrxq_mhead);
+ rxq->vxrxq_mhead = NULL;
+ rxq->vxrxq_mtail = NULL;
+ }
+
for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
rxr = &rxq->vxrxq_cmd_ring[i];
diff --git a/sys/dev/vmware/vmxnet3/if_vmxvar.h b/sys/dev/vmware/vmxnet3/if_vmxvar.h
index 50eb1c3a124b..6c797214b2ee 100644
--- a/sys/dev/vmware/vmxnet3/if_vmxvar.h
+++ b/sys/dev/vmware/vmxnet3/if_vmxvar.h
@@ -168,6 +168,8 @@ struct vmxnet3_rxqueue {
struct vmxnet3_softc *vxrxq_sc;
int vxrxq_id;
int vxrxq_intr_idx;
+ struct mbuf *vxrxq_mhead;
+ struct mbuf *vxrxq_mtail;
struct vmxnet3_rxring vxrxq_cmd_ring[VMXNET3_RXRINGS_PERQ];
struct vmxnet3_comp_ring vxrxq_comp_ring;
struct vmxnet3_rxq_stats vxrxq_stats;