svn commit: r296035 - head/sys/dev/vnic
Zbigniew Bodek
zbb at FreeBSD.org
Thu Feb 25 14:23:03 UTC 2016
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);
More information about the svn-src-all
mailing list