lkml.org 
[lkml]   [2011]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 116/206] Staging: hv: Use the completion abstraction in struct rndis_request
    Date
    Use the completion abstraction in struct rndis_request to synchronize.

    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>
    ---
    drivers/staging/hv/rndis_filter.c | 33 ++++++++++++++-------------------
    1 files changed, 14 insertions(+), 19 deletions(-)

    diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c
    index ee74cd1..2037836 100644
    --- a/drivers/staging/hv/rndis_filter.c
    +++ b/drivers/staging/hv/rndis_filter.c
    @@ -59,8 +59,7 @@ struct rndis_device {

    struct rndis_request {
    struct list_head list_ent;
    - int wait_condition;
    - wait_queue_head_t wait_event;
    + struct completion wait_event;

    /*
    * FIXME: We assumed a fixed size response here. If we do ever need to
    @@ -125,7 +124,7 @@ static struct rndis_request *get_rndis_request(struct rndis_device *dev,
    if (!request)
    return NULL;

    - init_waitqueue_head(&request->wait_event);
    + init_completion(&request->wait_event);

    rndis_msg = &request->request_msg;
    rndis_msg->ndis_msg_type = msg_type;
    @@ -305,8 +304,7 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
    }
    }

    - request->wait_condition = 1;
    - wake_up(&request->wait_event);
    + complete(&request->wait_event);
    } else {
    dev_err(&dev->net_dev->dev->device,
    "no rndis request found for this response "
    @@ -465,6 +463,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
    struct rndis_query_request *query;
    struct rndis_query_complete *query_complete;
    int ret = 0;
    + int t;

    if (!result)
    return -EINVAL;
    @@ -484,14 +483,12 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
    query->info_buflen = 0;
    query->dev_vc_handle = 0;

    - request->wait_condition = 0;
    ret = rndis_filter_send_request(dev, request);
    if (ret != 0)
    goto Cleanup;

    - wait_event_timeout(request->wait_event, request->wait_condition,
    - msecs_to_jiffies(1000));
    - if (request->wait_condition == 0) {
    + t = wait_for_completion_timeout(&request->wait_event, HZ);
    + if (t == 0) {
    ret = -ETIMEDOUT;
    goto Cleanup;
    }
    @@ -543,7 +540,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
    struct rndis_set_request *set;
    struct rndis_set_complete *set_complete;
    u32 status;
    - int ret;
    + int ret, t;

    request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG,
    RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
    @@ -562,14 +559,13 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
    memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
    &new_filter, sizeof(u32));

    - request->wait_condition = 0;
    ret = rndis_filter_send_request(dev, request);
    if (ret != 0)
    goto Cleanup;

    - wait_event_timeout(request->wait_event, request->wait_condition,
    - msecs_to_jiffies(2000));
    - if (request->wait_condition == 0) {
    + t = wait_for_completion_timeout(&request->wait_event, HZ);
    +
    + if (t == 0) {
    ret = -1;
    dev_err(&dev->net_dev->dev->device,
    "timeout before we got a set response...\n");
    @@ -624,7 +620,7 @@ static int rndis_filter_init_device(struct rndis_device *dev)
    struct rndis_initialize_request *init;
    struct rndis_initialize_complete *init_complete;
    u32 status;
    - int ret;
    + int ret, t;

    request = get_rndis_request(dev, REMOTE_NDIS_INITIALIZE_MSG,
    RNDIS_MESSAGE_SIZE(struct rndis_initialize_request));
    @@ -642,7 +638,6 @@ static int rndis_filter_init_device(struct rndis_device *dev)

    dev->state = RNDIS_DEV_INITIALIZING;

    - request->wait_condition = 0;
    ret = rndis_filter_send_request(dev, request);
    if (ret != 0) {
    dev->state = RNDIS_DEV_UNINITIALIZED;
    @@ -650,9 +645,9 @@ static int rndis_filter_init_device(struct rndis_device *dev)
    }


    - wait_event_timeout(request->wait_event, request->wait_condition,
    - msecs_to_jiffies(1000));
    - if (request->wait_condition == 0) {
    + t = wait_for_completion_timeout(&request->wait_event, HZ);
    +
    + if (t == 0) {
    ret = -ETIMEDOUT;
    goto Cleanup;
    }
    --
    1.7.4.1


    \
     
     \ /
      Last update: 2011-05-09 23:51    [W:4.784 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site