svn commit: r299890 - head/sys/dev/hyperv/vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Mon May 16 03:56:26 UTC 2016
Author: sephe
Date: Mon May 16 03:56:24 2016
New Revision: 299890
URL: https://svnweb.freebsd.org/changeset/base/299890
Log:
hyperv/vmbus: Simplify event processing
For channel0, it will never be processed on event handling path,
so there is no need to install it. After skipping in the channel0
installation, we could discard the channel0 check on event
handling hot code path.
MFC after: 1 week
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D6333
Modified:
head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
head/sys/dev/hyperv/vmbus/hv_connection.c
Modified: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Mon May 16 03:48:00 2016 (r299889)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Mon May 16 03:56:24 2016 (r299890)
@@ -183,7 +183,14 @@ vmbus_channel_process_offer(hv_vmbus_cha
* Make sure this is a new offer
*/
mtx_lock(&hv_vmbus_g_connection.channel_lock);
- hv_vmbus_g_connection.channels[relid] = new_channel;
+ if (relid == 0) {
+ /*
+ * XXX channel0 will not be processed; skip it.
+ */
+ printf("VMBUS: got channel0 offer\n");
+ } else {
+ hv_vmbus_g_connection.channels[relid] = new_channel;
+ }
TAILQ_FOREACH(channel, &hv_vmbus_g_connection.channel_anchor,
list_entry) {
Modified: head/sys/dev/hyperv/vmbus/hv_connection.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_connection.c Mon May 16 03:48:00 2016 (r299889)
+++ head/sys/dev/hyperv/vmbus/hv_connection.c Mon May 16 03:56:24 2016 (r299890)
@@ -337,15 +337,11 @@ hv_vmbus_on_events(int cpu)
for (bit = 0; bit < HV_CHANNEL_DWORD_LEN; bit++) {
if (synch_test_and_clear_bit(bit,
(uint32_t *) &recv_interrupt_page[dword])) {
- rel_id = (dword << 5) + bit;
- if (rel_id == 0) {
- /*
- * Special case -
- * vmbus channel protocol msg.
- */
- continue;
- } else {
- hv_vmbus_channel * channel = hv_vmbus_g_connection.channels[rel_id];
+ struct hv_vmbus_channel *channel;
+
+ rel_id = (dword << 5) + bit;
+ channel = hv_vmbus_g_connection.channels[rel_id];
+
/* if channel is closed or closing */
if (channel == NULL || channel->rxq == NULL)
continue;
@@ -353,7 +349,6 @@ hv_vmbus_on_events(int cpu)
if (channel->batched_reading)
hv_ring_buffer_read_begin(&channel->inbound);
taskqueue_enqueue(channel->rxq, &channel->channel_task);
- }
}
}
}
More information about the svn-src-all
mailing list