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

Sepherosa Ziehau sephe at FreeBSD.org
Fri Feb 26 09:23:18 UTC 2016


Author: sephe
Date: Fri Feb 26 09:23:17 2016
New Revision: 296084
URL: https://svnweb.freebsd.org/changeset/base/296084

Log:
  hyperv: Always set device for channels
  
  And unregister hv_device only for primary channels, who own the hv_device.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D5451

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

Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h	Fri Feb 26 09:17:31 2016	(r296083)
+++ head/sys/dev/hyperv/include/hyperv.h	Fri Feb 26 09:23:17 2016	(r296084)
@@ -828,6 +828,8 @@ typedef struct hv_vmbus_channel {
 	void				*per_channel_state;
 } hv_vmbus_channel;
 
+#define HV_VMBUS_CHAN_ISPRIMARY(chan)	((chan)->primary_channel == NULL)
+
 static inline void
 hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t state)
 {

Modified: head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c	Fri Feb 26 09:17:31 2016	(r296083)
+++ head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c	Fri Feb 26 09:23:17 2016	(r296084)
@@ -334,7 +334,7 @@ storvsc_handle_sc_creation(void *context
 	int ret = 0;
 
 	new_channel = (hv_vmbus_channel *)context;
-	device = new_channel->primary_channel->device;
+	device = new_channel->device;
 	sc = get_stor_device(device, TRUE);
 	if (sc == NULL)
 		return;
@@ -837,12 +837,7 @@ hv_storvsc_on_channel_callback(void *con
 	struct hv_storvsc_request *request;
 	struct vstor_packet *vstor_packet;
 
-	if (channel->primary_channel != NULL){
-		device = channel->primary_channel->device;
-	} else {
-		device = channel->device;
-	}
-
+	device = channel->device;
 	KASSERT(device, ("device is NULL"));
 
 	sc = get_stor_device(device, FALSE);

Modified: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Fri Feb 26 09:17:31 2016	(r296083)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Fri Feb 26 09:23:17 2016	(r296084)
@@ -211,6 +211,7 @@ vmbus_channel_process_offer(hv_vmbus_cha
 			 * It is a sub channel offer, process it.
 			 */
 			new_channel->primary_channel = channel;
+			new_channel->device = channel->device;
 			mtx_lock(&channel->sc_lock);
 			TAILQ_INSERT_TAIL(
 			    &channel->sc_list_anchor,
@@ -451,7 +452,10 @@ vmbus_channel_on_offer_rescind_internal(
 	hv_vmbus_channel*               channel;
 
 	channel = (hv_vmbus_channel*)context;
-	hv_vmbus_child_device_unregister(channel->device);
+	if (HV_VMBUS_CHAN_ISPRIMARY(channel)) {
+		/* Only primary channel owns the hv_device */
+		hv_vmbus_child_device_unregister(channel->device);
+	}
 }
 
 /**
@@ -672,7 +676,10 @@ hv_vmbus_release_unattached_channels(voi
 	    TAILQ_REMOVE(&hv_vmbus_g_connection.channel_anchor,
 			    channel, list_entry);
 
-	    hv_vmbus_child_device_unregister(channel->device);
+	    if (HV_VMBUS_CHAN_ISPRIMARY(channel)) {
+		/* Only primary channel owns the hv_device */
+		hv_vmbus_child_device_unregister(channel->device);
+	    }
 	    hv_vmbus_free_vmbus_channel(channel);
 	}
 	bzero(hv_vmbus_g_connection.channels, 


More information about the svn-src-head mailing list