Staging: hv: Use completion abstraction to synchronize in vmbus_channel_msginfo
authorK. Y. Srinivasan <kys@microsoft.com>
Tue, 10 May 2011 14:55:39 +0000 (07:55 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 11 May 2011 20:49:14 +0000 (13:49 -0700)
Use completion abstraction to synchronize in vmbus_channel_msginfo.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/hv/channel.c
drivers/staging/hv/channel_mgmt.c
drivers/staging/hv/channel_mgmt.h
drivers/staging/hv/connection.c

index 5fcf9d341fb63ae79d68b13c88866b97e6509acf..1b50cb793cbae95183b5b3653b8a77ea7cdc7223 100644 (file)
@@ -177,7 +177,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
        struct vmbus_channel_msginfo *openInfo = NULL;
        void *in, *out;
        unsigned long flags;
-       int ret, err = 0;
+       int ret, t, err = 0;
 
        /* Aligned to page size */
        /* ASSERT(!(SendRingBufferSize & (PAGE_SIZE - 1))); */
@@ -240,7 +240,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
                goto errorout;
        }
 
-       init_waitqueue_head(&openInfo->waitevent);
+       init_completion(&openInfo->waitevent);
 
        openMsg = (struct vmbus_channel_open_channel *)openInfo->msg;
        openMsg->header.msgtype = CHANNELMSG_OPENCHANNEL;
@@ -270,11 +270,8 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
        if (ret != 0)
                goto Cleanup;
 
-       openInfo->wait_condition = 0;
-       wait_event_timeout(openInfo->waitevent,
-                       openInfo->wait_condition,
-                       msecs_to_jiffies(1000));
-       if (openInfo->wait_condition == 0) {
+       t = wait_for_completion_timeout(&openInfo->waitevent, HZ);
+       if (t == 0) {
                err = -ETIMEDOUT;
                goto errorout;
        }
@@ -495,6 +492,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
        u32 next_gpadl_handle;
        unsigned long flags;
        int ret = 0;
+       int t;
 
        next_gpadl_handle = atomic_read(&vmbus_connection.next_gpadl_handle);
        atomic_inc(&vmbus_connection.next_gpadl_handle);
@@ -503,7 +501,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
        if (ret)
                return ret;
 
-       init_waitqueue_head(&msginfo->waitevent);
+       init_completion(&msginfo->waitevent);
 
        gpadlmsg = (struct vmbus_channel_gpadl_header *)msginfo->msg;
        gpadlmsg->header.msgtype = CHANNELMSG_GPADL_HEADER;
@@ -518,7 +516,6 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
 
        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
 
-       msginfo->wait_condition = 0;
        ret = vmbus_post_msg(gpadlmsg, msginfo->msgsize -
                               sizeof(*msginfo));
        if (ret != 0)
@@ -546,10 +543,8 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
 
                }
        }
-       wait_event_timeout(msginfo->waitevent,
-                               msginfo->wait_condition,
-                               msecs_to_jiffies(1000));
-       BUG_ON(msginfo->wait_condition == 0);
+       t = wait_for_completion_timeout(&msginfo->waitevent, HZ);
+       BUG_ON(t == 0);
 
 
        /* At this point, we received the gpadl created msg */
@@ -573,7 +568,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
        struct vmbus_channel_gpadl_teardown *msg;
        struct vmbus_channel_msginfo *info;
        unsigned long flags;
-       int ret;
+       int ret, t;
 
        /* ASSERT(gpadl_handle != 0); */
 
@@ -582,7 +577,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
        if (!info)
                return -ENOMEM;
 
-       init_waitqueue_head(&info->waitevent);
+       init_completion(&info->waitevent);
 
        msg = (struct vmbus_channel_gpadl_teardown *)info->msg;
 
@@ -594,14 +589,12 @@ 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 = vmbus_post_msg(msg,
                               sizeof(struct vmbus_channel_gpadl_teardown));
 
        BUG_ON(ret != 0);
-       wait_event_timeout(info->waitevent,
-                       info->wait_condition, msecs_to_jiffies(1000));
-       BUG_ON(info->wait_condition == 0);
+       t = wait_for_completion_timeout(&info->waitevent, HZ);
+       BUG_ON(t == 0);
 
        /* Received a torndown response */
        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
index 95eef92f0b9da29e8fa9116ac2684c56700ed200..33cb5d5a9b84514f6ef691a0265c12f2e21f6163 100644 (file)
@@ -556,9 +556,9 @@ static void vmbus_onopen_result(struct vmbus_channel_message_header *hdr)
                            openmsg->openid == result->openid) {
                                memcpy(&msginfo->response.open_result,
                                       result,
-                                      sizeof(struct vmbus_channel_open_result));
-                               msginfo->wait_condition = 1;
-                               wake_up(&msginfo->waitevent);
+                                      sizeof(
+                                       struct vmbus_channel_open_result));
+                               complete(&msginfo->waitevent);
                                break;
                        }
                }
