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-all
mailing list