Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Mar 2016 13:23:43 +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: r297453 - head/sys/dev/vnic
Message-ID:  <201603311323.u2VDNhrp095132@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: zbb
Date: Thu Mar 31 13:23:43 2016
New Revision: 297453
URL: https://svnweb.freebsd.org/changeset/base/297453

Log:
  Don't omit m_dup() for non-writeable mbufs that need checksum calculation
  
  If the driver is not active or link is down the packet could remain
  non-writeable. This commit makes all mbufs enqueued to the driver's
  ring buffer to have correct attributes.
  
  Pointed out by: wma
  Reviewed by:    wma
  Obtained from:  Semihalf
  Sponsored by:   Cavium
  Differential Revision: https://reviews.freebsd.org/D5800

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

Modified: head/sys/dev/vnic/nicvf_main.c
==============================================================================
--- head/sys/dev/vnic/nicvf_main.c	Thu Mar 31 13:20:02 2016	(r297452)
+++ head/sys/dev/vnic/nicvf_main.c	Thu Mar 31 13:23:43 2016	(r297453)
@@ -661,12 +661,6 @@ nicvf_if_transmit(struct ifnet *ifp, str
 
 	sq = &qs->sq[qidx];
 
-	if (((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
-	    IFF_DRV_RUNNING) || !nic->link_up) {
-		err = drbr_enqueue(ifp, sq->br, mbuf);
-		return (err);
-	}
-
 	if (mbuf->m_next != NULL &&
 	    (mbuf->m_pkthdr.csum_flags &
 	    (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_SCTP)) != 0) {
@@ -680,8 +674,15 @@ nicvf_if_transmit(struct ifnet *ifp, str
 	}
 
 	err = drbr_enqueue(ifp, sq->br, mbuf);
-	if (err != 0)
+	if (((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING) || !nic->link_up || (err != 0)) {
+		/*
+		 * Try to enqueue packet to the ring buffer.
+		 * If the driver is not active, link down or enqueue operation
+		 * failed, return with the appropriate error code.
+		 */
 		return (err);
+	}
 
 	if (NICVF_TX_TRYLOCK(sq) != 0) {
 		err = nicvf_xmit_locked(sq);



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