Skip to content

Commit

Permalink
Drivers: hv: vmbus: add an API vmbus_hvsock_device_unregister()
Browse files Browse the repository at this point in the history
The hvsock driver needs this API to release all the resources related
to the channel.

Signed-off-by: Dexuan Cui <decui@microsoft.com>
  • Loading branch information
dcui committed Oct 20, 2015
1 parent 9ba2ac0 commit 185afe8
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 6 deletions.
26 changes: 22 additions & 4 deletions drivers/hv/channel_mgmt.c
Expand Up @@ -195,6 +195,7 @@ void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
vmbus_release_relid(relid);

BUG_ON(!channel->rescind);
BUG_ON(!mutex_is_locked(&vmbus_connection.channel_mutex));

if (channel->target_cpu != get_cpu()) {
put_cpu();
Expand All @@ -206,9 +207,7 @@ void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
}

if (channel->primary_channel == NULL) {
mutex_lock(&vmbus_connection.channel_mutex);
list_del(&channel->listentry);
mutex_unlock(&vmbus_connection.channel_mutex);

primary_channel = channel;
} else {
Expand Down Expand Up @@ -587,6 +586,8 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
struct device *dev;

rescind = (struct vmbus_channel_rescind_offer *)hdr;

mutex_lock(&vmbus_connection.channel_mutex);
channel = relid2channel(rescind->child_relid);

if (channel == NULL) {
Expand All @@ -595,7 +596,7 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
* vmbus_process_offer(), we have already invoked
* vmbus_release_relid() on error.
*/
return;
goto out;
}

spin_lock_irqsave(&channel->lock, flags);
Expand All @@ -611,7 +612,7 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
* We can't invoke vmbus_device_unregister()
* until the socket fd is closed.
*/
return;
goto out;
}
/*
* We will have to unregister this device from the
Expand All @@ -626,7 +627,24 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
hv_process_channel_removal(channel,
channel->offermsg.child_relid);
}

out:
mutex_unlock(&vmbus_connection.channel_mutex);
}


void vmbus_hvsock_device_unregister(struct vmbus_channel *channel)
{
mutex_lock(&vmbus_connection.channel_mutex);

BUG_ON(!is_hvsock_channel(channel));

channel->rescind = true;
vmbus_device_unregister(channel->device_obj);

mutex_unlock(&vmbus_connection.channel_mutex);
}
EXPORT_SYMBOL_GPL(vmbus_hvsock_device_unregister);

/*
* vmbus_onoffers_delivered -
Expand Down
4 changes: 2 additions & 2 deletions drivers/hv/connection.c
Expand Up @@ -285,7 +285,8 @@ struct vmbus_channel *relid2channel(u32 relid)
struct list_head *cur, *tmp;
struct vmbus_channel *cur_sc;

mutex_lock(&vmbus_connection.channel_mutex);
BUG_ON(!mutex_is_locked(&vmbus_connection.channel_mutex));

list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) {
if (channel->offermsg.child_relid == relid) {
found_channel = channel;
Expand All @@ -304,7 +305,6 @@ struct vmbus_channel *relid2channel(u32 relid)
}
}
}
mutex_unlock(&vmbus_connection.channel_mutex);

return found_channel;
}
Expand Down
2 changes: 2 additions & 0 deletions include/linux/hyperv.h
Expand Up @@ -1041,6 +1041,8 @@ int __must_check __vmbus_driver_register(struct hv_driver *hv_driver,
const char *mod_name);
void vmbus_driver_unregister(struct hv_driver *hv_driver);

void vmbus_hvsock_device_unregister(struct vmbus_channel *channel);

int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
resource_size_t min, resource_size_t max,
resource_size_t size, resource_size_t align,
Expand Down

0 comments on commit 185afe8

Please sign in to comment.