Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Nov 2016 06:28:29 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r308633 - stable/11/sys/dev/hyperv/vmbus
Message-ID:  <201611140628.uAE6STTr026056@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Mon Nov 14 06:28:29 2016
New Revision: 308633
URL: https://svnweb.freebsd.org/changeset/base/308633

Log:
  MFC 308168
  
      hyperv/vmbus: Avoid extra header copy.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D8395

Modified:
  stable/11/sys/dev/hyperv/vmbus/vmbus_chan.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/hyperv/vmbus/vmbus_chan.c
==============================================================================
--- stable/11/sys/dev/hyperv/vmbus/vmbus_chan.c	Mon Nov 14 06:25:22 2016	(r308632)
+++ stable/11/sys/dev/hyperv/vmbus/vmbus_chan.c	Mon Nov 14 06:28:29 2016	(r308633)
@@ -926,28 +926,28 @@ vmbus_chan_recv(struct vmbus_channel *ch
 
 int
 vmbus_chan_recv_pkt(struct vmbus_channel *chan,
-    struct vmbus_chanpkt_hdr *pkt0, int *pktlen0)
+    struct vmbus_chanpkt_hdr *pkt, int *pktlen0)
 {
-	struct vmbus_chanpkt_hdr pkt;
-	int error, pktlen;
+	int error, pktlen, pkt_hlen;
 
-	error = vmbus_rxbr_peek(&chan->ch_rxbr, &pkt, sizeof(pkt));
+	pkt_hlen = sizeof(*pkt);
+	error = vmbus_rxbr_peek(&chan->ch_rxbr, pkt, pkt_hlen);
 	if (error)
 		return (error);
 
-	if (__predict_false(pkt.cph_hlen < VMBUS_CHANPKT_HLEN_MIN)) {
-		vmbus_chan_printf(chan, "invalid hlen %u\n", pkt.cph_hlen);
+	if (__predict_false(pkt->cph_hlen < VMBUS_CHANPKT_HLEN_MIN)) {
+		vmbus_chan_printf(chan, "invalid hlen %u\n", pkt->cph_hlen);
 		/* XXX this channel is dead actually. */
 		return (EIO);
 	}
-	if (__predict_false(pkt.cph_hlen > pkt.cph_tlen)) {
+	if (__predict_false(pkt->cph_hlen > pkt->cph_tlen)) {
 		vmbus_chan_printf(chan, "invalid hlen %u and tlen %u\n",
-		    pkt.cph_hlen, pkt.cph_tlen);
+		    pkt->cph_hlen, pkt->cph_tlen);
 		/* XXX this channel is dead actually. */
 		return (EIO);
 	}
 
-	pktlen = VMBUS_CHANPKT_GETLEN(pkt.cph_tlen);
+	pktlen = VMBUS_CHANPKT_GETLEN(pkt->cph_tlen);
 	if (*pktlen0 < pktlen) {
 		/* Return the size of this packet. */
 		*pktlen0 = pktlen;
@@ -955,8 +955,12 @@ vmbus_chan_recv_pkt(struct vmbus_channel
 	}
 	*pktlen0 = pktlen;
 
-	/* Include packet header */
-	error = vmbus_rxbr_read(&chan->ch_rxbr, pkt0, pktlen, 0);
+	/*
+	 * Skip the fixed-size packet header, which has been filled
+	 * by the above vmbus_rxbr_peek().
+	 */
+	error = vmbus_rxbr_read(&chan->ch_rxbr, pkt + 1,
+	    pktlen - pkt_hlen, pkt_hlen);
 	KASSERT(!error, ("vmbus_rxbr_read failed"));
 
 	return (0);



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