Re: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-17 Thread Dmitry Torokhov
On Tue, Feb 15, 2011 at 05:52:46PM +, KY Srinivasan wrote:
 
 If I understand you correctly, you would be prefer to have unbounded waiting 
 with comments 
 justifying why we cannot have timeouts. I will roll out a patch once the tree 
 stabilizes.
 

Just make sure to add a comment explaining why the wait is unbounded.

-- 
Dmitry
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


RE: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-16 Thread KY Srinivasan


 -Original Message-
 From: Jiri Slaby [mailto:jirisl...@gmail.com]
 Sent: Tuesday, February 15, 2011 4:21 AM
 To: KY Srinivasan
 Cc: gre...@suse.de; linux-ker...@vger.kernel.org;
 de...@linuxdriverproject.org; virtualizat...@lists.osdl.org
 Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
 
 On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
  In preperation for getting rid of the osd layer; change
  the code to use native wait interfaces. As part of this,
  fixed the buggy implementation in the osd_wait_primitive
  where the condition was cleared potentially after the
  condition was signalled.
 ...
  @@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel
 *channel, void *kbuffer,
 
  }
  }
  -   osd_waitevent_wait(msginfo-waitevent);
  +   wait_event_timeout(msginfo-waitevent,
  +   msginfo-wait_condition,
  +   msecs_to_jiffies(1000));
  +   BUG_ON(msginfo-wait_condition == 0);
 
 The added BUG_ONs all over the code look scary. These shouldn't be
 BUG_ONs at all. You should maybe warn and bail out, but not kill the
 whole machine.

This is Linux code running as a guest on a Windows host; and so the guest cannot
tolerate a failure of the host. In the cases where I have chosen to BUG_ON, 
there 
is no reasonable recovery possible when the host is non-functional (as 
determined 
by a non-responsive host). 

 
 And looking at the code, more appropriate would be completion instead of
 wait events.
 
 And msecs_to_jiffies(1000) == HZ.

Agreed. In this first round of cleanup, I chose to keep the primitives as they 
were in osd.c. Greg, if it is ok with you, I will send you a patch that fixes 
these issues on top of the patches I have already sent.

Regards,

K. Y
 
  @@ -689,7 +693,8 @@ static void vmbus_ongpadl_torndown(
  memcpy(msginfo-response.gpadl_torndown,
 gpadl_torndown,
 sizeof(struct
 vmbus_channel_gpadl_torndown));
  -   osd_waitevent_set(msginfo-waitevent);
  +   msginfo-wait_condition = 1;
  +   wake_up(msginfo-waitevent);
  break;
  }
  }
  @@ -730,7 +735,8 @@ static void vmbus_onversion_response(
  memcpy(msginfo-response.version_response,
version_response,
sizeof(struct vmbus_channel_version_response));
  -   osd_waitevent_set(msginfo-waitevent);
  +   msginfo-wait_condition = 1;
  +   wake_up(msginfo-waitevent);
  }
  }
  spin_unlock_irqrestore(vmbus_connection.channelmsg_lock, flags);
 
 regards,
 --
 js

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-16 Thread Greg KH
On Tue, Feb 15, 2011 at 01:35:56PM +, KY Srinivasan wrote:
 
 
  -Original Message-
  From: Jiri Slaby [mailto:jirisl...@gmail.com]
  Sent: Tuesday, February 15, 2011 4:21 AM
  To: KY Srinivasan
  Cc: gre...@suse.de; linux-ker...@vger.kernel.org;
  de...@linuxdriverproject.org; virtualizat...@lists.osdl.org
  Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
  
  On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
   In preperation for getting rid of the osd layer; change
   the code to use native wait interfaces. As part of this,
   fixed the buggy implementation in the osd_wait_primitive
   where the condition was cleared potentially after the
   condition was signalled.
  ...
   @@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel
  *channel, void *kbuffer,
  
 }
 }
   - osd_waitevent_wait(msginfo-waitevent);
   + wait_event_timeout(msginfo-waitevent,
   + msginfo-wait_condition,
   + msecs_to_jiffies(1000));
   + BUG_ON(msginfo-wait_condition == 0);
  
  The added BUG_ONs all over the code look scary. These shouldn't be
  BUG_ONs at all. You should maybe warn and bail out, but not kill the
  whole machine.
 
 This is Linux code running as a guest on a Windows host; and so the guest 
 cannot
 tolerate a failure of the host. In the cases where I have chosen to BUG_ON, 
 there 
 is no reasonable recovery possible when the host is non-functional (as 
 determined 
 by a non-responsive host). 

If you have a non-responsive host, wouldn't that imply that this guest
code wouldn't run at all?  :)

