aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2014-08-27 19:25:32 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-09-24 02:30:38 -0400
commit66be653083057358724d56d817e870e53fb81ca7 (patch)
tree7dba96c32670164af532e770d00a5d2602003be1 /drivers/hv
parentfdeebcc62279119dbeafbc1a2e39e773839025fd (diff)
Drivers: hv: vmbus: Cleanup vmbus_teardown_gpadl()
Eliminate calls to BUG_ON() by properly handling errors. In cases where rollback is possible, we will return the appropriate error to have the calling code decide how to rollback state. In the case where we are transferring ownership of the guest physical pages to the host, we will wait for the host to respond. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Cc: <stable@vger.kernel.org> Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r--drivers/hv/channel.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index 531a593912ec..020631453394 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -435,7 +435,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
435 struct vmbus_channel_gpadl_teardown *msg; 435 struct vmbus_channel_gpadl_teardown *msg;
436 struct vmbus_channel_msginfo *info; 436 struct vmbus_channel_msginfo *info;
437 unsigned long flags; 437 unsigned long flags;
438 int ret, t; 438 int ret;
439 439
440 info = kmalloc(sizeof(*info) + 440 info = kmalloc(sizeof(*info) +
441 sizeof(struct vmbus_channel_gpadl_teardown), GFP_KERNEL); 441 sizeof(struct vmbus_channel_gpadl_teardown), GFP_KERNEL);
@@ -457,11 +457,12 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
457 ret = vmbus_post_msg(msg, 457 ret = vmbus_post_msg(msg,
458 sizeof(struct vmbus_channel_gpadl_teardown)); 458 sizeof(struct vmbus_channel_gpadl_teardown));
459 459
460 BUG_ON(ret != 0); 460 if (ret)
461 t = wait_for_completion_timeout(&info->waitevent, 5*HZ); 461 goto post_msg_err;
462 BUG_ON(t == 0); 462
463 wait_for_completion(&info->waitevent);
463 464
464 /* Received a torndown response */ 465post_msg_err:
465 spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); 466 spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
466 list_del(&info->msglistentry); 467 list_del(&info->msglistentry);
467 spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); 468 spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);