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
This commit is contained in:
Sepherosa Ziehau 2016-02-26 09:23:17 +00:00
parent a14df6ad64
commit b96a7ad189
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=296084
3 changed files with 13 additions and 9 deletions

View File

@ -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)
{

View File

@ -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 *context)
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);

View File

@ -211,6 +211,7 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
* 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(void *context)
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(void)
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,