Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Oct 2016 09:00: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: r307309 - stable/11/sys/dev/hyperv/vmbus
Message-ID:  <201610140900.u9E90TXo001911@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Fri Oct 14 09:00:29 2016
New Revision: 307309
URL: https://svnweb.freebsd.org/changeset/base/307309

Log:
  MFC 302710,302713
  
  302710
      hyperv/vmbus: Remove unnecessary callback check.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7046
  
  302713
      hyperv/vmbus: Install different task function for batch/non-batch channels
  
      This avoids bunch of unnecessary checks on hot path and simplifies the
      channel processing.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7085

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

Modified: stable/11/sys/dev/hyperv/vmbus/hv_channel.c
==============================================================================
--- stable/11/sys/dev/hyperv/vmbus/hv_channel.c	Fri Oct 14 08:55:49 2016	(r307308)
+++ stable/11/sys/dev/hyperv/vmbus/hv_channel.c	Fri Oct 14 09:00:29 2016	(r307309)
@@ -51,9 +51,10 @@ __FBSDID("$FreeBSD$");
 #include <dev/hyperv/vmbus/vmbus_var.h>
 
 static void 	vmbus_channel_set_event(hv_vmbus_channel* channel);
-static void	VmbusProcessChannelEvent(void* channel, int pending);
 static void	vmbus_chan_update_evtflagcnt(struct vmbus_softc *,
 		    const struct hv_vmbus_channel *);
+static void	vmbus_chan_task(void *, int);
+static void	vmbus_chan_task_nobatch(void *, int);
 
 /**
  *  @brief Trigger an event notification on the specified channel
@@ -213,7 +214,13 @@ hv_vmbus_channel_open(
 
 	new_channel->rxq = VMBUS_PCPU_GET(new_channel->vmbus_sc, event_tq,
 	    new_channel->target_cpu);
-	TASK_INIT(&new_channel->channel_task, 0, VmbusProcessChannelEvent, new_channel);
+	if (new_channel->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD) {
+		TASK_INIT(&new_channel->channel_task, 0,
+		    vmbus_chan_task, new_channel);
+	} else {
+		TASK_INIT(&new_channel->channel_task, 0,
+		    vmbus_chan_task_nobatch, new_channel);
+	}
 
 	/* Allocate the ring buffer */
 	out = contigmalloc((send_ring_buffer_size + recv_ring_buffer_size),
@@ -846,46 +853,48 @@ hv_vmbus_channel_recv_packet_raw(
 	return (0);
 }
 
-
-/**
- * Process a channel event notification
- */
 static void
-VmbusProcessChannelEvent(void* context, int pending)
+vmbus_chan_task(void *xchan, int pending __unused)
 {
-	void* arg;
-	uint32_t bytes_to_read;
-	hv_vmbus_channel* channel = (hv_vmbus_channel*)context;
-	bool is_batched_reading = false;
+	struct hv_vmbus_channel *chan = xchan;
+	void (*callback)(void *);
+	void *arg;
+
+	arg = chan->channel_callback_context;
+	callback = chan->on_channel_callback;
+
+	/*
+	 * Optimize host to guest signaling by ensuring:
+	 * 1. While reading the channel, we disable interrupts from
+	 *    host.
+	 * 2. Ensure that we process all posted messages from the host
+	 *    before returning from this callback.
+	 * 3. Once we return, enable signaling from the host. Once this
+	 *    state is set we check to see if additional packets are
+	 *    available to read. In this case we repeat the process.
+	 *
+	 * NOTE: Interrupt has been disabled in the ISR.
+	 */
+	for (;;) {
+		uint32_t left;
 
-	if (channel->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD)
-		is_batched_reading = true;
+		callback(arg);
 
-	if (channel->on_channel_callback != NULL) {
-		arg = channel->channel_callback_context;
-		/*
-		 * Optimize host to guest signaling by ensuring:
-		 * 1. While reading the channel, we disable interrupts from
-		 *    host.
-		 * 2. Ensure that we process all posted messages from the host
-		 *    before returning from this callback.
-		 * 3. Once we return, enable signaling from the host. Once this
-		 *    state is set we check to see if additional packets are
-		 *    available to read. In this case we repeat the process.
-		 */
-		do {
-			if (is_batched_reading)
-				hv_ring_buffer_read_begin(&channel->inbound);
+		left = hv_ring_buffer_read_end(&chan->inbound);
+		if (left == 0) {
+			/* No more data in RX bufring; done */
+			break;
+		}
+		hv_ring_buffer_read_begin(&chan->inbound);
+	}
+}
 
-			channel->on_channel_callback(arg);
+static void
+vmbus_chan_task_nobatch(void *xchan, int pending __unused)
+{
+	struct hv_vmbus_channel *chan = xchan;
 
-			if (is_batched_reading)
-				bytes_to_read =
-				    hv_ring_buffer_read_end(&channel->inbound);
-			else
-				bytes_to_read = 0;
-		} while (is_batched_reading && (bytes_to_read != 0));
-	}
+	chan->on_channel_callback(chan->channel_callback_context);
 }
 
 static __inline void



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