Re: Query on usb/core/devio.c

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

 



On Do, 2018-10-18 at 13:42 -0400, Alan Stern wrote:
> 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

If and only if you want to do this with one ioctl()
If you separate the runtime-PM put and the get, you can do it without
the waiting part.

> > > 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);

Yes and that is the problem. Why do you want to wait for the result
of runtime-PM put ? If we need a channel for notifying user space
about resume of a device, why wait for the result of suspend instead
of using the same channel?

> > 
> > ps->resume_done = false;
> > 
> > "ps->resume_done = true;" will be done by the runtime resume call-back.

No. You cannot do that in this way. It needs to be a unified device
state or a sequence of multiple suspends and resumes will have strange
results.

	Regards
		Oliver




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

  Powered by Linux