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, 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to