On Thu, 7 Oct 2010, Kevin Hilman wrote:

> My confusion is not about the use of spinlocks, it's a question of what
> is being busy-waited for, and the thread that is being waited for is
> going to complete when interrupts are disabled.
> 
> Sorry to be dense, but can you (re)summarize what you're proposing as I
> think I'm getting mixed up with all the various options we've been
> tossing around.
> 
> If it can work, I'm certainly in favor of a busy-wait approach as it 
> really ensures that sync requests are handled quickly.

Okay, here's the story in a nutshell.  Allowing a subsystem's or
driver's runtime-PM callbacks to run with interrupts disabled faces two
obstacles:

   (1): We don't want two different CPUs to run callbacks for the
        same device at the same time.  So if a callback is already
        running on one CPU (i.e., if the device's runtime status is
        either SUSPENDING or RESUMING) then another CPU can't be
        allowed to invoke a callback.

        Thus, you can't do a synchronous pm_runtime_resume_irq()
        if the device is in the middle of a suspend or resume
        operation.  We're left with two choices: Fail the synchronous
        call and force the driver to defer matters to a workqueue
        (possibly masking an IRQ line in the meantime), or busy-wait
        until the concurrent operation finishes.

        If the PM core simply avoids releasing dev->power.lock before
        invoking the runtime_suspend or runtime_resume callback, the
        end result is almost the same as with busy-waiting.

   (2): In general we can't resume a device if its parent is suspended.
        If the parent's runtime_resume routine needs to run with
        interrupts enabled then there's no way to resume the device
        while keeping interrupts disabled.

        Possible solutions involve, again, deferring matters to a
        workqueue, or else simply not allowing the situation to arise
        in the first place (forbid a device to have interrupt-disabled 
        callbacks unless its parent does too or the parent doesn't use 
        runtime PM at all).

In general I'm against the solutions that require a workqueue.  Raphael 
appears to favor workqueues for (1) and be against them for (2).

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to