Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Feb 2016 14:23:02 +0000 (UTC)
From:      Zbigniew Bodek <zbb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r296035 - head/sys/dev/vnic
Message-ID:  <201602251423.u1PEN2Fg063397@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: zbb
Date: Thu Feb 25 14:23:02 2016
New Revision: 296035
URL: https://svnweb.freebsd.org/changeset/base/296035

Log:
  Improve VNIC performance on Tx path by immediate packet transmission
  
  Don't postpone Tx if the Tx lock can be acquired now.
  This gives 3x better performance on egress.
  
  Reviewed by:   wma
  Obtained from: Semihalf
  Sponsored by:  Cavium
  Differential Revision: https://reviews.freebsd.org/D5325

Modified:
  head/sys/dev/vnic/nicvf_main.c
  head/sys/dev/vnic/nicvf_queues.c
  head/sys/dev/vnic/nicvf_queues.h

Modified: head/sys/dev/vnic/nicvf_main.c
==============================================================================
--- head/sys/dev/vnic/nicvf_main.c	Thu Feb 25 14:21:04 2016	(r296034)
+++ head/sys/dev/vnic/nicvf_main.c	Thu Feb 25 14:23:02 2016	(r296035)
@@ -663,11 +663,18 @@ nicvf_if_transmit(struct ifnet *ifp, str
 			mbuf = mtmp;
 		}
 	}
+
+	if (NICVF_TX_TRYLOCK(sq) != 0) {
+		err = nicvf_tx_mbuf_locked(sq, mbuf);
+		NICVF_TX_UNLOCK(sq);
+		return (err);
+	} else {
 		err = drbr_enqueue(ifp, sq->br, mbuf);
 		if (err != 0)
 			return (err);
 
-	taskqueue_enqueue(sq->snd_taskq, &sq->snd_task);
+		taskqueue_enqueue(sq->snd_taskq, &sq->snd_task);
+	}
 
 	return (0);
 }

Modified: head/sys/dev/vnic/nicvf_queues.c
==============================================================================
--- head/sys/dev/vnic/nicvf_queues.c	Thu Feb 25 14:21:04 2016	(r296034)
+++ head/sys/dev/vnic/nicvf_queues.c	Thu Feb 25 14:23:02 2016	(r296035)
@@ -98,7 +98,6 @@ __FBSDID("$FreeBSD$");
 MALLOC_DECLARE(M_NICVF);
 
 static void nicvf_free_snd_queue(struct nicvf *, struct snd_queue *);
-static int nicvf_tx_mbuf_locked(struct snd_queue *, struct mbuf *);
 static struct mbuf * nicvf_get_rcv_mbuf(struct nicvf *, struct cqe_rx_t *);
 static void nicvf_sq_disable(struct nicvf *, int);
 static void nicvf_sq_enable(struct nicvf *, struct snd_queue *, int);
@@ -1856,7 +1855,7 @@ static inline void nicvf_sq_add_gather_s
 }
 
 /* Put an mbuf to a SQ for packet transfer. */
-static int
+int
 nicvf_tx_mbuf_locked(struct snd_queue *sq, struct mbuf *mbuf)
 {
 	bus_dma_segment_t segs[256];

Modified: head/sys/dev/vnic/nicvf_queues.h
==============================================================================
--- head/sys/dev/vnic/nicvf_queues.h	Thu Feb 25 14:21:04 2016	(r296034)
+++ head/sys/dev/vnic/nicvf_queues.h	Thu Feb 25 14:23:02 2016	(r296035)
@@ -385,6 +385,8 @@ void nicvf_disable_intr(struct nicvf *, 
 void nicvf_clear_intr(struct nicvf *, int, int);
 int nicvf_is_intr_enabled(struct nicvf *, int, int);
 
+int nicvf_tx_mbuf_locked(struct snd_queue *, struct mbuf *);
+
 /* Register access APIs */
 void nicvf_reg_write(struct nicvf *, uint64_t, uint64_t);
 uint64_t nicvf_reg_read(struct nicvf *, uint64_t);



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