Having BUG_ON() in drivers is not a good idea either way.  Please remove
these in future patches.

  And looking at the code, more appropriate would be completion instead of
  wait events.
  
  And msecs_to_jiffies(1000) == HZ.
 
 Agreed. In this first round of cleanup, I chose to keep the primitives
 as they were in osd.c. Greg, if it is ok with you, I will send you a
 patch that fixes these issues on top of the patches I have already
 sent.

Yes, that is fine.

thanks,

greg k-h
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


RE: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-16 Thread KY Srinivasan


 -Original Message-
 From: Greg KH [mailto:gre...@suse.de]
 Sent: Tuesday, February 15, 2011 9:03 AM
 To: KY Srinivasan
 Cc: Jiri Slaby; linux-ker...@vger.kernel.org; de...@linuxdriverproject.org;
 virtualizat...@lists.osdl.org
 Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
 
 On Tue, Feb 15, 2011 at 01:35:56PM +, KY Srinivasan wrote:
 
 
   -Original Message-
   From: Jiri Slaby [mailto:jirisl...@gmail.com]
   Sent: Tuesday, February 15, 2011 4:21 AM
   To: KY Srinivasan
   Cc: gre...@suse.de; linux-ker...@vger.kernel.org;
   de...@linuxdriverproject.org; virtualizat...@lists.osdl.org
   Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
  
   On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
In preperation for getting rid of the osd layer; change
the code to use native wait interfaces. As part of this,
fixed the buggy implementation in the osd_wait_primitive
where the condition was cleared potentially after the
condition was signalled.
   ...
@@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel
   *channel, void *kbuffer,
   
}
}
-   osd_waitevent_wait(msginfo-waitevent);
+   wait_event_timeout(msginfo-waitevent,
+   msginfo-wait_condition,
+   msecs_to_jiffies(1000));
+   BUG_ON(msginfo-wait_condition == 0);
  
   The added BUG_ONs all over the code look scary. These shouldn't be
   BUG_ONs at all. You should maybe warn and bail out, but not kill the
   whole machine.
 
  This is Linux code running as a guest on a Windows host; and so the guest
 cannot
  tolerate a failure of the host. In the cases where I have chosen to BUG_ON,
 there
  is no reasonable recovery possible when the host is non-functional (as
 determined
  by a non-responsive host).
 
 If you have a non-responsive host, wouldn't that imply that this guest
 code wouldn't run at all?  :)

The fact  that on a particular transaction the host has not responded within an 
expected
time interval does not necessarily  mean that the guest code would not be 
running. There may be 
issues on the host side that may be either transient or permanent that may 
cause problems like
this. Keep in mind, HyperV is a type 1 hypervisor that would schedule all VMs 
including the host
and so, guest would get scheduled.

 
 Having BUG_ON() in drivers is not a good idea either way.  Please remove
 these in future patches.

In situations where there is not a reasonable rollback strategy (for
instance in one of the cases, we are granting access to the guest
physical pages to the host) we really have only 2 options:

1) Wait until the host responds. This wait could potentially be unbounded
and in fact this  was the way the code was to begin with. One of the reviewers
had suggested that unbounded wait was to be corrected.
2) Wait for a specific period and if the host does not respond
within a reasonable period, kill the guest since there is no recovery
possible.

I chose option 2, as part of addressing some of the prior review
comments. If the consensus now is to go back to option 1, I am fine with that;
I will send you a patch to rectify this.

Regards,

K. Y
  
 
   And looking at the code, more appropriate would be completion instead of
   wait events.
  
   And msecs_to_jiffies(1000) == HZ.
 
  Agreed. In this first round of cleanup, I chose to keep the primitives
  as they were in osd.c. Greg, if it is ok with you, I will send you a
  patch that fixes these issues on top of the patches I have already
  sent.
 
 Yes, that is fine.
 
 thanks,
 
 greg k-h

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-16 Thread Greg KH
On Tue, Feb 15, 2011 at 04:22:20PM +, KY Srinivasan wrote:
 
 
  -Original Message-
  From: Greg KH [mailto:gre...@suse.de]
  Sent: Tuesday, February 15, 2011 9:03 AM
  To: KY Srinivasan
  Cc: Jiri Slaby; linux-ker...@vger.kernel.org; de...@linuxdriverproject.org;
  virtualizat...@lists.osdl.org
  Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
  
  On Tue, Feb 15, 2011 at 01:35:56PM +, KY Srinivasan wrote:
  
  
