From nobody Mon Dec 27 12:01:45 2021 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 9655C191BB30; Mon, 27 Dec 2021 12:01:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JMx952XGJz3krK; Mon, 27 Dec 2021 12:01:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 36CD71D8AC; Mon, 27 Dec 2021 12:01:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 1BRC1jkw064324; Mon, 27 Dec 2021 12:01:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1BRC1j88064323; Mon, 27 Dec 2021 12:01:45 GMT (envelope-from git) Date: Mon, 27 Dec 2021 12:01:45 GMT Message-Id: <202112271201.1BRC1j88064323@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andriy Gapon Subject: git: 01409400eb11 - stable/12 - vmxnet3: skip zero-length descriptor in the middle of a packet List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: avg X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: 01409400eb118d1275861c9072b7a25770d82d90 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1640606505; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hu8Nf4WsMyGV1bFWVMgUq8hgxgfdtu6ek4jSDhs8oCk=; b=GA2L6wBvgEnOZM0Y+KNawDT9mpaMxMECotOsYXOuKuvdN+TediR6xR88OI075mEE7DAfYz TpQNTm2QfZ/5ylAHkHrnEGk4TDosEJTCf6jesjHId+ifI1n1V01R0l2u8H6s6J+Vh8NZZm 2NkleWiFOTSm2IpKbIDVxD2ZjNsqQLJgrPqj9XEpI/7hPi9qdRWHOPYe6cEm+zN0T736SF /khzfDORYus99h2MtJs47bHaek8ZIc70Ew7xDu1dtN+AM+b45XWsStM8bwwE2un7H57vDw a1oRtuIWetX2mLQK9h/BKJ637B6clI+f21B17wALyi5XVIJoX2ZXgO3ecMAxOg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1640606505; a=rsa-sha256; cv=none; b=dPglP9CcDHnLv/O1xDrFYSU9D0DnIzLu/c5UbNoAYdRZ0LmfKyA9z9x8MTObIDhffCPe4u nTyfDdhYfpjCAxejoiyjEkig+4QkUpmLCEdF3IzuAMa5Nk/LCRuWympa5qMVmx+IJFLHrY r6QrXQbGVZdT/mUjH6K6LpuhdMYd3PkjZdVMCicbIGC/B7RfEOHSKFXWnW8uuqjZypEvl5 uFyISBQRQyOe8NVyphCGbWTL+PJhBR6sXMONY4xm+qcwwtrO1bBdhkqv4crq9zMrKLsI5K B2XU2IEsHhUEpVqk0u4e5E5XmTjz6VnaFSMVYDBK2/ZdeRJz0xitCWdNr7TXIQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/12 has been updated by avg: URL: https://cgit.FreeBSD.org/src/commit/?id=01409400eb118d1275861c9072b7a25770d82d90 commit 01409400eb118d1275861c9072b7a25770d82d90 Author: Andriy Gapon AuthorDate: 2021-12-06 07:59:28 +0000 Commit: Andriy Gapon CommitDate: 2021-12-27 12:01:26 +0000 vmxnet3: skip zero-length descriptor in the middle of a packet Passing up such descriptors to iflib is obviously wasteful. But the main conern is that we may overrun iri_frags array because of them. That's been observed in practice. Also, assert that the number of fragments / descriptors / segments is less than IFLIB_MAX_RX_SEGS. Sponsored by: Panzura LLC (cherry picked from commit 9c612a5d0af17021abc6e1bb2a8baa5a4c97d05f) --- sys/dev/vmware/vmxnet3/if_vmx.c | 29 +++++++++++++++++------------ sys/dev/vmware/vmxnet3/if_vmxvar.h | 1 + 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c index b3cddcbc879f..cf2a4d8bf086 100644 --- a/sys/dev/vmware/vmxnet3/if_vmx.c +++ b/sys/dev/vmware/vmxnet3/if_vmx.c @@ -1505,8 +1505,6 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t ri) 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; @@ -1606,16 +1604,19 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t ri) 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; @@ -1887,6 +1888,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq) 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 @@ -2370,6 +2372,9 @@ vmxnet3_setup_debug_sysctl(struct vmxnet3_softc *sc, &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 index e39b552ab8cf..9811ae42534d 100644 --- a/sys/dev/vmware/vmxnet3/if_vmxvar.h +++ b/sys/dev/vmware/vmxnet3/if_vmxvar.h @@ -81,6 +81,7 @@ struct vmxnet3_comp_ring { int vxcr_gen; bus_addr_t vxcr_paddr; uint64_t vxcr_zero_length; + uint64_t vcxr_zero_length_frag; uint64_t vxcr_pkt_errors; };