|
@@ -177,19 +177,22 @@ static void percpu_channel_deq(void *arg)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
|
|
|
|
|
|
+static void vmbus_release_relid(u32 relid)
|
|
{
|
|
{
|
|
struct vmbus_channel_relid_released msg;
|
|
struct vmbus_channel_relid_released msg;
|
|
- unsigned long flags;
|
|
|
|
- struct vmbus_channel *primary_channel;
|
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(struct vmbus_channel_relid_released));
|
|
memset(&msg, 0, sizeof(struct vmbus_channel_relid_released));
|
|
msg.child_relid = relid;
|
|
msg.child_relid = relid;
|
|
msg.header.msgtype = CHANNELMSG_RELID_RELEASED;
|
|
msg.header.msgtype = CHANNELMSG_RELID_RELEASED;
|
|
vmbus_post_msg(&msg, sizeof(struct vmbus_channel_relid_released));
|
|
vmbus_post_msg(&msg, sizeof(struct vmbus_channel_relid_released));
|
|
|
|
+}
|
|
|
|
|
|
- if (channel == NULL)
|
|
|
|
- return;
|
|
|
|
|
|
+void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
|
|
|
|
+{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+ struct vmbus_channel *primary_channel;
|
|
|
|
+
|
|
|
|
+ vmbus_release_relid(relid);
|
|
|
|
|
|
BUG_ON(!channel->rescind);
|
|
BUG_ON(!channel->rescind);
|
|
|
|
|
|
@@ -336,6 +339,8 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel)
|
|
return;
|
|
return;
|
|
|
|
|
|
err_deq_chan:
|
|
err_deq_chan:
|
|
|
|
+ vmbus_release_relid(newchannel->offermsg.child_relid);
|
|
|
|
+
|
|
spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
|
|
spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
|
|
list_del(&newchannel->listentry);
|
|
list_del(&newchannel->listentry);
|
|
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
|
|
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
|
|
@@ -587,7 +592,11 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
|
|
channel = relid2channel(rescind->child_relid);
|
|
channel = relid2channel(rescind->child_relid);
|
|
|
|
|
|
if (channel == NULL) {
|
|
if (channel == NULL) {
|
|
- hv_process_channel_removal(NULL, rescind->child_relid);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * This is very impossible, because in
|
|
|
|
+ * vmbus_process_offer(), we have already invoked
|
|
|
|
+ * vmbus_release_relid() on error.
|
|
|
|
+ */
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|