-Original Message-
From: Jiri Slaby [mailto:jirisl...@gmail.com]
Sent: Tuesday, February 15, 2011 4:21 AM
To: KY Srinivasan
Cc: gre...@suse.de; linux-ker...@vger.kernel.org;
de...@linuxdriverproject.org; virtualizat...@lists.osdl.org
Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
   
On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
 In preperation for getting rid of the osd layer; change
 the code to use native wait interfaces. As part of this,
 fixed the buggy implementation in the osd_wait_primitive
 where the condition was cleared potentially after the
 condition was signalled.
...
 @@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel
*channel, void *kbuffer,

   }
   }
 - osd_waitevent_wait(msginfo-waitevent);
 + wait_event_timeout(msginfo-waitevent,
 + msginfo-wait_condition,
 + msecs_to_jiffies(1000));
 + BUG_ON(msginfo-wait_condition == 0);
   
The added BUG_ONs all over the code look scary. These shouldn't be
BUG_ONs at all. You should maybe warn and bail out, but not kill the
whole machine.
  
   This is Linux code running as a guest on a Windows host; and so the guest
  cannot
   tolerate a failure of the host. In the cases where I have chosen to 
   BUG_ON,
  there
   is no reasonable recovery possible when the host is non-functional (as
  determined
   by a non-responsive host).
  
  If you have a non-responsive host, wouldn't that imply that this guest
  code wouldn't run at all?  :)
 
 The fact  that on a particular transaction the host has not responded within 
 an expected
 time interval does not necessarily  mean that the guest code would not be 
 running. There may be 
 issues on the host side that may be either transient or permanent that may 
 cause problems like
 this. Keep in mind, HyperV is a type 1 hypervisor that would schedule all VMs 
 including the host
 and so, guest would get scheduled.
 
  
  Having BUG_ON() in drivers is not a good idea either way.  Please remove
  these in future patches.
 
 In situations where there is not a reasonable rollback strategy (for
 instance in one of the cases, we are granting access to the guest
 physical pages to the host) we really have only 2 options:
 
 1) Wait until the host responds. This wait could potentially be unbounded
 and in fact this  was the way the code was to begin with. One of the reviewers
 had suggested that unbounded wait was to be corrected.
 2) Wait for a specific period and if the host does not respond
 within a reasonable period, kill the guest since there is no recovery
 possible.

Killing the guest is a very serious thing, causing all sorts of possible
problems with it, right?

 I chose option 2, as part of addressing some of the prior review
 comments. If the consensus now is to go back to option 1, I am fine with that;

Unbounded waits aren't ok either, you need some sort of timeout.

But, as this is a bit preferable to dieing, I suggest doing this, and
comment the heck out of it to explain all of this for anyone who reads
it.

thanks,

greg k-h
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


RE: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-16 Thread KY Srinivasan


 -Original Message-
 From: Greg KH [mailto:gre...@suse.de]
 Sent: Tuesday, February 15, 2011 11:30 AM
 To: KY Srinivasan
 Cc: Jiri Slaby; linux-ker...@vger.kernel.org; de...@linuxdriverproject.org;
 virtualizat...@lists.osdl.org
 Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
 
 On Tue, Feb 15, 2011 at 04:22:20PM +, KY Srinivasan wrote:
 
 
   -Original Message-
   From: Greg KH [mailto:gre...@suse.de]
   Sent: Tuesday, February 15, 2011 9:03 AM
   To: KY Srinivasan
   Cc: Jiri Slaby; linux-ker...@vger.kernel.org; 
   de...@linuxdriverproject.org;
   virtualizat...@lists.osdl.org
   Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives
  
   On Tue, Feb 15, 2011 at 01:35:56PM +, KY Srinivasan wrote:
   
   
 -Original Message-
 From: Jiri Slaby [mailto:jirisl...@gmail.com]
 Sent: Tuesday, February 15, 2011 4:21 AM
 To: KY Srinivasan
 Cc: gre...@suse.de; linux-ker...@vger.kernel.org;
 de...@linuxdriverproject.org; virtualizat...@lists.osdl.org
 Subject: Re: [PATCH 2/3]: Staging: hv: Use native wait primitives

 On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
  In preperation for getting rid of the osd layer; change
  the code to use native wait interfaces. As part of this,
  fixed the buggy implementation in the osd_wait_primitive
  where the condition was cleared potentially after the
  condition was signalled.
 ...
  @@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct
 vmbus_channel
 *channel, void *kbuffer,
 
  }
  }
  -   osd_waitevent_wait(msginfo-waitevent);
  +   wait_event_timeout(msginfo-waitevent,
  +   msginfo-wait_condition,
  +   msecs_to_jiffies(1000));
  +   BUG_ON(msginfo-wait_condition == 0);

 The added BUG_ONs all over the code look scary. These shouldn't be
 BUG_ONs at all. You should maybe warn and bail out, but not kill the
 whole machine.
   
