summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorsephe <sephe@FreeBSD.org>2016-06-23 01:47:30 +0000
committersephe <sephe@FreeBSD.org>2016-06-23 01:47:30 +0000
commitd5f44be4cd4d07380dce8e2eea32f6a97306d468 (patch)
tree11f635c11e71f6321e61101059c3e9169d57b847 /sys/dev
parent7e5b45f1a4d56b26af6cdae84793f42f6463e6b4 (diff)
downloadFreeBSD-src-d5f44be4cd4d07380dce8e2eea32f6a97306d468.zip
FreeBSD-src-d5f44be4cd4d07380dce8e2eea32f6a97306d468.tar.gz
MFC 299889,299890,299892
299889 hyperv/vmbus: Simplify event processing While I'm here, remove useless comment and unnecessary return. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D6332 299890 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 299892 hyperv/vmbus: Fix event processing loop indentation. No functional changes. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D6334
Diffstat (limited to 'sys/dev')
-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