Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Apr 2018 14:38:56 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
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
Message-ID:  <201804111438.w3BEcuRG028591@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804111438.w3BEcuRG028591>