public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
* Runtime PM API issue
@ 2010-03-14 19:28 Alan Stern
  2010-03-14 19:41 ` Rafael J. Wysocki
  0 siblings, 1 reply; 2+ messages in thread
From: Alan Stern @ 2010-03-14 19:28 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Linux-pm mailing list

Rafael:

I ran across this issue recently.  The best way I can see to fix it is
to modify the runtime PM API slightly.

Drivers that handle high throughput may not want to incur the overhead
of testing for idleness after every I/O operation; they may prefer to
poll at regular intervals.  Currently this is awkward and inefficient
to do.

First, recognize that idleness testing will often be needed in the 
runtime_suspend method, not just in the runtime_idle method.  This is 
for two reasons:

    (1) Suppose the driver determines the device isn't idle, so it 
	wants to schedule another poll in the future.  There is no
	pm_schedule_idle() routine, so it has to use 
	pm_schedule_suspend().  When the delay expires, the job of 
	determining whether the device is idle then has to fall on the 
	runtime_suspend method.

    (2) More importantly, an interrupt-driven driver will most likely
	want to avoid races by doing both the idleness test and the 
	actual suspend under a single spinlock_irq().  This can't be 
	done if the test is in a different method from the suspend.

Now here's the point.  Suppose the runtime_suspend method determines
that the device isn't idle.  It needs to schedule another poll in the
future.  But it can't!  pm_schedule_suspend() will fail if it is called
while the runtime status is SUSPENDING.  Instead the suspend call has
to be allowed to fail; then the PM core will call the runtime_idle
method, which has to repeat the idleness test and call
pm_schedule_suspend().  As I said before, this is inefficient.

It's also a little awkward, since it requires the driver to maintain
some extra device status information -- otherwise the runtime_idle
method doesn't know whether it's being called because a suspend attempt
failed or for some more benign reason.

The best solution seems to be to allow pm_schedule_suspend() to succeed
if the status is SUSPENDING.  In turn, __pm_runtime_suspend() should
avoid calling pm_runtime_cancel_pending() if the suspend fails with
-EAGAIN, and it should call pm_runtime_deactivate_timer() if the
suspend succeeds.

What do you think?

Alan Stern

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-03-14 19:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-14 19:28 Runtime PM API issue Alan Stern
2010-03-14 19:41 ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox