Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Sep 2012 12:48:04 +0400
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        Andrew Thompson <thompsa@FreeBSD.org>
Cc:        net@FreeBSD.org
Subject:   Re: [CFT] if_transmit method for lagg(4)
Message-ID:  <20120920084804.GY85604@glebius.int.ru>
In-Reply-To: <CAFAOGNTE_HO4TScR0ztUihbs%2BfXeP6_jENvWTcnudK65J=1%2B-Q@mail.gmail.com>
References:  <20120920074730.GS85604@FreeBSD.org> <CAFAOGNTE_HO4TScR0ztUihbs%2BfXeP6_jENvWTcnudK65J=1%2B-Q@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--poJSiGMzRSvrLGLs
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline

  Hi!

On Thu, Sep 20, 2012 at 08:37:19PM +1200, Andrew Thompson wrote:
A> >   Yet another patch to test. Was suprising to me that lagg(4), which
A> > aims at high-performance, still utilizes if_start.
A> >
A> >   Attached is patch that converts lagg(4) to use if_transmit. I'd
A> > appreciate if someone who do use lagg(4) tests the patch. If anyone
A> > benchmarks lagg(4) with and w/o patch that will be most appreciated.
A> 
A> Sean Bruno has already tested this patch at Yahoo, I have just been
A> delayed in committing it. There are just a few small differences so we
A> can commit one or merge.

Also fabient@ replied to me in private with this patch :)

Hmm, I've missed stats update. I have merge statistics updates from your patch
to mine and here it is attached.

-- 
Totus tuus, Glebius.

--poJSiGMzRSvrLGLs
Content-Type: text/x-diff; charset=koi8-r
Content-Disposition: attachment; filename="if_lagg.c.diff"

Index: if_lagg.c
===================================================================
--- if_lagg.c	(revision 240735)
+++ if_lagg.c	(working copy)
@@ -110,7 +110,8 @@
 static	int	lagg_setflag(struct lagg_port *, int, int,
 		    int (*func)(struct ifnet *, int));
 static	int	lagg_setflags(struct lagg_port *, int status);
-static void	lagg_start(struct ifnet *);
+static int	lagg_transmit(struct ifnet *i, struct mbuf *);
+static void	lagg_qflush(struct ifnet *);
 static int	lagg_media_change(struct ifnet *);
 static void	lagg_media_status(struct ifnet *, struct ifmediareq *);
 static struct lagg_port *lagg_link_active(struct lagg_softc *,
@@ -312,15 +313,12 @@
 
 	if_initname(ifp, ifc->ifc_name, unit);
 	ifp->if_softc = sc;
-	ifp->if_start = lagg_start;
+	ifp->if_transmit = lagg_transmit;
+	ifp->if_qflush = lagg_qflush;
 	ifp->if_init = lagg_init;
 	ifp->if_ioctl = lagg_ioctl;
 	ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST;
 
-	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
-	ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
-	IFQ_SET_READY(&ifp->if_snd);
-
 	/*
 	 * Attach as an ordinary ethernet device, children will be attached
 	 * as special device IFT_IEEE8023ADLAG.
@@ -1222,37 +1220,47 @@
 	return (0);
 }
 
-static void
-lagg_start(struct ifnet *ifp)
+static int
+lagg_transmit(struct ifnet *ifp, struct mbuf *m)
 {
 	struct lagg_softc *sc = (struct lagg_softc *)ifp->if_softc;
-	struct mbuf *m;
-	int error = 0;
+	int error, len, mcast;
 
+	len = m->m_pkthdr.len;
+	mcast = (m->m_flags & (M_MCAST | M_BCAST)) ? 1 : 0;
+
 	LAGG_RLOCK(sc);
 	/* We need a Tx algorithm and at least one port */
 	if (sc->sc_proto == LAGG_PROTO_NONE || sc->sc_count == 0) {
-		IF_DRAIN(&ifp->if_snd);
 		LAGG_RUNLOCK(sc);
-		return;
+		m_freem(m);
+		ifp->if_oerrors++;
+		return (ENXIO);
 	}
 
-	for (;; error = 0) {
-		IFQ_DEQUEUE(&ifp->if_snd, m);
-		if (m == NULL)
-			break;
+	ETHER_BPF_MTAP(ifp, m);
 
-		ETHER_BPF_MTAP(ifp, m);
+	error = (*sc->sc_start)(sc, m);
+	LAGG_RUNLOCK(sc);
 
-		error = (*sc->sc_start)(sc, m);
-		if (error == 0)
-			ifp->if_opackets++;
-		else
-			ifp->if_oerrors++;
-	}
-	LAGG_RUNLOCK(sc);
+	if (error == 0) {
+		ifp->if_opackets++;
+		ifp->if_omcasts += mcast;
+		ifp->if_obytes += len;
+	} else
+		ifp->if_oerrors++;
+
+	return (error);
 }
 
+/*
+ * The ifp->if_qflush entry point for lagg(4) is no-op.
+ */
+static void
+lagg_qflush(struct ifnet *ifp __unused)
+{
+}
+
 static struct mbuf *
 lagg_input(struct ifnet *ifp, struct mbuf *m)
 {

--poJSiGMzRSvrLGLs--



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