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
This commit is contained in:
Sepherosa Ziehau 2016-05-16 03:56:24 +00:00
parent 2afc04024e
commit 2a616fdcda
2 changed files with 13 additions and 11 deletions

View File

@ -183,7 +183,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) {

View File

@ -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);
}
}
}
}