Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

svn commit: r307309 - stable/11/sys/dev/hyperv/vmbus

3 views
Skip to first unread message

Sepherosa Ziehau

unread,
Oct 14, 2016, 5:00:45 AM10/14/16
to src-com...@freebsd.org, svn-s...@freebsd.org, svn-src...@freebsd.org, svn-src-...@freebsd.org
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
_______________________________________________
svn-s...@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all...@freebsd.org"
0 new messages