greybus: fix a timeout race
Whenever we send a request message we start a timer to ensure the we don't wait too long for the matching response to arrive. Currently we set up the timeout *after* sending the message, but that is subject to a race--the response could arrive (and the timeout prematurely disabled) before the timeout is even set up. Set up the timeout before sending the message. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
This commit is contained in:
parent
5e68995784
commit
e8b48d1586
|
@ -447,13 +447,20 @@ int gb_operation_request_send(struct gb_operation *operation,
|
|||
*/
|
||||
operation->callback = callback;
|
||||
gb_pending_operation_insert(operation);
|
||||
|
||||
/*
|
||||
* We impose a time limit for requests to complete. We need
|
||||
* to set the timer before we send the request though, so we
|
||||
* don't lose a race with the receipt of the resposne.
|
||||
*/
|
||||
timeout = msecs_to_jiffies(OPERATION_TIMEOUT_DEFAULT);
|
||||
schedule_delayed_work(&operation->timeout_work, timeout);
|
||||
|
||||
/* All set, send the request */
|
||||
ret = gb_message_send(&operation->request, GFP_KERNEL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* We impose a time limit for requests to complete. */
|
||||
timeout = msecs_to_jiffies(OPERATION_TIMEOUT_DEFAULT);
|
||||
schedule_delayed_work(&operation->timeout_work, timeout);
|
||||
if (!callback)
|
||||
ret = gb_operation_wait(operation);
|
||||
|
||||
|
|
Loading…
Reference in New Issue