This is Linux code running as a guest on a Windows host; and so the 
guest
   cannot
tolerate a failure of the host. In the cases where I have chosen to 
BUG_ON,
   there
is no reasonable recovery possible when the host is non-functional (as
   determined
by a non-responsive host).
  
   If you have a non-responsive host, wouldn't that imply that this guest
   code wouldn't run at all?  :)
 
  The fact  that on a particular transaction the host has not responded 
  within an
 expected
  time interval does not necessarily  mean that the guest code would not be
 running. There may be
  issues on the host side that may be either transient or permanent that may
 cause problems like
  this. Keep in mind, HyperV is a type 1 hypervisor that would schedule all 
  VMs
 including the host
  and so, guest would get scheduled.
 
  
   Having BUG_ON() in drivers is not a good idea either way.  Please remove
   these in future patches.
 
  In situations where there is not a reasonable rollback strategy (for
  instance in one of the cases, we are granting access to the guest
  physical pages to the host) we really have only 2 options:
 
  1) Wait until the host responds. This wait could potentially be unbounded
  and in fact this  was the way the code was to begin with. One of the 
  reviewers
  had suggested that unbounded wait was to be corrected.
  2) Wait for a specific period and if the host does not respond
  within a reasonable period, kill the guest since there is no recovery
  possible.
 
 Killing the guest is a very serious thing, causing all sorts of possible
 problems with it, right?
If there was a reasonable rollback strategy, I would not
be killing the guest.
 
  I chose option 2, as part of addressing some of the prior review
  comments. If the consensus now is to go back to option 1, I am fine with 
  that;
 
 Unbounded waits aren't ok either, you need some sort of timeout.
 
 But, as this is a bit preferable to dieing, I suggest doing this, and
 comment the heck out of it to explain all of this for anyone who reads
 it.

If I understand you correctly, you would be prefer to have unbounded waiting 
with comments 
justifying why we cannot have timeouts. I will roll out a patch once the tree 
stabilizes.

Regards,

K. Y 
 
 thanks,
 
 greg k-h

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-15 Thread Jiri Slaby
On 02/11/2011 06:59 PM, K. Y. Srinivasan wrote:
 In preperation for getting rid of the osd layer; change
 the code to use native wait interfaces. As part of this,
 fixed the buggy implementation in the osd_wait_primitive
 where the condition was cleared potentially after the 
 condition was signalled.
...
 @@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, 
 void *kbuffer,
  
   }
   }
 - osd_waitevent_wait(msginfo-waitevent);
 + wait_event_timeout(msginfo-waitevent,
 + msginfo-wait_condition,
 + msecs_to_jiffies(1000));
 + BUG_ON(msginfo-wait_condition == 0);

The added BUG_ONs all over the code look scary. These shouldn't be
BUG_ONs at all. You should maybe warn and bail out, but not kill the
whole machine.

And looking at the code, more appropriate would be completion instead of
wait events.

And msecs_to_jiffies(1000) == HZ.

 @@ -689,7 +693,8 @@ static void vmbus_ongpadl_torndown(
   memcpy(msginfo-response.gpadl_torndown,
  gpadl_torndown,
  sizeof(struct 
 vmbus_channel_gpadl_torndown));
 - osd_waitevent_set(msginfo-waitevent);
 + msginfo-wait_condition = 1;
 + wake_up(msginfo-waitevent);
   break;
   }
   }
 @@ -730,7 +735,8 @@ static void vmbus_onversion_response(
   memcpy(msginfo-response.version_response,
 version_response,
 sizeof(struct vmbus_channel_version_response));
 - osd_waitevent_set(msginfo-waitevent);
 + msginfo-wait_condition = 1;
 + wake_up(msginfo-waitevent);
   }
   }
   spin_unlock_irqrestore(vmbus_connection.channelmsg_lock, flags);

regards,
-- 
js
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 2/3]: Staging: hv: Use native wait primitives

2011-02-11 Thread K. Y. Srinivasan
In preperation for getting rid of the osd layer; change
the code to use native wait interfaces. As part of this,
fixed the buggy implementation in the osd_wait_primitive
where the condition was cleared potentially after the 
condition was signalled.

Signed-off-by: K. Y. Srinivasan k...@microsoft.com
Signed-off-by: Hank Janssen hjans...@microsoft.com

