svn commit: r292859 - in head/sys/dev/hyperv: include vmbus

Xin LI delphij at FreeBSD.org
Tue Dec 29 07:54:57 UTC 2015


Author: delphij
Date: Tue Dec 29 07:54:55 2015
New Revision: 292859
URL: https://svnweb.freebsd.org/changeset/base/292859

Log:
  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

Modified:
  head/sys/dev/hyperv/include/hyperv.h
  head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c

Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h	Tue Dec 29 03:31:06 2015	(r292858)
+++ head/sys/dev/hyperv/include/hyperv.h	Tue Dec 29 07:54:55 2015	(r292859)
@@ -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;

Modified: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Tue Dec 29 03:31:06 2015	(r292858)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Tue Dec 29 07:54:55 2015	(r292859)
@@ -49,7 +49,6 @@ static void vmbus_channel_on_gpadl_creat
 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_cha
  * 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_
 	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_
 	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);
 }
 
 /**


More information about the svn-src-all mailing list