@@ -603,9 +603,9 @@ static void vmbus_ongpadl_created(struct vmbus_channel_message_header *hdr)
                            (gpadlcreated->gpadl == gpadlheader->gpadl)) {
                                memcpy(&msginfo->response.gpadl_created,
                                       gpadlcreated,
-                                      sizeof(struct vmbus_channel_gpadl_created));
-                               msginfo->wait_condition = 1;
-                               wake_up(&msginfo->waitevent);
+                                      sizeof(
+                                       struct vmbus_channel_gpadl_created));
+                               complete(&msginfo->waitevent);
                                break;
                        }
                }
@@ -648,9 +648,9 @@ static void vmbus_ongpadl_torndown(
                        if (gpadl_torndown->gpadl == gpadl_teardown->gpadl) {
                                memcpy(&msginfo->response.gpadl_torndown,
                                       gpadl_torndown,
-                                      sizeof(struct vmbus_channel_gpadl_torndown));
-                               msginfo->wait_condition = 1;
-                               wake_up(&msginfo->waitevent);
+                                      sizeof(
+                                       struct vmbus_channel_gpadl_torndown));
+                               complete(&msginfo->waitevent);
                                break;
                        }
                }
@@ -689,8 +689,7 @@ static void vmbus_onversion_response(
                        memcpy(&msginfo->response.version_response,
                              version_response,
                              sizeof(struct vmbus_channel_version_response));
-                       msginfo->wait_condition = 1;
-                       wake_up(&msginfo->waitevent);
+                       complete(&msginfo->waitevent);
                }
        }
        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
@@ -753,7 +752,7 @@ int vmbus_request_offers(void)
 {
        struct vmbus_channel_message_header *msg;
        struct vmbus_channel_msginfo *msginfo;
-       int ret;
+       int ret, t;
 
        msginfo = kmalloc(sizeof(*msginfo) +
                          sizeof(struct vmbus_channel_message_header),
@@ -761,7 +760,7 @@ int vmbus_request_offers(void)
        if (!msginfo)
                return -ENOMEM;
 
-       init_waitqueue_head(&msginfo->waitevent);
+       init_completion(&msginfo->waitevent);
 
        msg = (struct vmbus_channel_message_header *)msginfo->msg;
 
@@ -776,10 +775,8 @@ int vmbus_request_offers(void)
                goto cleanup;
        }
 
-       msginfo->wait_condition = 0;
-       wait_event_timeout(msginfo->waitevent, msginfo->wait_condition,
-                       msecs_to_jiffies(1000));
-       if (msginfo->wait_condition == 0) {
+       t = wait_for_completion_timeout(&msginfo->waitevent, HZ);
+       if (t == 0) {
                ret = -ETIMEDOUT;
                goto cleanup;
        }
index 3b2c39317bab6e7173c0005447add99fb6ed9675..f895d0a10fd66826496da9fb4c9fdae0b787e66b 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/workqueue.h>
+#include <linux/completion.h>
 #include "ring_buffer.h"
 #include "vmbus_channel_interface.h"
 #include "vmbus_packet_format.h"
@@ -290,8 +291,7 @@ struct vmbus_channel_msginfo {
        struct list_head submsglist;
 
        /* Synchronize the request/response if needed */
-       int wait_condition;
-       wait_queue_head_t waitevent;
+       struct completion  waitevent;
        union {
                struct vmbus_channel_version_supported version_supported;
                struct vmbus_channel_open_result open_result;
index 4f411a9f2a5aaf2e0bcf5973bf1913a0cbbb877b..92add3837c19f1fef1a8dc3d006c0b0745c8ff63 100644 (file)
@@ -44,6 +44,7 @@ struct vmbus_connection vmbus_connection = {
 int vmbus_connect(void)
 {
        int ret = 0;
+       int t;
        struct vmbus_channel_msginfo *msginfo = NULL;
        struct vmbus_channel_initiate_contact *msg;
        unsigned long flags;
@@ -101,7 +102,7 @@ int vmbus_connect(void)
                goto Cleanup;
        }
 
-       init_waitqueue_head(&msginfo->waitevent);
+       init_completion(&msginfo->waitevent);
 
        msg = (struct vmbus_channel_initiate_contact *)msginfo->msg;
 
@@ -134,10 +135,8 @@ int vmbus_connect(void)
        }
 
        /* Wait for the connection response */
-       msginfo->wait_condition = 0;
-       wait_event_timeout(msginfo->waitevent, msginfo->wait_condition,
-                       msecs_to_jiffies(1000));
-       if (msginfo->wait_condition == 0) {
+       t =  wait_for_completion_timeout(&msginfo->waitevent, HZ);
+       if (t == 0) {
                spin_lock_irqsave(&vmbus_connection.channelmsg_lock,
                                flags);
                list_del(&msginfo->msglistentry);