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);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to