Re: [PATCH] staging: greybus: operation: add generic timeout support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 23/01/17 12:04, Johan Hovold wrote:

> +static void gb_operation_timeout(unsigned long arg)
> +{
> +	struct gb_operation *operation = (void *)arg;
> +
> +	if (gb_operation_result_set(operation, -ETIMEDOUT)) {
> +		/*
> +		 * A stuck request message will be cancelled from the
> +		 * workqueue.
> +		 */
> +		queue_work(gb_operation_completion_wq, &operation->work);
> +	}
> +}
> +


If queue_work fails, you will never wake up the waiter.

> -
> -	ret = wait_for_completion_interruptible_timeout(&operation->completion,
> -							timeout_jiffies);
> +	ret = wait_for_completion_interruptible(&operation->completion);

Note, that's a case I explicitly handle (failure to queue the work) in
the async set I sent out.

On gbsim at any rate, with a sufficient number of outstanding operations
in-flight it's possible to cause queue_work() to fail. Since you're in a
timer callback you're atomic so you can't call gb_operation_cancel()
here directly, those two reasons are why I did it in a work-queue as
opposed to a timer.

That's why I trapped that error at the send() stage of the operation -
because testing it out on gbsim showed messages getting lost @ the
queue_work stage.

---
bod

_______________________________________________
greybus-dev mailing list
greybus-dev@xxxxxxxxxxxxxxxx
https://lists.linaro.org/mailman/listinfo/greybus-dev




[Index of Archives]     [Asterisk App Development]     [PJ SIP]     [Gnu Gatekeeper]     [IETF Sipping]     [Info Cyrus]     [ALSA User]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite News]     [Deep Creek Hot Springs]     [Yosemite Campsites]     [ISDN Cause Codes]     [Asterisk Books]

  Powered by Linux