---
 drivers/staging/hv/channel.c   |   58 +---
 drivers/staging/hv/channel_mgmt.c  |   46 +++-
 drivers/staging/hv/channel_mgmt.h  |4 +-
 drivers/staging/hv/connection.c|   28 +++---
 drivers/staging/hv/netvsc.c|  102 ++-
 drivers/staging/hv/netvsc.h|3 +-
 drivers/staging/hv/rndis_filter.c  |   38 +
 drivers/staging/hv/storvsc.c   |   98 --
 drivers/staging/hv/vmbus_private.h |3 +-
 9 files changed, 208 insertions(+), 172 deletions(-)

diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c
index 6c292e6..5a0923c 100644
--- a/drivers/staging/hv/channel.c
+++ b/drivers/staging/hv/channel.c
@@ -19,6 +19,8 @@
  *   Hank Janssen  hjans...@microsoft.com
  */
 #include linux/kernel.h
+#include linux/sched.h
+#include linux/wait.h
 #include linux/mm.h
 #include linux/slab.h
 #include linux/module.h
@@ -243,11 +245,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 
send_ringbuffer_size,
goto errorout;
}
 
-   openInfo-waitevent = osd_waitevent_create();
-   if (!openInfo-waitevent) {
-   err = -ENOMEM;
-   goto errorout;
-   }
+   init_waitqueue_head(openInfo-waitevent);
 
openMsg = (struct vmbus_channel_open_channel *)openInfo-msg;
openMsg-header.msgtype = CHANNELMSG_OPENCHANNEL;
@@ -280,8 +278,15 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 
send_ringbuffer_size,
goto Cleanup;
}
 
-   /* FIXME: Need to time-out here */
-   osd_waitevent_wait(openInfo-waitevent);
+   openInfo-wait_condition = 0;
+   wait_event_timeout(openInfo-waitevent,
+   openInfo-wait_condition,
+   msecs_to_jiffies(1000));
+   if (openInfo-wait_condition == 0) {
+   err = -ETIMEDOUT;
+   goto errorout;
+   }
+
 
if (openInfo-response.open_result.status == 0)
DPRINT_INFO(VMBUS, channel %p open success!!, newchannel);
@@ -294,7 +299,6 @@ Cleanup:
list_del(openInfo-msglistentry);
spin_unlock_irqrestore(vmbus_connection.channelmsg_lock, flags);
 
-   kfree(openInfo-waitevent);
kfree(openInfo);
return 0;
 
@@ -509,11 +513,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, 
void *kbuffer,
if (ret)
return ret;
 
-   msginfo-waitevent = osd_waitevent_create();
-   if (!msginfo-waitevent) {
-   ret = -ENOMEM;
-   goto Cleanup;
-   }
+   init_waitqueue_head(msginfo-waitevent);
 
gpadlmsg = (struct vmbus_channel_gpadl_header *)msginfo-msg;
gpadlmsg-header.msgtype = CHANNELMSG_GPADL_HEADER;
@@ -533,6 +533,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, 
void *kbuffer,
DPRINT_DBG(VMBUS, Sending GPADL Header - len %zd,
   msginfo-msgsize - sizeof(*msginfo));
 
+   msginfo-wait_condition = 0;
ret = vmbus_post_msg(gpadlmsg, msginfo-msgsize -
   sizeof(*msginfo));
if (ret != 0) {
@@ -566,7 +567,11 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, 
void *kbuffer,
 
}
}
-   osd_waitevent_wait(msginfo-waitevent);
+   wait_event_timeout(msginfo-waitevent,
+   msginfo-wait_condition,
+   msecs_to_jiffies(1000));
+   BUG_ON(msginfo-wait_condition == 0);
+
 
/* At this point, we received the gpadl created msg */
DPRINT_DBG(VMBUS, Received GPADL created 
@@ -582,7 +587,6 @@ Cleanup:
list_del(msginfo-msglistentry);
spin_unlock_irqrestore(vmbus_connection.channelmsg_lock, flags);
 
-   kfree(msginfo-waitevent);
kfree(msginfo);
return ret;
 }
@@ -605,11 +609,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, 
u32 gpadl_handle)
if (!info)
return -ENOMEM;
 
-   info-waitevent = osd_waitevent_create();
-   if (!info-waitevent) {
-   kfree(info);
-   return -ENOMEM;
-   }
+   init_waitqueue_head(info-waitevent);
 
msg = (struct vmbus_channel_gpadl_teardown *)info-msg;
 
@@ -621,22 +621,20 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, 
u32 gpadl_handle)
list_add_tail(info-msglistentry,
  vmbus_connection.chn_msg_list);
spin_unlock_irqrestore(vmbus_connection.channelmsg_lock, flags);
-
+   info-wait_condition = 0;
ret =