Re: Query on usb/core/devio.c

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

 



On Thu, 18 Oct 2018, Mayuresh Kulkarni wrote:

> > The only way to make the ioctl work properly is to have it do a 
> > runtime-PM put at the start and then a runtime-PM get before it 
> > returns.  This is true regardless of the reason for returning: normal 
> > termination, timeout, signal, whatever.  Nothing else would be safe.
> > 
> 
> Will below steps work safely (sometimes pseudo-code/snippets help to align)? -
> 
> "new" ioctl -
> 
> timeout is parameter to ioctl.
> 
> /* attempt suspend of device */
> usb_autosuspend_device(dev);
> 
> usb_unlock_device(dev);
> r = wait_event_interruptible_timeout(ps->resume_wait,
>     (ps->resume_done == true), timeout * HZ);

Not exactly.  The condition to test here is whether the device has been 
suspended, so it's more like this:

	r = wait_event_interruptible_timeout(ps->suspend_wait,
		(ps->suspend_done == true), timeout * HZ);

where ps->suspend_done is set by the runtime_suspend callback.  After 
this we will do:

	if (r > 0)	/* Device suspended before the timeout expired */
		r = wait_event_interruptible(ps->resume_wait,
			(ps->resume_done == true));

> usb_lock_device(dev);
> 
> /*
>  * There are 3 possibilities here:
>  * 1. Device did suspend and resume (success)
>  * 2. Signal was received (failed suspend)
>  * 3. Time-out happened (failed suspend)

4. Device did suspend but a signal was received before the device 
resumed.

>  * In any of above cases, we need to resume device.
>  */
> usb_autoresume_device(dev);
> 
> ps->resume_done = false;
> 
> "ps->resume_done = true;" will be done by the runtime resume call-back.

Exactly.  You got it.  Will that let you accomplish what you want?

Alan Stern




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux