runtime PM ops and PCMCIA bus

Dominik Brodowski linux at dominikbrodowski.net
Mon Mar 22 16:03:39 EDT 2010


Alan,

many thanks for your extensive feedback!

On Mon, Mar 22, 2010 at 11:38:44AM -0400, Alan Stern wrote:
> On Sun, 21 Mar 2010, Dominik Brodowski wrote:
> > (2) Whenever two functions local to drivers/pcmcia/ds.c --
> >     runtime_suspend() or runtime_resume() -- are called,
> >     we need to force a synchronous call to pcmcia_dev_suspend(),
> >     or to pcmcia_dev_resume(). Currently, we do this by taking
> >     device_lock() and calling the function manually.
> 
> That seems like the right thing to do.  (Except that I don't know what 
> your device_lock() routine is for.)

Actually, that's the generic device_lock(), which replaced down(&dev->sem)
... which is used here to not let a reset or a runtime suspend/resume race
with a system sleep event.

> > (3) However, it'd be much nicer to be able to use the new runtime
> >     PM interface.
> 
> I don't understand.  Aren't runtime_suspend() and runtime_resume(), as 
> mentioned above, already part of your runtime PM interface?  Or at 
> least, intended to be part of your runtime PM interface?

Well, they are part of the PCMCIA-local runtime PM interface -- it is based
around the concept that an user may, whenever she wants, can set a PCMCIA
device (or the whole card) to the "suspend" state.

> > As the PCMCIA bus can always suspend,
> 
> Is that really literally true?  Don't you run into trouble if you try
> to suspend while a data transfer is taking place?  And if you've got a 
> whole series of transfers going on, does it really make sense to 
> suspend after each individual transfer, only to resume immediately when 
> the next transfer comes along?
> 
> How long should a pcmcia device have to remain idle before suspending 
> it will actually end up saving energy?
> 
> How does your driver determine when the device becomes idle (and just
> as important, stops being idle)?

Well, all of this is done by the user. I agree that it might make sense to
take all these issues into consideration -- e.g. by get/put commands used by
the ATA layer etc.

> >     To enable it, we should add
> > 
> >        pm_runtime_set_active(&p_dev->dev);
> >        pm_runtime_enable(&p_dev->dev);
> > 
> >     in pcmcia_device_add().
> 
> Yes.
> 
> > (4) What is then to be done to modify runtime_suspend() / runtime_resume() ?
> >     Is it:
> > 
> > + static int runtime_suspend(struct device *dev)
> > + {
> > + 	pm_runtime_put_noidle(dev);
> > + 	return pm_runtime_suspend(dev);
> > + }
> 
> This makes no sense at all.  pm_runtime_suspend() calls your 
> runtime_suspend() function, not the other way around.

Well, that's not what this "runtime_suspend()" does -- it is the wrapper for
userspace-issued suspend commands.

> > (5) Another problem I'm seeing with the put/get approach: there are three
> >     different callpaths where runtime_suspend() / runtime_resume() might
> >     be called.[*] However, each one decreases the counter, which might get < 0.
> 
> The counter should never become negative; if it does, there's a bug in
> your driver.  Every decrement should match a corresponding increment,
> just like with refcounts.  And the device should never be
> runtime-suspended unless the counter is 0.

what's the initial value, actually? Is it 0 or 1?

> One of the background assumptions behind the runtime PM
> framework is that users don't tell the system when to suspend devices.  

Ah, that's the fundamental issue. I agree that the PCMCIA subsystem does
something unusual here (relating to PCMCIA cards or PCMCIA devices) --
but I would prefer not to break how the system currently works.

> Instead, the system automatically suspends devices when it realizes
> they aren't being used.

That's what we could use for PCMCIA sockets.

> > --- a/drivers/pcmcia/Kconfig
> > +++ b/drivers/pcmcia/Kconfig
> > @@ -20,6 +20,7 @@ if PCCARD
> >  config PCMCIA
> >  	tristate "16-bit PCMCIA support"
> >  	select CRC32
> > +	select PM_RUNTIME
> 
> This seems very wrong.  Why do you need it?  Can't the pcmcia subsystem 
> work correctly without runtime PM support?  Hasn't it been working 
> correctly that way all along?

Oh yes, it did. However, continuing support for the PCMCIA-style "runtime
PM" might need to depend on PM_RUNTIME.

Will do write (and possibly test) some patches first, then get back to you
-- many thanks for your feedback. Really appreciate it!

Best,
	Dominik



More information about the linux-pcmcia mailing list