summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2015-12-29 07:54:55 +0000
committerdelphij <delphij@FreeBSD.org>2015-12-29 07:54:55 +0000
commit1e469c559048fe6ec3641da3bb21ab87215c6506 (patch)
treeab759d456e61c02a1c743be1bfae984dc702242e
parent7d0bcce58dec66b815419d00b1e67af54b58f68e (diff)
downloadFreeBSD-src-1e469c559048fe6ec3641da3bb21ab87215c6506.zip
FreeBSD-src-1e469c559048fe6ec3641da3bb21ab87215c6506.tar.gz
hyperv: vmbus: remove the per-channel control_work_queue
Now vmbus_channel_on_offer() -> vmbus_channel_process_offer() can safely run on the global hv_vmbus_g_connection.work_queue now. We remove the per-channel control_work_queue to achieve the proper serialization of the message handling. I removed the bogus TODO in vmbus_channel_on_offer(): a vmbus offer can only come from the parent partition, i.e., the host. PR: kern/205156 Submitted by: Dexuan Cui <decui microsoft com> Reviewed by: Howard Su <howard0su gmail com>, delphij MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D4597
-rw-r--r--sys/dev/hyperv/include/hyperv.h1
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel_mgmt.c32
2 files changed, 3 insertions, 30 deletions
diff --git a/sys/dev/hyperv/include/hyperv.h b/sys/dev/hyperv/include/hyperv.h
index 6727503..b5600ba 100644
--- a/sys/dev/hyperv/include/hyperv.h
+++ b/sys/dev/hyperv/include/hyperv.h
@@ -759,7 +759,6 @@ typedef struct hv_vmbus_channel {
hv_vmbus_ring_buffer_info inbound;
struct mtx inbound_lock;
- hv_vmbus_handle control_work_queue;
hv_vmbus_pfn_channel_callback on_channel_callback;
void* channel_callback_context;
diff --git a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
index f1a01ed..f056d6f 100644
--- a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -49,7 +49,6 @@ static void vmbus_channel_on_gpadl_created(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_on_gpadl_torndown(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_on_offers_delivered(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_on_version_response(hv_vmbus_channel_msg_header* hdr);
-static void vmbus_channel_process_offer(void *context);
/**
* Channel message dispatch table
@@ -206,15 +205,6 @@ hv_queue_work_item(
return (taskqueue_enqueue(wq->queue, &w->work));
}
-/**
- * @brief Rescind the offer by initiating a device removal
- */
-static void
-vmbus_channel_process_rescind_offer(void *context)
-{
- hv_vmbus_channel* channel = (hv_vmbus_channel*) context;
- hv_vmbus_child_device_unregister(channel->device);
-}
/**
* @brief Allocate and initialize a vmbus channel object
@@ -237,14 +227,6 @@ hv_vmbus_allocate_channel(void)
TAILQ_INIT(&channel->sc_list_anchor);
- channel->control_work_queue = hv_work_queue_create("control");
-
- if (channel->control_work_queue == NULL) {
- mtx_destroy(&channel->inbound_lock);
- free(channel, M_DEVBUF);
- return (NULL);
- }
-
return (channel);
}
@@ -255,7 +237,6 @@ static inline void
ReleaseVmbusChannel(void *context)
{
hv_vmbus_channel* channel = (hv_vmbus_channel*) context;
- hv_work_queue_close(channel->control_work_queue);
free(channel, M_DEVBUF);
}
@@ -281,14 +262,12 @@ hv_vmbus_free_vmbus_channel(hv_vmbus_channel* channel)
* associated with this offer
*/
static void
-vmbus_channel_process_offer(void *context)
+vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
{
- hv_vmbus_channel* new_channel;
boolean_t f_new;
hv_vmbus_channel* channel;
int ret;
- new_channel = (hv_vmbus_channel*) context;
f_new = TRUE;
channel = NULL;
@@ -521,11 +500,7 @@ vmbus_channel_on_offer(hv_vmbus_channel_msg_header* hdr)
new_channel->monitor_group = (uint8_t) offer->monitor_id / 32;
new_channel->monitor_bit = (uint8_t) offer->monitor_id % 32;
- /* TODO: Make sure the offer comes from our parent partition */
- hv_queue_work_item(
- new_channel->control_work_queue,
- vmbus_channel_process_offer,
- new_channel);
+ vmbus_channel_process_offer(new_channel);
}
/**
@@ -546,8 +521,7 @@ vmbus_channel_on_offer_rescind(hv_vmbus_channel_msg_header* hdr)
if (channel == NULL)
return;
- hv_queue_work_item(channel->control_work_queue,
- vmbus_channel_process_rescind_offer, channel);
+ hv_vmbus_child_device_unregister(channel->device);
}
/**
OpenPOWER on IntegriCloud