From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752366AbcFCKO4 (ORCPT ); Fri, 3 Jun 2016 06:14:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38405 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751384AbcFCKOz (ORCPT ); Fri, 3 Jun 2016 06:14:55 -0400 From: Vitaly Kuznetsov To: devel@linuxdriverproject.org Cc: linux-kernel@vger.kernel.org, "K. Y. Srinivasan" , Haiyang Zhang Subject: [PATCH] Drivers: hv: fix infinite wait when channel open timeouts Date: Fri, 3 Jun 2016 12:14:51 +0200 Message-Id: <1464948891-5532-1-git-send-email-vkuznets@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 03 Jun 2016 10:14:54 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org vmbus_teardown_gpadl() can result in infinite wait when it is called on 5 second timeout in vmbus_open(). The issue is caused by the fact that gpadl teardown operation won't ever succeed for an opened channel and the timeout isn't always enough. Increase the timeout to 15 seconds and add sending CHANNELMSG_CLOSECHANNEL message on timeout to make sure the channel is closed. The other possible solution for the issue would be to remove the timeout in vmbus_open() making our wait infinite. Signed-off-by: Vitaly Kuznetsov --- drivers/hv/channel.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index 6a8660d..becb9e8 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c @@ -69,6 +69,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, void (*onchannelcallback)(void *context), void *context) { struct vmbus_channel_open_channel *open_msg; + struct vmbus_channel_close_channel *close_msg; struct vmbus_channel_msginfo *open_info = NULL; void *in, *out; unsigned long flags; @@ -183,8 +184,19 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, goto error1; } - t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ); + t = wait_for_completion_timeout(&open_info->waitevent, 15*HZ); if (t == 0) { + /* + * We won't be able to tear down the gpadl handle if the + * channel finally gets openned, send channel close message + * to be on the safe side. + */ + close_msg = &newchannel->close_msg.msg; + close_msg->header.msgtype = CHANNELMSG_CLOSECHANNEL; + close_msg->child_relid = newchannel->offermsg.child_relid; + vmbus_post_msg(close_msg, + sizeof(struct vmbus_channel_close_channel)); + err = -ETIMEDOUT; goto error1; } -- 2.5.5