svn commit: r261395 - head/sys/dev/virtio/network

Bryan Venteicher bryanv at FreeBSD.org
Sun Feb 2 05:20:47 UTC 2014


Author: bryanv
Date: Sun Feb  2 05:20:46 2014
New Revision: 261395
URL: http://svnweb.freebsd.org/changeset/base/261395

Log:
  Use m_defrag() instead of m_collapse() to compact a long mbuf chain
  
  This should be an infrequent occurrence, so remove the per-queue
  counters in favor of just global counters in the softc.

Modified:
  head/sys/dev/virtio/network/if_vtnet.c
  head/sys/dev/virtio/network/if_vtnetvar.h

Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c	Sun Feb  2 05:15:36 2014	(r261394)
+++ head/sys/dev/virtio/network/if_vtnet.c	Sun Feb  2 05:20:46 2014	(r261395)
@@ -2071,33 +2071,30 @@ vtnet_txq_enqueue_buf(struct vtnet_txq *
 	struct virtqueue *vq;
 	struct sglist *sg;
 	struct mbuf *m;
-	int collapsed, error;
+	int error;
 
 	sc = txq->vtntx_sc;
 	vq = txq->vtntx_vq;
 	sg = txq->vtntx_sg;
 	m = *m_head;
-	collapsed = 0;
 
 	sglist_reset(sg);
 	error = sglist_append(sg, &txhdr->vth_uhdr, sc->vtnet_hdr_size);
 	KASSERT(error == 0 && sg->sg_nseg == 1,
 	    ("%s: error %d adding header to sglist", __func__, error));
 
-again:
 	error = sglist_append_mbuf(sg, m);
 	if (error) {
-		if (collapsed)
-			goto fail;
-
-		m = m_collapse(m, M_NOWAIT, sc->vtnet_tx_nsegs - 1);
+		m = m_defrag(m, M_NOWAIT);
 		if (m == NULL)
 			goto fail;
 
 		*m_head = m;
-		collapsed = 1;
-		txq->vtntx_stats.vtxs_collapsed++;
-		goto again;
+		sc->vtnet_stats.tx_defragged++;
+
+		error = sglist_append_mbuf(sg, m);
+		if (error)
+			goto fail;
 	}
 
 	txhdr->vth_mbuf = m;
@@ -2106,6 +2103,7 @@ again:
 	return (error);
 
 fail:
+	sc->vtnet_stats.tx_defrag_failed++;
 	m_freem(*m_head);
 	*m_head = NULL;
 
@@ -2550,7 +2548,6 @@ vtnet_txq_accum_stats(struct vtnet_txq *
 	accum->vtxs_obytes += st->vtxs_obytes;
 	accum->vtxs_csum += st->vtxs_csum;
 	accum->vtxs_tso += st->vtxs_tso;
-	accum->vtxs_collapsed += st->vtxs_collapsed;
 	accum->vtxs_rescheduled += st->vtxs_rescheduled;
 }
 
@@ -3631,8 +3628,6 @@ vtnet_setup_txq_sysctl(struct sysctl_ctx
 	    &stats->vtxs_csum, "Transmit checksum offloaded");
 	SYSCTL_ADD_UQUAD(ctx, list, OID_AUTO, "tso", CTLFLAG_RD,
 	    &stats->vtxs_tso, "Transmit segmentation offloaded");
-	SYSCTL_ADD_UQUAD(ctx, list, OID_AUTO, "collapsed", CTLFLAG_RD,
-	    &stats->vtxs_collapsed, "Transmit mbufs collapsed");
 	SYSCTL_ADD_UQUAD(ctx, list, OID_AUTO, "rescheduled", CTLFLAG_RD,
 	    &stats->vtxs_rescheduled,
 	    "Transmit interrupt handler rescheduled");
@@ -3712,6 +3707,12 @@ vtnet_setup_stat_sysctl(struct sysctl_ct
 	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_tso_not_tcp",
 	    CTLFLAG_RD, &stats->tx_tso_not_tcp,
 	    "Aborted transmit of TSO buffer with non TCP protocol");
+	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_defragged",
+	    CTLFLAG_RD, &stats->tx_defragged,
+	    "Transmit mbufs defragged");
+	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_defrag_failed",
+	    CTLFLAG_RD, &stats->tx_defrag_failed,
+	    "Aborted transmit of buffer because defrag failed");
 	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "tx_csum_offloaded",
 	    CTLFLAG_RD, &stats->tx_csum_offloaded,
 	    "Offloaded checksum of transmitted buffer");

Modified: head/sys/dev/virtio/network/if_vtnetvar.h
==============================================================================
--- head/sys/dev/virtio/network/if_vtnetvar.h	Sun Feb  2 05:15:36 2014	(r261394)
+++ head/sys/dev/virtio/network/if_vtnetvar.h	Sun Feb  2 05:20:46 2014	(r261395)
@@ -44,6 +44,8 @@ struct vtnet_statistics {
 	uint64_t	tx_csum_bad_ethtype;
 	uint64_t	tx_tso_bad_ethtype;
 	uint64_t	tx_tso_not_tcp;
+	uint64_t	tx_defragged;
+	uint64_t	tx_defrag_failed;
 
 	/*
 	 * These are accumulated from each Rx/Tx queue.
@@ -92,7 +94,6 @@ struct vtnet_txq_stats {
 	uint64_t vtxs_omcasts;	/* if_omcasts */
 	uint64_t vtxs_csum;
 	uint64_t vtxs_tso;
-	uint64_t vtxs_collapsed;
 	uint64_t vtxs_rescheduled;
 };
 


More information about the svn-src-all mailing list