From owner-svn-src-user@freebsd.org Wed Apr 11 14:38:57 2018 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C9E55F9983A for ; Wed, 11 Apr 2018 14:38:57 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 766C384C9A; Wed, 11 Apr 2018 14:38:57 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 716C51D7A5; Wed, 11 Apr 2018 14:38:57 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w3BEcv9N028601; Wed, 11 Apr 2018 14:38:57 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w3BEcuRG028591; Wed, 11 Apr 2018 14:38:56 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201804111438.w3BEcuRG028591@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Wed, 11 Apr 2018 14:38:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r332407 - in user/markj/netdump/sys: dev/alc dev/bge dev/bxe dev/cxgb dev/mlx4/mlx4_en dev/re dev/virtio/network net netinet/netdump X-SVN-Group: user X-SVN-Commit-Author: markj X-SVN-Commit-Paths: in user/markj/netdump/sys: dev/alc dev/bge dev/bxe dev/cxgb dev/mlx4/mlx4_en dev/re dev/virtio/network net netinet/netdump X-SVN-Commit-Revision: 332407 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Apr 2018 14:38:58 -0000 Author: markj Date: Wed Apr 11 14:38:56 2018 New Revision: 332407 URL: https://svnweb.freebsd.org/changeset/base/332407 Log: Let the driver specify the required number of netdump clusters. In most cases, NETDUMP_MAX_IN_FLIGHT (64) is sufficient. However, the iflib and cxgb rx buffer allocation schemes have an edge case which make this insufficient. Both drivers allocate mbufs and clusters separately and keep them in separate arrays. If a received packet can fit in the mbuf, the cluster at the corresponding index is not consumed and will simply be left alone until the consumer wraps around. netdump ACKs fit in an mbuf's inline buffer, so the clusters are generally not used at all. However, if the drivers fail to allocate a cluster for a given producer index, they will not replenish the mbuf either, so unless there are enough pre-allocated clusters for the whole ring (which almost certainly has more than 64 entries), we quickly stop being able to receive packets. For these drivers, be sure to pre-allocate enough clusters to avoid the problem. This is quite wasteful but is the simplest path forward for now. Other drivers continue to pre-allocate 64 clusters. Modified: user/markj/netdump/sys/dev/alc/if_alc.c user/markj/netdump/sys/dev/bge/if_bge.c user/markj/netdump/sys/dev/bxe/bxe.c user/markj/netdump/sys/dev/cxgb/cxgb_main.c user/markj/netdump/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c user/markj/netdump/sys/dev/re/if_re.c user/markj/netdump/sys/dev/virtio/network/if_vtnet.c user/markj/netdump/sys/net/iflib.c user/markj/netdump/sys/netinet/netdump/netdump.h user/markj/netdump/sys/netinet/netdump/netdump_client.c Modified: user/markj/netdump/sys/dev/alc/if_alc.c ============================================================================== --- user/markj/netdump/sys/dev/alc/if_alc.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/alc/if_alc.c Wed Apr 11 14:38:56 2018 (r332407) @@ -4658,7 +4658,7 @@ sysctl_hw_alc_int_mod(SYSCTL_HANDLER_ARGS) #ifdef NETDUMP static void -alc_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +alc_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { struct alc_softc *sc; @@ -4666,6 +4666,7 @@ alc_netdump_init(struct ifnet *ifp, int *nrxr, int *cl KASSERT(sc->alc_buf_size <= MCLBYTES, ("incorrect cluster size")); *nrxr = ALC_RX_RING_CNT; + *ncl = NETDUMP_MAX_IN_FLIGHT; *clsize = MCLBYTES; } Modified: user/markj/netdump/sys/dev/bge/if_bge.c ============================================================================== --- user/markj/netdump/sys/dev/bge/if_bge.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/bge/if_bge.c Wed Apr 11 14:38:56 2018 (r332407) @@ -6811,13 +6811,14 @@ bge_get_counter(if_t ifp, ift_counter cnt) #ifdef NETDUMP static void -bge_netdump_init(if_t ifp, int *nrxr, int *clsize) +bge_netdump_init(if_t ifp, int *nrxr, int *ncl, int *clsize) { struct bge_softc *sc; sc = if_getsoftc(ifp); BGE_LOCK(sc); *nrxr = sc->bge_return_ring_cnt; + *ncl = NETDUMP_MAX_IN_FLIGHT; if ((sc->bge_flags & BGE_FLAG_JUMBO_STD) != 0 && (if_getmtu(sc->bge_ifp) + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN > (MCLBYTES - ETHER_ALIGN))) Modified: user/markj/netdump/sys/dev/bxe/bxe.c ============================================================================== --- user/markj/netdump/sys/dev/bxe/bxe.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/bxe/bxe.c Wed Apr 11 14:38:56 2018 (r332407) @@ -19172,13 +19172,14 @@ bxe_eioctl(struct cdev *dev, u_long cmd, caddr_t data, #ifdef NETDUMP static void -bxe_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +bxe_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { struct bxe_softc *sc; sc = if_getsoftc(ifp); BXE_CORE_LOCK(sc); *nrxr = sc->num_queues; + *ncl = NETDUMP_MAX_IN_FLIGHT; *clsize = sc->fp[0].mbuf_alloc_size; BXE_CORE_UNLOCK(sc); } Modified: user/markj/netdump/sys/dev/cxgb/cxgb_main.c ============================================================================== --- user/markj/netdump/sys/dev/cxgb/cxgb_main.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/cxgb/cxgb_main.c Wed Apr 11 14:38:56 2018 (r332407) @@ -3587,7 +3587,7 @@ cxgbc_mod_event(module_t mod, int cmd, void *arg) #ifdef NETDUMP static void -cxgb_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +cxgb_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { struct port_info *pi; adapter_t *adap; @@ -3596,6 +3596,7 @@ cxgb_netdump_init(struct ifnet *ifp, int *nrxr, int *c adap = pi->adapter; ADAPTER_LOCK(adap); *nrxr = SGE_QSETS; + *ncl = adap->sge.qs[0].fl[1].size; *clsize = adap->sge.qs[0].fl[1].buf_size; ADAPTER_UNLOCK(adap); } Modified: user/markj/netdump/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c ============================================================================== --- user/markj/netdump/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Wed Apr 11 14:38:56 2018 (r332407) @@ -2886,13 +2886,14 @@ static void mlx4_en_sysctl_stat(struct mlx4_en_priv *p #ifdef NETDUMP static void -mlx4_en_netdump_init(struct ifnet *dev, int *nrxr, int *clsize) +mlx4_en_netdump_init(struct ifnet *dev, int *nrxr, int *ncl, int *clsize) { struct mlx4_en_priv *priv; priv = if_getsoftc(dev); mutex_lock(&priv->mdev->state_lock); *nrxr = priv->rx_ring_num; + *ncl = NETDUMP_MAX_IN_FLIGHT; *clsize = priv->rx_mb_size; mutex_unlock(&priv->mdev->state_lock); } Modified: user/markj/netdump/sys/dev/re/if_re.c ============================================================================== --- user/markj/netdump/sys/dev/re/if_re.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/re/if_re.c Wed Apr 11 14:38:56 2018 (r332407) @@ -4095,13 +4095,14 @@ sysctl_hw_re_int_mod(SYSCTL_HANDLER_ARGS) #ifdef NETDUMP static void -re_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +re_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { struct rl_softc *sc; sc = if_getsoftc(ifp); RL_LOCK(sc); *nrxr = sc->rl_ldata.rl_rx_desc_cnt; + *ncl = NETDUMP_MAX_IN_FLIGHT; *clsize = (ifp->if_mtu > RL_MTU && (sc->rl_flags & RL_FLAG_JUMBOV2) != 0) ? MJUM9BYTES : MCLBYTES; RL_UNLOCK(sc); Modified: user/markj/netdump/sys/dev/virtio/network/if_vtnet.c ============================================================================== --- user/markj/netdump/sys/dev/virtio/network/if_vtnet.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/dev/virtio/network/if_vtnet.c Wed Apr 11 14:38:56 2018 (r332407) @@ -3984,7 +3984,7 @@ vtnet_tunable_int(struct vtnet_softc *sc, const char * #ifdef NETDUMP static void -vtnet_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +vtnet_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { struct vtnet_softc *sc; @@ -3992,6 +3992,7 @@ vtnet_netdump_init(struct ifnet *ifp, int *nrxr, int * VTNET_CORE_LOCK(sc); *nrxr = sc->vtnet_max_vq_pairs; + *ncl = NETDUMP_MAX_IN_FLIGHT; *clsize = sc->vtnet_rx_clsize; VTNET_CORE_UNLOCK(sc); Modified: user/markj/netdump/sys/net/iflib.c ============================================================================== --- user/markj/netdump/sys/net/iflib.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/net/iflib.c Wed Apr 11 14:38:56 2018 (r332407) @@ -5974,13 +5974,14 @@ iflib_fixup_rx(struct mbuf *m) #ifdef NETDUMP static void -iflib_netdump_init(struct ifnet *ifp, int *nrxr, int *clsize) +iflib_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) { if_ctx_t ctx; ctx = if_getsoftc(ifp); CTX_LOCK(ctx); *nrxr = NRXQSETS(ctx); + *ncl = ctx->ifc_rxqs[0].ifr_fl->ifl_size; *clsize = ctx->ifc_rxqs[0].ifr_fl->ifl_buf_size; CTX_UNLOCK(ctx); } Modified: user/markj/netdump/sys/netinet/netdump/netdump.h ============================================================================== --- user/markj/netdump/sys/netinet/netdump/netdump.h Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/netinet/netdump/netdump.h Wed Apr 11 14:38:56 2018 (r332407) @@ -88,7 +88,7 @@ struct mbuf; void netdump_reinit(struct ifnet *); -typedef void netdump_init_t(struct ifnet *, int *nrxr, int *clsize); +typedef void netdump_init_t(struct ifnet *, int *nrxr, int *ncl, int *clsize); typedef void netdump_event_t(struct ifnet *, enum netdump_ev); typedef int netdump_transmit_t(struct ifnet *, struct mbuf *); typedef int netdump_poll_t(struct ifnet *, int); Modified: user/markj/netdump/sys/netinet/netdump/netdump_client.c ============================================================================== --- user/markj/netdump/sys/netinet/netdump/netdump_client.c Wed Apr 11 14:24:11 2018 (r332406) +++ user/markj/netdump/sys/netinet/netdump/netdump_client.c Wed Apr 11 14:38:56 2018 (r332407) @@ -1081,21 +1081,21 @@ netdump_configure(struct netdump_conf *conf) void netdump_reinit(struct ifnet *ifp) { - int clsize, nmbuf, nclust, nrxr; + int clsize, nmbuf, ncl, nrxr; if (ifp != nd_ifp) return; - ifp->if_netdump_methods->nd_init(ifp, &nrxr, &clsize); + ifp->if_netdump_methods->nd_init(ifp, &nrxr, &ncl, &clsize); KASSERT(nrxr > 0, ("invalid receive ring count %d", nrxr)); /* * We need two headers per message on the transmit side. Multiply by * four to give us some breathing room. */ - nmbuf = NETDUMP_MAX_IN_FLIGHT * (4 + nrxr); - nclust = NETDUMP_MAX_IN_FLIGHT * nrxr; - netdump_mbuf_reinit(nmbuf, nclust, clsize); + nmbuf = ncl * (4 + nrxr); + ncl *= nrxr; + netdump_mbuf_reinit(nmbuf, ncl, clsize); } /*