From owner-svn-src-all@freebsd.org Tue Aug 4 15:54:16 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id B52F03781E9; Tue, 4 Aug 2020 15:54:16 +0000 (UTC) (envelope-from jclarke@marcuscom.com) Received: from creme-brulee.marcuscom.com (creme-brulee.marcuscom.com [IPv6:2607:fc50:1:f300::2]) (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 (2048 bits) client-digest SHA256) (Client CN "*.marcuscom.com", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4BLfSm078Zz4Wnl; Tue, 4 Aug 2020 15:54:15 +0000 (UTC) (envelope-from jclarke@marcuscom.com) Received: from rtp-jclarke-nitro9.cisco.com ([173.38.117.79]) (authenticated bits=0) by creme-brulee.marcuscom.com (8.16.1/8.16.1) with ESMTPSA id 074FsBbH030503 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 4 Aug 2020 11:54:12 -0400 (EDT) (envelope-from jclarke@marcuscom.com) X-Authentication-Warning: creme-brulee.marcuscom.com: Host [173.38.117.79] claimed to be rtp-jclarke-nitro9.cisco.com From: Joe Clarke Message-Id: <591D9FE1-043F-4025-83F8-E6100D680EB2@marcuscom.com> Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.1\)) Subject: Re: svn commit: r363844 - in stable/12/sys: dev/vmware/vmxnet3 net Date: Tue, 4 Aug 2020 11:54:06 -0400 In-Reply-To: <202008041548.074FmCUp056205@repo.freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org To: Mark Johnston References: <202008041548.074FmCUp056205@repo.freebsd.org> X-Mailer: Apple Mail (2.3608.120.23.2.1) X-Spam-Status: No, score=3.4 required=5.0 tests=HTML_MESSAGE, RDNS_NONE, TW_CQ, TW_DX,TW_MX,TW_NR,TW_QS,TW_RX,TW_SV,TW_TX,TW_VM,TW_XC,TW_XQ,TW_XS autolearn=disabled version=3.4.4 X-Spam-Level: *** X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on creme-brulee.marcuscom.com X-Rspamd-Queue-Id: 4BLfSm078Zz4Wnl X-Spamd-Bar: + Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=none (mx1.freebsd.org: domain of jclarke@marcuscom.com has no SPF policy when checking 2607:fc50:1:f300::2) smtp.mailfrom=jclarke@marcuscom.com X-Spamd-Result: default: False [1.95 / 15.00]; RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; MV_CASE(0.50)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; HAS_XAW(0.00)[]; DMARC_NA(0.00)[marcuscom.com]; AUTH_NA(1.00)[]; RCPT_COUNT_FIVE(0.00)[5]; NEURAL_SPAM_MEDIUM(0.34)[0.344]; NEURAL_HAM_SHORT(-0.10)[-0.101]; NEURAL_SPAM_LONG(0.31)[0.311]; R_SPF_NA(0.00)[no SPF record]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:36236, ipnet:2607:fc50::/36, country:US]; RCVD_COUNT_TWO(0.00)[2]; RCVD_TLS_ALL(0.00)[] Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Aug 2020 15:54:16 -0000 Thanks, Mark. Joe > On Aug 4, 2020, at 11:48, Mark Johnston wrote: >=20 > Author: markj > Date: Tue Aug 4 15:48:12 2020 > New Revision: 363844 > URL: https://svnweb.freebsd.org/changeset/base/363844 >=20 > Log: > MFC r358996 (by pkelsey): > Fix iflib zero-length fragment handling >=20 > MFC r358997 (by pkelsey): > Remove freelist contiguous-indexes assertion from rxd_frag_to_sd() >=20 > MFC r358998 (by pkelsey): > Allow iflib drivers to specify the buffer size used for each receive = queue >=20 > MFC r358999 (by pkelsey): > Remove refill budget from iflib >=20 > MFC r359000 (by pkelsey): > Fix if_vmx receive checksum offload bug and harden against the device > skipping receive descriptors >=20 > MFC r359001 (by pkelsey): > Adjust if_vmx default receive parameters for better out-of-box = performance >=20 > MFC r359002 (by pkelsey): > Remove extraneous code from iflib >=20 > MFC r359029 (by pkelsey): > Restore power-of-2 queue count constraint from r290948 >=20 > Tested by: marcus, mav >=20 > Modified: > stable/12/sys/dev/vmware/vmxnet3/if_vmx.c > stable/12/sys/dev/vmware/vmxnet3/if_vmxvar.h > stable/12/sys/net/iflib.c > stable/12/sys/net/iflib.h > Directory Properties: > stable/12/ (props changed) >=20 > Modified: stable/12/sys/dev/vmware/vmxnet3/if_vmx.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- stable/12/sys/dev/vmware/vmxnet3/if_vmx.c Tue Aug 4 15:27:32 2020 = (r363843) > +++ stable/12/sys/dev/vmware/vmxnet3/if_vmx.c Tue Aug 4 15:48:12 2020 = (r363844) > @@ -321,6 +321,13 @@ vmxnet3_register(device_t dev) > } >=20 > static int > +trunc_powerof2(int val) > +{ > + > + return (1U << (fls(val) - 1)); > +} > + > +static int > vmxnet3_attach_pre(if_ctx_t ctx) > { > device_t dev; > @@ -349,12 +356,16 @@ vmxnet3_attach_pre(if_ctx_t ctx) > /* If 0, the iflib tunable was not set, so set to the default */ > if (scctx->isc_nrxqsets =3D=3D 0) > scctx->isc_nrxqsets =3D VMXNET3_DEF_RX_QUEUES; > + scctx->isc_nrxqsets =3D trunc_powerof2(scctx->isc_nrxqsets); > scctx->isc_nrxqsets_max =3D min(VMXNET3_MAX_RX_QUEUES, = mp_ncpus); > + scctx->isc_nrxqsets_max =3D = trunc_powerof2(scctx->isc_nrxqsets_max); >=20 > /* If 0, the iflib tunable was not set, so set to the default */ > if (scctx->isc_ntxqsets =3D=3D 0) > scctx->isc_ntxqsets =3D VMXNET3_DEF_TX_QUEUES; > + scctx->isc_ntxqsets =3D trunc_powerof2(scctx->isc_ntxqsets); > scctx->isc_ntxqsets_max =3D min(VMXNET3_MAX_TX_QUEUES, = mp_ncpus); > + scctx->isc_ntxqsets_max =3D = trunc_powerof2(scctx->isc_ntxqsets_max); >=20 > /* > * Enforce that the transmit completion queue descriptor count = is > @@ -381,6 +392,12 @@ vmxnet3_attach_pre(if_ctx_t ctx) > scctx->isc_rxqsizes[2] =3D > sizeof(struct vmxnet3_rxdesc) * scctx->isc_nrxd[2]; >=20 > + /* > + * Initialize the max frame size and descriptor queue buffer > + * sizes. > + */ > + vmxnet3_mtu_set(ctx, if_getmtu(sc->vmx_ifp)); > + > scctx->isc_rss_table_size =3D UPT1_RSS_MAX_IND_TABLE_SIZE; >=20 > /* Map PCI BARs */ > @@ -1494,6 +1511,7 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t = ri) > int cqidx; > uint16_t total_len; > uint8_t nfrags; > + uint8_t i; > uint8_t flid; >=20 > sc =3D vsc; > @@ -1517,6 +1535,7 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t = ri) > KASSERT(rxcd->sop && rxcd->eop, > ("%s: zero-length packet without both sop and eop = set", > __func__)); > + rxc->vxcr_zero_length++; > if (++cqidx =3D=3D rxc->vxcr_ndesc) { > cqidx =3D 0; > rxc->vxcr_gen ^=3D 1; > @@ -1572,31 +1591,6 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, = if_rxd_info_t ri) > } > } >=20 > - /* VLAN */ > - if (rxcd->vlan) { > - ri->iri_flags |=3D M_VLANTAG; > - ri->iri_vtag =3D rxcd->vtag; > - } > - > - /* Checksum offload */ > - if (!rxcd->no_csum) { > - uint32_t csum_flags =3D 0; > - > - if (rxcd->ipv4) { > - csum_flags |=3D CSUM_IP_CHECKED; > - if (rxcd->ipcsum_ok) > - csum_flags |=3D CSUM_IP_VALID; > - } > - if (!rxcd->fragment && (rxcd->tcp || rxcd->udp)) { > - csum_flags |=3D CSUM_L4_CALC; > - if (rxcd->csum_ok) { > - csum_flags |=3D CSUM_L4_VALID; > - ri->iri_csum_data =3D 0xffff; > - } > - } > - ri->iri_csum_flags =3D csum_flags; > - } > - > /* > * The queue numbering scheme used for rxcd->qid is as follows: > * - All of the command ring 0s are numbered [0, nrxqsets - 1] > @@ -1632,6 +1626,46 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, = if_rxd_info_t ri) > ri->iri_nfrags =3D nfrags; > ri->iri_len =3D total_len; >=20 > + /* > + * If there's an error, the last descriptor in the packet will > + * have the error indicator set. In this case, set all > + * fragment lengths to zero. This will cause iflib to discard > + * the packet, but process all associated descriptors through > + * the refill mechanism. > + */ > + if (__predict_false(rxcd->error)) { > + rxc->vxcr_pkt_errors++; > + for (i =3D 0; i < nfrags; i++) { > + frag =3D &ri->iri_frags[i]; > + frag->irf_len =3D 0; > + } > + } else { > + /* Checksum offload information is in the last = descriptor. */ > + if (!rxcd->no_csum) { > + uint32_t csum_flags =3D 0; > + > + if (rxcd->ipv4) { > + csum_flags |=3D CSUM_IP_CHECKED; > + if (rxcd->ipcsum_ok) > + csum_flags |=3D CSUM_IP_VALID; > + } > + if (!rxcd->fragment && (rxcd->tcp || rxcd->udp)) = { > + csum_flags |=3D CSUM_L4_CALC; > + if (rxcd->csum_ok) { > + csum_flags |=3D CSUM_L4_VALID; > + ri->iri_csum_data =3D 0xffff; > + } > + } > + ri->iri_csum_flags =3D csum_flags; > + } > + > + /* VLAN information is in the last descriptor. */ > + if (rxcd->vlan) { > + ri->iri_flags |=3D M_VLANTAG; > + ri->iri_vtag =3D rxcd->vtag; > + } > + } > + > return (0); > } >=20 > @@ -1645,14 +1679,13 @@ vmxnet3_isc_rxd_refill(void *vsc, = if_rxd_update_t iru) > uint64_t *paddrs; > int count; > int len; > - int pidx; > + int idx; > int i; > uint8_t flid; > uint8_t btype; >=20 > count =3D iru->iru_count; > len =3D iru->iru_buf_size; > - pidx =3D iru->iru_pidx; > flid =3D iru->iru_flidx; > paddrs =3D iru->iru_paddrs; >=20 > @@ -1666,17 +1699,32 @@ vmxnet3_isc_rxd_refill(void *vsc, = if_rxd_update_t iru) > * command ring 1 is filled with BTYPE_BODY descriptors. > */ > btype =3D (flid =3D=3D 0) ? VMXNET3_BTYPE_HEAD : = VMXNET3_BTYPE_BODY; > - for (i =3D 0; i < count; i++) { > - rxd[pidx].addr =3D paddrs[i]; > - rxd[pidx].len =3D len; > - rxd[pidx].btype =3D btype; > - rxd[pidx].gen =3D rxr->vxrxr_gen; > + /* > + * The refill entries from iflib will advance monotonically, > + * but the refilled descriptors may not be contiguous due to > + * earlier skipping of descriptors by the device. The refill > + * entries from iflib need an entire state update, while the > + * descriptors previously skipped by the device only need to > + * have their generation numbers updated. > + */ > + idx =3D rxr->vxrxr_refill_start; > + i =3D 0; > + do { > + if (idx =3D=3D iru->iru_idxs[i]) { > + rxd[idx].addr =3D paddrs[i]; > + rxd[idx].len =3D len; > + rxd[idx].btype =3D btype; > + i++; > + } else > + rxr->vxrxr_desc_skips++; > + rxd[idx].gen =3D rxr->vxrxr_gen; >=20 > - if (++pidx =3D=3D rxr->vxrxr_ndesc) { > - pidx =3D 0; > + if (++idx =3D=3D rxr->vxrxr_ndesc) { > + idx =3D 0; > rxr->vxrxr_gen ^=3D 1; > } > - } > + } while (i !=3D count); > + rxr->vxrxr_refill_start =3D idx; > } >=20 > static void > @@ -1825,6 +1873,8 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, struct = vmxnet > for (i =3D 0; i < sc->vmx_sctx->isc_nrxqs - 1; i++) { > rxr =3D &rxq->vxrxq_cmd_ring[i]; > rxr->vxrxr_gen =3D VMXNET3_INIT_GEN; > + rxr->vxrxr_desc_skips =3D 0; > + rxr->vxrxr_refill_start =3D 0; > /* > * iflib has zeroed out the descriptor array during the > * prior attach or stop > @@ -1834,6 +1884,8 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, struct = vmxnet > for (/**/; i < VMXNET3_RXRINGS_PERQ; i++) { > rxr =3D &rxq->vxrxq_cmd_ring[i]; > rxr->vxrxr_gen =3D 0; > + rxr->vxrxr_desc_skips =3D 0; > + rxr->vxrxr_refill_start =3D 0; > bzero(rxr->vxrxr_rxd, > rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc)); > } > @@ -1841,6 +1893,8 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, struct = vmxnet > rxc =3D &rxq->vxrxq_comp_ring; > rxc->vxcr_next =3D 0; > rxc->vxcr_gen =3D VMXNET3_INIT_GEN; > + rxc->vxcr_zero_length =3D 0; > + rxc->vxcr_pkt_errors =3D 0; > /* > * iflib has zeroed out the descriptor array during the prior = attach > * or stop > @@ -1906,14 +1960,9 @@ static void > vmxnet3_init(if_ctx_t ctx) > { > struct vmxnet3_softc *sc; > - if_softc_ctx_t scctx; > =09 > sc =3D iflib_get_softc(ctx); > - scctx =3D sc->vmx_scctx; >=20 > - scctx->isc_max_frame_size =3D if_getmtu(iflib_get_ifp(ctx)) + > - ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETHER_CRC_LEN; > - > /* Use the current MAC address. */ > bcopy(IF_LLADDR(sc->vmx_ifp), sc->vmx_lladdr, ETHER_ADDR_LEN); > vmxnet3_set_lladdr(sc); > @@ -1938,11 +1987,37 @@ vmxnet3_multi_set(if_ctx_t ctx) > static int > vmxnet3_mtu_set(if_ctx_t ctx, uint32_t mtu) > { > + struct vmxnet3_softc *sc; > + if_softc_ctx_t scctx; >=20 > + sc =3D iflib_get_softc(ctx); > + scctx =3D sc->vmx_scctx; > + > if (mtu > VMXNET3_TX_MAXSIZE - (ETHER_HDR_LEN + = ETHER_VLAN_ENCAP_LEN + > ETHER_CRC_LEN)) > return (EINVAL); >=20 > + /* > + * Update the max frame size so that the rx mbuf size is > + * chosen based on the new mtu during the interface init that > + * will occur after this routine returns. > + */ > + scctx->isc_max_frame_size =3D mtu + > + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETHER_CRC_LEN; > + /* RX completion queue - n/a */ > + scctx->isc_rxd_buf_size[0] =3D 0; > + /* > + * For header-type descriptors (used for first segment of > + * packet), let iflib determine the buffer size based on the > + * max frame size. > + */ > + scctx->isc_rxd_buf_size[1] =3D 0; > + /* > + * For body-type descriptors (used for jumbo frames and LRO), > + * always use page-sized buffers. > + */ > + scctx->isc_rxd_buf_size[2] =3D MJUMPAGESIZE; > + > return (0); > } >=20 > @@ -2288,14 +2363,22 @@ vmxnet3_setup_debug_sysctl(struct = vmxnet3_softc *sc, > &rxq->vxrxq_cmd_ring[0].vxrxr_ndesc, 0, ""); > SYSCTL_ADD_INT(ctx, list, OID_AUTO, "cmd0_gen", = CTLFLAG_RD, > &rxq->vxrxq_cmd_ring[0].vxrxr_gen, 0, ""); > + SYSCTL_ADD_U64(ctx, list, OID_AUTO, "cmd0_desc_skips", = CTLFLAG_RD, > + &rxq->vxrxq_cmd_ring[0].vxrxr_desc_skips, 0, ""); > SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd1_ndesc", = CTLFLAG_RD, > &rxq->vxrxq_cmd_ring[1].vxrxr_ndesc, 0, ""); > SYSCTL_ADD_INT(ctx, list, OID_AUTO, "cmd1_gen", = CTLFLAG_RD, > &rxq->vxrxq_cmd_ring[1].vxrxr_gen, 0, ""); > + SYSCTL_ADD_U64(ctx, list, OID_AUTO, "cmd1_desc_skips", = CTLFLAG_RD, > + &rxq->vxrxq_cmd_ring[1].vxrxr_desc_skips, 0, ""); > SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "comp_ndesc", = CTLFLAG_RD, > &rxq->vxrxq_comp_ring.vxcr_ndesc, 0,""); > SYSCTL_ADD_INT(ctx, list, OID_AUTO, "comp_gen", = CTLFLAG_RD, > &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_pkt_errors", = CTLFLAG_RD, > + &rxq->vxrxq_comp_ring.vxcr_pkt_errors, 0, ""); > } > } >=20 >=20 > Modified: stable/12/sys/dev/vmware/vmxnet3/if_vmxvar.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- stable/12/sys/dev/vmware/vmxnet3/if_vmxvar.h Tue Aug 4 = 15:27:32 2020 (r363843) > +++ stable/12/sys/dev/vmware/vmxnet3/if_vmxvar.h Tue Aug 4 = 15:48:12 2020 (r363844) > @@ -41,7 +41,7 @@ struct vmxnet3_softc; > #define VMXNET3_MAX_TX_NDESC 4096 > #define VMXNET3_MIN_TX_NDESC 32 > #define VMXNET3_MASK_TX_NDESC 0x1F > -#define VMXNET3_DEF_RX_NDESC 256 > +#define VMXNET3_DEF_RX_NDESC 512 > #define VMXNET3_MAX_RX_NDESC 2048 > #define VMXNET3_MIN_RX_NDESC 32 > #define VMXNET3_MASK_RX_NDESC 0x1F > @@ -63,6 +63,8 @@ struct vmxnet3_rxring { > u_int vxrxr_ndesc; > int vxrxr_gen; > bus_addr_t vxrxr_paddr; > + uint64_t vxrxr_desc_skips; > + uint16_t vxrxr_refill_start; > }; >=20 > struct vmxnet3_comp_ring { > @@ -78,6 +80,8 @@ struct vmxnet3_comp_ring { > u_int vxcr_ndesc; > int vxcr_gen; > bus_addr_t vxcr_paddr; > + uint64_t vxcr_zero_length; > + uint64_t vxcr_pkt_errors; > }; >=20 > struct vmxnet3_txqueue { >=20 > Modified: stable/12/sys/net/iflib.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- stable/12/sys/net/iflib.c Tue Aug 4 15:27:32 2020 = (r363843) > +++ stable/12/sys/net/iflib.c Tue Aug 4 15:48:12 2020 = (r363844) > @@ -453,7 +453,6 @@ typedef struct if_rxsd { > caddr_t *ifsd_cl; > struct mbuf **ifsd_m; > iflib_fl_t ifsd_fl; > - qidx_t ifsd_cidx; > } *if_rxsd_t; >=20 > /* multiple of word size */ > @@ -713,6 +712,7 @@ static int iflib_altq_if_transmit(if_t ifp, struct = mbu > static int iflib_register(if_ctx_t); > static void iflib_deregister(if_ctx_t); > static void iflib_unregister_vlan_handlers(if_ctx_t ctx); > +static uint16_t iflib_get_mbuf_size_for(unsigned int size); > static void iflib_init_locked(if_ctx_t ctx); > static void iflib_add_device_sysctl_pre(if_ctx_t ctx); > static void iflib_add_device_sysctl_post(if_ctx_t ctx); > @@ -2130,7 +2130,7 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, = int coun > } >=20 > static __inline uint8_t > -__iflib_fl_refill_lt(if_ctx_t ctx, iflib_fl_t fl, int max) > +__iflib_fl_refill_all(if_ctx_t ctx, iflib_fl_t fl) > { > /* we avoid allowing pidx to catch up with cidx as it confuses = ixl */ > int32_t reclaimable =3D fl->ifl_size - fl->ifl_credits - 1; > @@ -2142,7 +2142,7 @@ __iflib_fl_refill_lt(if_ctx_t ctx, iflib_fl_t = fl, int=20 > MPASS(reclaimable =3D=3D delta); >=20 > if (reclaimable > 0) > - return (_iflib_fl_refill(ctx, fl, min(max, = reclaimable))); > + return (_iflib_fl_refill(ctx, fl, reclaimable)); > return (0); > } >=20 > @@ -2213,6 +2213,8 @@ iflib_fl_setup(iflib_fl_t fl) > { > iflib_rxq_t rxq =3D fl->ifl_rxq; > if_ctx_t ctx =3D rxq->ifr_ctx; > + if_softc_ctx_t scctx =3D &ctx->ifc_softc_ctx; > + int qidx; >=20 > bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1); > /* > @@ -2221,7 +2223,16 @@ iflib_fl_setup(iflib_fl_t fl) > iflib_fl_bufs_free(fl); > /* Now replenish the mbufs */ > MPASS(fl->ifl_credits =3D=3D 0); > - fl->ifl_buf_size =3D ctx->ifc_rx_mbuf_sz; > + qidx =3D rxq->ifr_fl_offset + fl->ifl_id; > + if (scctx->isc_rxd_buf_size[qidx] !=3D 0) > + fl->ifl_buf_size =3D scctx->isc_rxd_buf_size[qidx]; > + else > + fl->ifl_buf_size =3D ctx->ifc_rx_mbuf_sz; > + /* > + * ifl_buf_size may be a driver-supplied value, so pull it up > + * to the selected mbuf size. > + */ > + fl->ifl_buf_size =3D iflib_get_mbuf_size_for(fl->ifl_buf_size); > if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size) > ctx->ifc_max_fl_buf_size =3D fl->ifl_buf_size; > fl->ifl_cltype =3D m_gettype(fl->ifl_buf_size); > @@ -2353,6 +2364,16 @@ iflib_timer(void *arg) > STATE_UNLOCK(ctx); > } >=20 > +static uint16_t > +iflib_get_mbuf_size_for(unsigned int size) > +{ > + > + if (size <=3D MCLBYTES) > + return (MCLBYTES); > + else > + return (MJUMPAGESIZE); > +} > + > static void > iflib_calc_rx_mbuf_sz(if_ctx_t ctx) > { > @@ -2362,10 +2383,8 @@ iflib_calc_rx_mbuf_sz(if_ctx_t ctx) > * XXX don't set the max_frame_size to larger > * than the hardware can handle > */ > - if (sctx->isc_max_frame_size <=3D MCLBYTES) > - ctx->ifc_rx_mbuf_sz =3D MCLBYTES; > - else > - ctx->ifc_rx_mbuf_sz =3D MJUMPAGESIZE; > + ctx->ifc_rx_mbuf_sz =3D > + iflib_get_mbuf_size_for(sctx->isc_max_frame_size); > } >=20 > uint32_t > @@ -2578,7 +2597,6 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t = irf, int > cidx =3D irf->irf_idx; > fl =3D &rxq->ifr_fl[flid]; > sd->ifsd_fl =3D fl; > - sd->ifsd_cidx =3D cidx; > sd->ifsd_m =3D &fl->ifl_sds.ifsd_m[cidx]; > sd->ifsd_cl =3D &fl->ifl_sds.ifsd_cl[cidx]; > fl->ifl_credits--; > @@ -2590,12 +2608,10 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t = irf, int > next =3D (cidx + CACHE_PTR_INCREMENT) & (fl->ifl_size-1); > prefetch(&fl->ifl_sds.ifsd_map[next]); > map =3D fl->ifl_sds.ifsd_map[cidx]; > - next =3D (cidx + CACHE_LINE_SIZE) & (fl->ifl_size-1); >=20 > - /* not valid assert if bxe really does SGE from non-contiguous = elements */ > - MPASS(fl->ifl_cidx =3D=3D cidx); > bus_dmamap_sync(fl->ifl_buf_tag, map, BUS_DMASYNC_POSTREAD); > - if (unload) > + > + if (unload && irf->irf_len !=3D 0) > bus_dmamap_unload(fl->ifl_buf_tag, map); > fl->ifl_cidx =3D (fl->ifl_cidx + 1) & (fl->ifl_size-1); > if (__predict_false(fl->ifl_cidx =3D=3D 0)) > @@ -2667,6 +2683,7 @@ iflib_rxd_pkt_get(iflib_rxq_t rxq, if_rxd_info_t = ri) >=20 > /* should I merge this back in now that the two paths are = basically duplicated? */ > if (ri->iri_nfrags =3D=3D 1 && > + ri->iri_frags[0].irf_len !=3D 0 && > ri->iri_frags[0].irf_len <=3D MIN(IFLIB_RX_COPY_THRESH, = MHLEN)) { > rxd_frag_to_sd(rxq, &ri->iri_frags[0], FALSE, &sd); > m =3D *sd.ifsd_m; > @@ -2680,6 +2697,8 @@ iflib_rxd_pkt_get(iflib_rxq_t rxq, if_rxd_info_t = ri) > m->m_len =3D ri->iri_frags[0].irf_len; > } else { > m =3D assemble_segments(rxq, ri, &sd); > + if (m =3D=3D NULL) > + return (NULL); > } > m->m_pkthdr.len =3D ri->iri_len; > m->m_pkthdr.rcvif =3D ri->iri_ifp; > @@ -2780,7 +2799,7 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) > cidxp =3D &rxq->ifr_fl[0].ifl_cidx; > if ((avail =3D iflib_rxd_avail(ctx, rxq, *cidxp, budget)) =3D=3D = 0) { > for (i =3D 0, fl =3D &rxq->ifr_fl[0]; i < sctx->isc_nfl; = i++, fl++) > - retval |=3D __iflib_fl_refill_lt(ctx, fl, budget = + 8); > + retval |=3D __iflib_fl_refill_all(ctx, fl); > DBG_COUNTER_INC(rx_unavail); > return (retval); > } > @@ -2836,7 +2855,7 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) > } > /* make sure that we can refill faster than drain */ > for (i =3D 0, fl =3D &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, = fl++) > - retval |=3D __iflib_fl_refill_lt(ctx, fl, budget + 8); > + retval |=3D __iflib_fl_refill_all(ctx, fl); >=20 > lro_enabled =3D (if_getcapenable(ifp) & IFCAP_LRO); > if (lro_enabled) > @@ -6702,6 +6721,9 @@ iflib_add_device_sysctl_post(if_ctx_t ctx) > SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, = "credits", > CTLFLAG_RD, > &fl->ifl_credits, 1, "credits = available"); > + SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, = "buf_size", > + CTLFLAG_RD, > + &fl->ifl_buf_size, 1, "buffer = size"); > #if MEMORY_LOGGING > SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, = "fl_m_enqueued", > CTLFLAG_RD, >=20 > Modified: stable/12/sys/net/iflib.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- stable/12/sys/net/iflib.h Tue Aug 4 15:27:32 2020 = (r363843) > +++ stable/12/sys/net/iflib.h Tue Aug 4 15:48:12 2020 = (r363844) > @@ -221,6 +221,9 @@ typedef struct if_softc_ctx { > uint32_t isc_tx_qdepth; >=20 > iflib_intr_mode_t isc_intr; > + uint16_t isc_rxd_buf_size[8]; /* set at init time by driver, 0 > + means use iflib-calculated size > + based on isc_max_frame_size */ > uint16_t isc_max_frame_size; /* set at init time by driver */ > uint16_t isc_min_frame_size; /* set at init time by driver, only = used if > IFLIB_NEED_ETHER_PAD is set. */ > _______________________________________________ > svn-src-all@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" --- PGP Key : http://www.marcuscom.com/pgp.asc