summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel_mgmt.c9
-rw-r--r--sys/dev/hyperv/vmbus/hv_connection.c48
2 files changed, 31 insertions, 26 deletions
diff --git a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
index 00b54ed..b342948 100644
--- a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -186,7 +186,14 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
* 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) {
diff --git a/sys/dev/hyperv/vmbus/hv_connection.c b/sys/dev/hyperv/vmbus/hv_connection.c
index 0424b47..c3a28a0 100644
--- a/sys/dev/hyperv/vmbus/hv_connection.c
+++ b/sys/dev/hyperv/vmbus/hv_connection.c
@@ -303,7 +303,6 @@ hv_vmbus_on_events(int cpu)
int rel_id;
int maxdword;
hv_vmbus_synic_event_flags *event;
- /* int maxdword = PAGE_SIZE >> 3; */
KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: "
"cpu out of range!"));
@@ -317,9 +316,12 @@ hv_vmbus_on_events(int cpu)
/*
* receive size is 1/2 page and divide that by 4 bytes
*/
- if (synch_test_and_clear_bit(0, &event->flags32[0]))
+ if (synch_test_and_clear_bit(0, &event->flags32[0])) {
recv_interrupt_page =
hv_vmbus_g_connection.recv_interrupt_page;
+ } else {
+ return;
+ }
} else {
/*
* On Host with Win8 or above, the event page can be
@@ -333,36 +335,32 @@ hv_vmbus_on_events(int cpu)
/*
* Check events
*/
- if (recv_interrupt_page != NULL) {
- for (dword = 0; dword < maxdword; dword++) {
- if (recv_interrupt_page[dword]) {
- for (bit = 0; bit < HV_CHANNEL_DWORD_LEN; bit++) {
+ for (dword = 0; dword < maxdword; dword++) {
+ if (recv_interrupt_page[dword] == 0)
+ continue;
+
+ 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];
+ (uint32_t *)&recv_interrupt_page[dword])) {
+ 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;
- if (channel->batched_reading)
- hv_ring_buffer_read_begin(&channel->inbound);
- taskqueue_enqueue_fast(channel->rxq, &channel->channel_task);
- }
+ if (channel->batched_reading) {
+ hv_ring_buffer_read_begin(
+ &channel->inbound);
+ }
+ taskqueue_enqueue(channel->rxq,
+ &channel->channel_task);
}
- }
- }
- }
+ }
}
-
- return;
}
/**
OpenPOWER on IntegriCloud