aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authorSepherosa Ziehau <sephe@FreeBSD.org>2016-05-16 03:48:00 +0000
committerSepherosa Ziehau <sephe@FreeBSD.org>2016-05-16 03:48:00 +0000
commit2afc04024e53d2419ff8b9d988d80779fce66a0d (patch)
tree7c07223344c609d7a5ba3051548a0196badb22e8 /sys/dev/hyperv
parentaa77d82eca75a2f1ae57f0226de2c1c31bdff24b (diff)
Notes
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r--sys/dev/hyperv/vmbus/hv_connection.c56
1 files changed, 27 insertions, 29 deletions
diff --git a/sys/dev/hyperv/vmbus/hv_connection.c b/sys/dev/hyperv/vmbus/hv_connection.c
index 742c754917c11..72d463617bad1 100644
--- a/sys/dev/hyperv/vmbus/hv_connection.c
+++ b/sys/dev/hyperv/vmbus/hv_connection.c
@@ -300,7 +300,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!"));
@@ -314,9 +313,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
@@ -330,36 +332,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++) {
- 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];
- /* if channel is closed or closing */
- if (channel == NULL || channel->rxq == NULL)
- continue;
+ for (dword = 0; dword < maxdword; dword++) {
+ if (recv_interrupt_page[dword]) {
+ 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];
+ /* 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(channel->rxq, &channel->channel_task);
- }
- }
- }
- }
+ if (channel->batched_reading)
+ hv_ring_buffer_read_begin(&channel->inbound);
+ taskqueue_enqueue(channel->rxq, &channel->channel_task);
+ }
+ }
+ }
}
}
-
- return;
}
/**