Page MenuHomeFreeBSD

D33189.diff
No OneTemporary

D33189.diff

diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c
--- a/sys/dev/vmware/vmxnet3/if_vmx.c
+++ b/sys/dev/vmware/vmxnet3/if_vmx.c
@@ -1503,8 +1503,6 @@
struct vmxnet3_rxqueue *rxq;
struct vmxnet3_comp_ring *rxc;
struct vmxnet3_rxcompdesc *rxcd;
- struct vmxnet3_rxring *rxr;
- struct vmxnet3_rxdesc *rxd;
if_rxd_frag_t frag;
int cqidx;
uint16_t total_len;
@@ -1604,16 +1602,19 @@
rxcd = &rxc->vxcr_u.rxcd[cqidx];
KASSERT(rxcd->gen == rxc->vxcr_gen,
("%s: generation mismatch", __func__));
- flid = (rxcd->qid >= scctx->isc_nrxqsets) ? 1 : 0;
- rxr = &rxq->vxrxq_cmd_ring[flid];
- rxd = &rxr->vxrxr_rxd[rxcd->rxd_idx];
-
- frag = &ri->iri_frags[nfrags];
- frag->irf_flid = flid;
- frag->irf_idx = rxcd->rxd_idx;
- frag->irf_len = rxcd->len;
- total_len += rxcd->len;
- nfrags++;
+ KASSERT(nfrags < IFLIB_MAX_RX_SEGS,
+ ("%s: too many fragments", __func__));
+ if (__predict_true(rxcd->len != 0)) {
+ frag = &ri->iri_frags[nfrags];
+ flid = (rxcd->qid >= scctx->isc_nrxqsets) ? 1 : 0;
+ frag->irf_flid = flid;
+ frag->irf_idx = rxcd->rxd_idx;
+ frag->irf_len = rxcd->len;
+ total_len += rxcd->len;
+ nfrags++;
+ } else {
+ rxc->vcxr_zero_length_frag++;
+ }
if (++cqidx == rxc->vxcr_ndesc) {
cqidx = 0;
rxc->vxcr_gen ^= 1;
@@ -1885,6 +1886,7 @@
rxc->vxcr_next = 0;
rxc->vxcr_gen = VMXNET3_INIT_GEN;
rxc->vxcr_zero_length = 0;
+ rxc->vcxr_zero_length_frag = 0;
rxc->vxcr_pkt_errors = 0;
/*
* iflib has zeroed out the descriptor array during the prior attach
@@ -2365,6 +2367,9 @@
&rxq->vxrxq_comp_ring.vxcr_gen, 0, "");
SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_zero_length", CTLFLAG_RD,
&rxq->vxrxq_comp_ring.vxcr_zero_length, 0, "");
+ SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_zero_length_frag",
+ CTLFLAG_RD, &rxq->vxrxq_comp_ring.vcxr_zero_length_frag,
+ 0, "");
SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_pkt_errors", CTLFLAG_RD,
&rxq->vxrxq_comp_ring.vxcr_pkt_errors, 0, "");
}
diff --git a/sys/dev/vmware/vmxnet3/if_vmxvar.h b/sys/dev/vmware/vmxnet3/if_vmxvar.h
--- a/sys/dev/vmware/vmxnet3/if_vmxvar.h
+++ b/sys/dev/vmware/vmxnet3/if_vmxvar.h
@@ -81,6 +81,7 @@
int vxcr_gen;
bus_addr_t vxcr_paddr;
uint64_t vxcr_zero_length;
+ uint64_t vcxr_zero_length_frag;
uint64_t vxcr_pkt_errors;
};

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 17, 8:54 AM (20 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15836917
Default Alt Text
D33189.diff (2 KB)

Event Timeline