* Toward runtime power management in Linux
@ 2005-07-31 2:36 Alan Stern
2005-08-01 2:10 ` Leo L. Schwab
` (2 more replies)
0 siblings, 3 replies; 18+ messages in thread
From: Alan Stern @ 2005-07-31 2:36 UTC (permalink / raw)
To: Linux-pm mailing list
[-- Attachment #1: Type: TEXT/PLAIN, Size: 7669 bytes --]
Here are some preliminary thoughts on how runtime power management
(RTPM) should be implemented. They are very incomplete, but at least
I think they are heading in the right direction. Contributions are
welcome.
(Note: Below I will use "power states" and "power parent" in a very
general way. The actual states and dependencies need not be directly
connected with power utilization -- they can be more general concepts,
anything related to RTPM. Note also that this document does not
address system power management or the connections between the two
types of power management.)
Basic ideas
To start with, we've already agreed that drivers should maintain some
set of states for their devices. What these states should be, how
they are implemented and exported to userspace, and whether they are
defined by the device driver or by the bus subsystem, are all beyond
the scope of this document. We only need to know that there is a
userspace API (presumably involving sysfs) for requesting state
changes.
We have also agreed that runtime power state changes need to bubble up
the device tree. To handle this, drivers for interior nodes in the
tree can define "link states". Unlike the device states, these don't
necessarily describe physical hardware and they are not exported. A
link state merely encapsulates everything a power parent needs to know
about its children's requirements. Quite often these link states will
be identical with the parent's or the child's device states, but this
isn't a requirement since the link state is entirely private to the
parent and the child.
When a driver changes a device's state, it will notify all of the
power parents about link state changes while doing so. Note that a
device can have power parents other than its parent in the device
tree. A good example is a logical volume, whose parents would be all
the physical drives that support it. Other examples are plentiful in
the embedded world, where a device may rely on multiple buses for its
operation.
These notifications are one-way, child-to-parent only. We don't need
pre- and post-notifications; each message will inform the parent of a
single link-state change, which the parent will then carry out. The
parent will keep track of the link states for all its children, and
will adjust its own device state accordingly. How it does so is up to
the parent's driver.
An example will make this clearer. A PCI bridge is a parent, with a
PCI device as its child. The set of device states for both the parent and
the child is {D0, D1, D2, D3}. (Maybe some variants of D3 for special
situations; let's not worry about the details.) The link states will
also be D0 - D3. When the child want to go from D0 to D3, it first
changes the device's actual state and then notifies the parent about
the link change. The PCI bridge driver (which might be part of the
PCI core or might have to be added -- I don't know how this currently
works) will know how many child links it has in each state. If this
no more links remain in D0 then maybe the bridge can lower its own
power usage (and notify its parent in turn).
Similarly, when the PCI driver wants to increase its device's power
usage it will notify the parent first, which may cause the parent to
change its own power state. Then it will change the device's state.
It might turn out in practice that link states don't really need to be
separate from device states. However it's easy to think of situations
where the set of link states does have to be different from the set of
parent device states. For instance, a PCI USB controller will have
the usual D0 - D3 device states, but it will allow only ON and
SUSPENDED link states for the root-hub child. Likewise, there could
well be situations where link states are not the same as the child
device states. For instance, a device that uses multiple buses might
have to maintain different sorts of link states for each bus, all of
them different from its set of device states.
Practical considerations
Power-parent relations: How should we represent the extra power
parent-child relationships that aren't present in the device tree?
Would it be enough to give each device that needs it a subdirectory in
sysfs with symlinks to its power parents? Do we also need a symlink
from each parent to the child?
RTPM core: The scheme described above doesn't necessarily involve the
PM core. The notifications can be simple subroutine calls, perhaps
with support from the bus subsystem. It's not obvious how much core
support we will need for RTPM, apart from the sysfs interface.
Recursion: A consequence of doing things this way is that the
notifications can potentially use a lot of stack space as they
progress up the device tree. (I can't think of any simple
non-recursive technique for implementing the scheme.) Fortunately
this probably won't be too bad; the notifications will stop when they
reach a device that doesn't want to change its state (because it has
other children). So the recursion should not involve too many levels.
Still, it is something to watch out for.
Context: A relatively recent change to the driver model core added a
semaphore to struct device, and we will want to hold this semaphore
while making state changes. This immediately implies that RTPM needs
a process context to run in. Should we have a kernel thread or work
queue specially devoted to RTPM activities (idle autosuspend and so
forth)?
Order of locking: The general rule, needed to prevent deadlock, for
acquiring the device semaphores is this: Don't lock a device if you
already hold one of its descendants' locks. In other words, acquire
locks from the top of the tree going down. This makes things very
awkward, because the notification scheme for power state changes goes
in the wrong direction: up the tree. Even worse, it sometimes goes
_across_ the tree since power parents need not be device-tree parents.
I don't know how this should be resolved.
Idle-timeout RTPM: We certainly should have an API whereby userspace
can inform the kernel of an idle-timeout value to use for
autosuspending. (In principle there could be multiple timeout values,
for successively deeper levels of power saving.) This cries out to be
managed in a centralized way rather than letting each driver have its
own API. It's not so clear what the most efficient implementation
will be. Should every device have its own idle-timeout kernel timer?
(That's a lot of kernel timers.) Or should the RTPM kernel thread
wake up every second to scan a list of devices that may have exceeded
their idle timeouts?
Userspace support: It's easy to see how userspace could use sysfs to
request a single device state change. But what if the user wants to
suspend an entire subtree? Should there be support in the kernel for
doing this, including locking to prevent various races? Or should we
keep things simple and force the userspace tools to change the state
of each individual device in the subtree, working up from the bottom?
How can we cope with PPC suspend-to-ram, which doesn't use the
refrigerator? We don't want processes to go around resuming devices
in the middle of a system suspend.
Initial implementation: The USB core already contains code that
partially resembles this scheme. It's not fully correct for a couple of
reasons: The hub driver does not yet check to see when all of the
hub's children are suspended (which would allow the hub to suspend as
well). And the code does not include any provision for automatically
suspending a USB device when all of its interfaces are suspended.
What other considerations are there?...
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-07-31 2:36 Toward runtime power management in Linux Alan Stern
@ 2005-08-01 2:10 ` Leo L. Schwab
2005-08-01 11:44 ` Amit Kucheria
2005-08-01 14:07 ` Alan Stern
[not found] ` <Pine.LNX.4.50.0508011712220.2764-100000@monsoon.he.net>
2005-08-25 3:12 ` Benjamin Herrenschmidt
2 siblings, 2 replies; 18+ messages in thread
From: Leo L. Schwab @ 2005-08-01 2:10 UTC (permalink / raw)
To: linux-pm
[-- Attachment #1: Type: text/plain, Size: 3117 bytes --]
On Sat, Jul 30, 2005 at 10:36:56PM -0400, Alan Stern wrote:
> An example will make this clearer. A PCI bridge is a parent, with a
> PCI device as its child. The set of device states for both the parent and
> the child is {D0, D1, D2, D3}. (Maybe some variants of D3 for special
> situations; let's not worry about the details.) The link states will
> also be D0 - D3. When the child want to go from D0 to D3, it first
> ^^^^^^^^
> changes the device's actual state and then notifies the parent about
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> the link change.
> ^^^^^^^^^^^^^^^
Strong disagreement. Power state changes must be allowed to fail
("Spin up the 15K RPM drive? I'm sorry, there's only 3 Watts of power left
to spare"). So you must first ask the parent for a power state change
before you perform your own so it has the opportunity to deny the request.
Besides, in the case of USB, you may not have any power at all until you
notify the parent bus/hub manager to wake up.
> These notifications are one-way, child-to-parent only. We don't need
> pre- and post-notifications; each message will inform the parent of a
> single link-state change, which the parent will then carry out.
I don't see how this will work. Bringing up power/resuming must
happen in parent-to-child order, otherwise endpoint devices may not have any
power at all when you try to bring them up. Cutting off power/suspending
must happen in child-to-parent order, since parents can't know when it's
safe to cut off power until the child is completely quiesced.
> Idle-timeout RTPM: We certainly should have an API whereby userspace
> can inform the kernel of an idle-timeout value to use for
> autosuspending. (In principle there could be multiple timeout values,
> for successively deeper levels of power saving.) This cries out to be
> managed in a centralized way rather than letting each driver have its
> own API. It's not so clear what the most efficient implementation
> will be. Should every device have its own idle-timeout kernel timer?
> (That's a lot of kernel timers.)
Whether you do it in user space or kernel space, you're going to
potentially schedule a lot of timers.
> Or should the RTPM kernel thread
> wake up every second to scan a list of devices that may have exceeded
> their idle timeouts?
>
This could potentially make performance-conscious apps "hiccup"
once every second as this thread goes walking the list looking for
candidates to shut off. Try to avoid this; if nothing is happening, nothing
should be running.
> Userspace support: It's easy to see how userspace could use sysfs to
> request a single device state change. But what if the user wants to
> suspend an entire subtree? [ ... ]
If you wanted to get really fancy, you could establish via a
userspace API a named "device collection" which acts as a virtual device.
You then apply the state change to the device collection, and the kernel
percolates it through all the actual devices, taking locking into account.
Schwab
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-01 2:10 ` Leo L. Schwab
@ 2005-08-01 11:44 ` Amit Kucheria
2005-08-01 14:16 ` Alan Stern
[not found] ` <20050802024415.C3518DB57B@adsl-69-107-32-110.dsl.pltn13.pacbell.net>
2005-08-01 14:07 ` Alan Stern
1 sibling, 2 replies; 18+ messages in thread
From: Amit Kucheria @ 2005-08-01 11:44 UTC (permalink / raw)
To: linux-pm
[-- Attachment #1: Type: text/plain, Size: 2629 bytes --]
On Sun, 2005-07-31 at 19:10 -0700, ext Leo L. Schwab wrote:
<snip>
>
> > Idle-timeout RTPM: We certainly should have an API whereby userspace
> > can inform the kernel of an idle-timeout value to use for
> > autosuspending. (In principle there could be multiple timeout values,
> > for successively deeper levels of power saving.) This cries out to be
> > managed in a centralized way rather than letting each driver have its
> > own API. It's not so clear what the most efficient implementation
> > will be. Should every device have its own idle-timeout kernel timer?
> > (That's a lot of kernel timers.)
Per-device idle-timeouts are IMHO important in embedded space where one
wants finer-grained control. e.g. Sometimes it might be better to just
let a device be active to avoid wake-up latencies from power-save mode.
Also, some application usage profiles might dictate changes in
idle-timeout values to allow optimisation for the common use-cases.
> Whether you do it in user space or kernel space, you're going to
> potentially schedule a lot of timers.
> > Or should the RTPM kernel thread
> > wake up every second to scan a list of devices that may have exceeded
> > their idle timeouts?
> >
> This could potentially make performance-conscious apps "hiccup"
> once every second as this thread goes walking the list looking for
> candidates to shut off. Try to avoid this; if nothing is happening, nothing
> should be running.
Whether the idle-timeout is implemented using kernel timers or a kernel
thread checking for timeout values, is a more difficult question.
Ideally, we would want to avoid unnecessary (processor) wakeups simply
to check a list of timeout values. Dynamic tick patch allows us to
wakeup the processor only when there is work to do - timers set to go
off. So, that's one strike against the kernel thread approach.
But it needs more thinking.
> > Userspace support: It's easy to see how userspace could use sysfs to
> > request a single device state change. But what if the user wants to
> > suspend an entire subtree? [ ... ]
>
> If you wanted to get really fancy, you could establish via a
> userspace API a named "device collection" which acts as a virtual device.
> You then apply the state change to the device collection, and the kernel
> percolates it through all the actual devices, taking locking into account.
>
> Schwab
If I tell a bus to power down, couldn't the PM framework take care of
recursively sending 'power down' message to all children, wait for
confirmation, and then power itself down?
Regards,
Amit
--
Amit Kucheria <amit.kucheria@nokia.com>
Nokia
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-01 11:44 ` Amit Kucheria
@ 2005-08-01 14:16 ` Alan Stern
[not found] ` <20050802024415.C3518DB57B@adsl-69-107-32-110.dsl.pltn13.pacbell.net>
1 sibling, 0 replies; 18+ messages in thread
From: Alan Stern @ 2005-08-01 14:16 UTC (permalink / raw)
To: Amit Kucheria; +Cc: linux-pm
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1762 bytes --]
On Mon, 1 Aug 2005, Amit Kucheria wrote:
> Per-device idle-timeouts are IMHO important in embedded space where one
> wants finer-grained control. e.g. Sometimes it might be better to just
> let a device be active to avoid wake-up latencies from power-save mode.
> Also, some application usage profiles might dictate changes in
> idle-timeout values to allow optimisation for the common use-cases.
There's no question about having per-device idle timeouts, or about
letting userspace set the timeout values (or make the value be infinite so
there is no idle timeout ever). The question is how to implement them:
using kernel timers or using a kernel thread? Note that having some sort
of thread available will be necessary in any case, since the actual
suspend/resume function calls require a process context.
> Whether the idle-timeout is implemented using kernel timers or a kernel
> thread checking for timeout values, is a more difficult question.
> Ideally, we would want to avoid unnecessary (processor) wakeups simply
> to check a list of timeout values. Dynamic tick patch allows us to
> wakeup the processor only when there is work to do - timers set to go
> off. So, that's one strike against the kernel thread approach.
>
> But it needs more thinking.
Yes, it's complex. Constantly updating the timer expirations every time
a device carries out an activity can also be expensive.
> If I tell a bus to power down, couldn't the PM framework take care of
> recursively sending 'power down' message to all children, wait for
> confirmation, and then power itself down?
Well sure, we _could_. The question is, _should_ we? Or should the
kernel force you to tell each of the bus's children to power down before
telling the bus?
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread[parent not found: <20050802024415.C3518DB57B@adsl-69-107-32-110.dsl.pltn13.pacbell.net>]
* Re: Toward runtime power management in Linux
[not found] ` <20050802024415.C3518DB57B@adsl-69-107-32-110.dsl.pltn13.pacbell.net>
@ 2005-08-04 8:06 ` Tony Lindgren
2005-08-04 16:02 ` david-b
2005-08-14 19:53 ` Pavel Machek
0 siblings, 2 replies; 18+ messages in thread
From: Tony Lindgren @ 2005-08-04 8:06 UTC (permalink / raw)
To: david-b; +Cc: linux-pm
[-- Attachment #1: Type: text/plain, Size: 959 bytes --]
* david-b@pacbell.net <david-b@pacbell.net> [050801 19:44]:
> > From: Amit Kucheria <amit.kucheria@nokia.com>
> > Date: Mon, 01 Aug 2005 14:44:46 +0300
> >
> > ...
> > If I tell a bus
>
> (... or any other device with child nodes, like a USB hub or
> various system bridges ...)
>
>
> > to power down, couldn't the PM framework take care of
> > recursively sending 'power down' message to all children, wait for
> > confirmation, and then power itself down?
>
> Could, arguably should -- but doesn't, just now. I don't
> think I'd try to manage all system devices' power through
> sysfs from usermode yet ... :)
There are some cases where the whole bus can be powered down, but
a device on the bus needs to be left on to provide wake-up events.
The wake-up event might take another path, such as GPIO, and the
bus can be powered down with some devices on.
An example that comes to mind is the smc91x Ethernet driver on
OMAP OSK board.
Regards,
Tony
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-04 8:06 ` Tony Lindgren
@ 2005-08-04 16:02 ` david-b
2005-08-14 19:53 ` Pavel Machek
1 sibling, 0 replies; 18+ messages in thread
From: david-b @ 2005-08-04 16:02 UTC (permalink / raw)
To: tony; +Cc: linux-pm
[-- Attachment #1: Type: text/plain, Size: 1822 bytes --]
> Date: Thu, 4 Aug 2005 01:06:49 -0700
> From: Tony Lindgren <tony@atomide.com>
>
> * david-b@pacbell.net <david-b@pacbell.net> [050801 19:44]:
> > > to power down, couldn't the PM framework take care of
> > > recursively sending 'power down' message to all children, wait for
> > > confirmation, and then power itself down?
> >
> > Could, arguably should -- but doesn't, just now. I don't
> > think I'd try to manage all system devices' power through
> > sysfs from usermode yet ... :)
>
> There are some cases where the whole bus can be powered down, but
> a device on the bus needs to be left on to provide wake-up events.
And many similar examples of cases where the "bus" isn't the
traditional "motherboard expansion" model with power, data,
address, and control lines in parallel. They may not even
be grouped together on an expansion connector.
> The wake-up event might take another path, such as GPIO, and the
> bus can be powered down with some devices on.
>
> An example that comes to mind is the smc91x Ethernet driver on
> OMAP OSK board.
The smc91x is a "platform_bus" device, which has interesting
power management characteristics. Like it usually can't all
be turned off, and certainly not all at once ... :)
Some folk might find the hardware spec [1] for this board
to be interesting: mostly text explaining the schematics,
subsystem by subsystem, and much easier to digest than raw
schematics. The power management subsection also includes
a power budget. I think it's fair to call that board design
"power-aware", though not very power-optimized if it does
have a battery-powered mode.
That's a fair example of hardware that Linux runtime PM
should be able to handle without breaking a sweat; there's
nothing very unusual about it.
- Dave
[1] http://omap.spectrumdigital.com/osk5912/
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Toward runtime power management in Linux
2005-08-04 8:06 ` Tony Lindgren
2005-08-04 16:02 ` david-b
@ 2005-08-14 19:53 ` Pavel Machek
1 sibling, 0 replies; 18+ messages in thread
From: Pavel Machek @ 2005-08-14 19:53 UTC (permalink / raw)
To: Tony Lindgren; +Cc: david-b, linux-pm
[-- Attachment #1: Type: text/plain, Size: 634 bytes --]
Hi!
> > > to power down, couldn't the PM framework take care of
> > > recursively sending 'power down' message to all children, wait for
> > > confirmation, and then power itself down?
> >
> > Could, arguably should -- but doesn't, just now. I don't
> > think I'd try to manage all system devices' power through
> > sysfs from usermode yet ... :)
>
> There are some cases where the whole bus can be powered down, but
> a device on the bus needs to be left on to provide wake-up events.
such device can be "off" as far as driver model knows. Pavel
--
64 bytes from 195.113.31.123: icmp_seq=28 ttl=51 time=448769.1 ms
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Toward runtime power management in Linux
2005-08-01 2:10 ` Leo L. Schwab
2005-08-01 11:44 ` Amit Kucheria
@ 2005-08-01 14:07 ` Alan Stern
2005-08-01 15:10 ` Jordan Crouse
2005-08-04 17:24 ` Igor Stoppa
1 sibling, 2 replies; 18+ messages in thread
From: Alan Stern @ 2005-08-01 14:07 UTC (permalink / raw)
To: Leo L. Schwab; +Cc: linux-pm
[-- Attachment #1: Type: TEXT/PLAIN, Size: 6721 bytes --]
Evidently between us there is a tremendous communication gap. No doubt
it's mostly my fault for not making the original document sufficiently
detailed. Let me try to clear things up...
On Sun, 31 Jul 2005, Leo L. Schwab wrote:
> On Sat, Jul 30, 2005 at 10:36:56PM -0400, Alan Stern wrote:
> > An example will make this clearer. A PCI bridge is a parent, with a
> > PCI device as its child. The set of device states for both the parent and
> > the child is {D0, D1, D2, D3}. (Maybe some variants of D3 for special
> > situations; let's not worry about the details.) The link states will
> > also be D0 - D3. When the child want to go from D0 to D3, it first
> > ^^^^^^^^
> > changes the device's actual state and then notifies the parent about
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > the link change.
> > ^^^^^^^^^^^^^^^
>
> Strong disagreement. Power state changes must be allowed to fail
> ("Spin up the 15K RPM drive? I'm sorry, there's only 3 Watts of power left
> to spare"). So you must first ask the parent for a power state change
> before you perform your own so it has the opportunity to deny the request.
Yes, power state changes must be allowed to fail. I omitted discussing
error handling, but clearly the parent notification must be able to return
an error code, which might force the child to abort a state change.
However you have badly misunderstood this example. In the example the
device goes from D0 to D3, thereby _reducing_ its power consumption.
Hence it doesn't want to ask the parent to reduce the available power
supply _before_ it prepares the device -- rather just the opposite. If
the device were moving from D3 back to D0 then, as you say, it would have
to notify the parent first.
> Besides, in the case of USB, you may not have any power at all until you
> notify the parent bus/hub manager to wake up.
Just so. The important point is that the parent notification and the
device state change must happen in the correct relative order, and that
order depends on the exact nature of the change. A really complicated
state change might even require multiple intermediate parent
notifications, or separate notifications to multiple parents.
> > These notifications are one-way, child-to-parent only. We don't need
> > pre- and post-notifications; each message will inform the parent of a
> > single link-state change, which the parent will then carry out.
>
> I don't see how this will work. Bringing up power/resuming must
> happen in parent-to-child order, otherwise endpoint devices may not have any
> power at all when you try to bring them up. Cutting off power/suspending
> must happen in child-to-parent order, since parents can't know when it's
> safe to cut off power until the child is completely quiesced.
Here's how it will work: For bringing up power/resuming, the child first
notifies the parent about its impending state change. The parent realizes
that it must increase its own power allocation, and it does so before
returning. Then the child can continue the resume procedure, with
sufficient power available. For cutting off power/suspending, the child
first reduces its power consumption and then notifies the parent about the
state change. The parent realizes that it can now decrease its own power
level, and it does so before returning.
In each case there is only _one_ notification. It's not necessary for the
child to notify the parent both before and after each individual state
change. And it's not necessary for the parent to notify the child at all
(other than by possibly returning an error code in response to the child's
notification).
> > Idle-timeout RTPM: We certainly should have an API whereby userspace
> > can inform the kernel of an idle-timeout value to use for
> > autosuspending. (In principle there could be multiple timeout values,
> > for successively deeper levels of power saving.) This cries out to be
> > managed in a centralized way rather than letting each driver have its
> > own API. It's not so clear what the most efficient implementation
> > will be. Should every device have its own idle-timeout kernel timer?
> > (That's a lot of kernel timers.)
>
> Whether you do it in user space or kernel space, you're going to
> potentially schedule a lot of timers.
You must have written that before reading the very next sentence:
> > Or should the RTPM kernel thread
> > wake up every second to scan a list of devices that may have exceeded
> > their idle timeouts?
If we have a kernel thread working like this, then there's no need for a
lot of kernel timers.
> This could potentially make performance-conscious apps "hiccup"
> once every second as this thread goes walking the list looking for
> candidates to shut off. Try to avoid this; if nothing is happening, nothing
> should be running.
I don't understand this comment at all. Lots of things happen
periodically in the kernel: threads wake up, timers go off... Are you
suggesting that, for example, the page-flush thread shouldn't wake up
from time to time either?
Furthermore, there's a trade-off between doing a bunch of chores all at
once (i.e., have a kernel thread scan a list of devices to see which have
exceeded their idle timeouts) and distributing those chores piecemeal
(i.e., have each driver reschedule an idle timer every time one of its
devices carries out some activity). In the absence of actual measurements
it's impossible to know which will affect performance more -- and in fact
the effects are likely to be highly variable, depending on workload.
As for your "if nothing is happening, nothing should be running" mantra,
it runs counter to the very idea of runtime PM. If nothing is happening,
the system should wait until enough idle time has gone past, and then it
should actively turn off power to devices that don't need it. That's very
different from running nothing!
> > Userspace support: It's easy to see how userspace could use sysfs to
> > request a single device state change. But what if the user wants to
> > suspend an entire subtree? [ ... ]
>
> If you wanted to get really fancy, you could establish via a
> userspace API a named "device collection" which acts as a virtual device.
> You then apply the state change to the device collection, and the kernel
> percolates it through all the actual devices, taking locking into account.
I suspect that's fancier than we need, although perhaps it would come in
handy in special circumstances. For now, it should be good enough to
restrict such "device collections" to be subtrees of the device tree.
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-01 14:07 ` Alan Stern
@ 2005-08-01 15:10 ` Jordan Crouse
2005-08-01 15:23 ` Alan Stern
2005-08-04 17:24 ` Igor Stoppa
1 sibling, 1 reply; 18+ messages in thread
From: Jordan Crouse @ 2005-08-01 15:10 UTC (permalink / raw)
To: linux-pm
[-- Attachment #1: Type: text/plain, Size: 1536 bytes --]
> > This could potentially make performance-conscious apps "hiccup"
> > once every second as this thread goes walking the list looking for
> > candidates to shut off. Try to avoid this; if nothing is happening, nothing
> > should be running.
>
> I don't understand this comment at all. Lots of things happen
> periodically in the kernel: threads wake up, timers go off... Are you
> suggesting that, for example, the page-flush thread shouldn't wake up
> from time to time either?
While I don't agree that it will be a horrible drain on performance, I do
see a large potential for abuse with a big kernel thread. Things like the
page-flush thread are well known and (hopefully) optimized entities -
the RTPM thread will have to depend on hundreds of driver writers to be kind
to not suck time and resources from the system. About the time that somebody
puts a large udelay into their AC97 driver to turn off the DAC, then I'm sure
we will question our motives in this regard.
That said, I think I tend to favor the big kernel thread, or at least timeout
threads on a bus level. The single entity handling the idle math timeout
would facilitate future issues such as priority in handling idle timeouts
(do we address certain buses/devices before others, for example), plus it
would help centralize the functionality, and make it easier to control with
any future power management policy concepts.
Jordan
--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Re: Toward runtime power management in Linux
2005-08-01 15:10 ` Jordan Crouse
@ 2005-08-01 15:23 ` Alan Stern
0 siblings, 0 replies; 18+ messages in thread
From: Alan Stern @ 2005-08-01 15:23 UTC (permalink / raw)
To: Jordan Crouse; +Cc: linux-pm
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1361 bytes --]
On Mon, 1 Aug 2005, Jordan Crouse wrote:
> While I don't agree that it will be a horrible drain on performance, I do
> see a large potential for abuse with a big kernel thread. Things like the
> page-flush thread are well known and (hopefully) optimized entities -
> the RTPM thread will have to depend on hundreds of driver writers to be kind
> to not suck time and resources from the system. About the time that somebody
> puts a large udelay into their AC97 driver to turn off the DAC, then I'm sure
> we will question our motives in this regard.
Hmmm... A large delay in a suspend pathway will cause problems no matter
how it gets invoked, right? If we have a separate kernel thread for RTPM,
then at least the only things affected will be other RTPM activities.
Whereas if we use keventd instead to provide a process context, lots of
other things would be affected as well.
> That said, I think I tend to favor the big kernel thread, or at least timeout
> threads on a bus level. The single entity handling the idle math timeout
> would facilitate future issues such as priority in handling idle timeouts
> (do we address certain buses/devices before others, for example), plus it
> would help centralize the functionality, and make it easier to control with
> any future power management policy concepts.
Those are good ideas.
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Toward runtime power management in Linux
2005-08-01 14:07 ` Alan Stern
2005-08-01 15:10 ` Jordan Crouse
@ 2005-08-04 17:24 ` Igor Stoppa
1 sibling, 0 replies; 18+ messages in thread
From: Igor Stoppa @ 2005-08-04 17:24 UTC (permalink / raw)
To: ext Alan Stern; +Cc: linux-pm
[-- Attachment #1: Type: text/plain, Size: 2634 bytes --]
On Mon, 2005-08-01 at 10:07 -0400, ext Alan Stern wrote:
[snip]
> Furthermore, there's a trade-off between doing a bunch of chores all at
> once (i.e., have a kernel thread scan a list of devices to see which have
> exceeded their idle timeouts) and distributing those chores piecemeal
> (i.e., have each driver reschedule an idle timer every time one of its
> devices carries out some activity). In the absence of actual measurements
> it's impossible to know which will affect performance more -- and in fact
> the effects are likely to be highly variable, depending on workload.
Especially in embedded systems also the technology used for the silicon
is going to affect the decision, not only the balance between cpu load
and i/o load: according to the energy spent just for having the system
active, the choice might move between "all at once" and "split timewise"
because of the possible cost in terms of ramp-up and ramp-down.
>
> As for your "if nothing is happening, nothing should be running" mantra,
> it runs counter to the very idea of runtime PM. If nothing is happening,
> the system should wait until enough idle time has gone past, and then it
> should actively turn off power to devices that don't need it. That's very
> different from running nothing!
I think that this depends on which is the desired behaviour and how
quickly some specific hw can react to requests for drastic shifts in
power states.
Idling implies trying to avoid a ramp-down & ramp-up sequence because of
an impending activity that will see the sequence as an overhead.
It depends also how much of this on/off switching can be demanded to
dedicated hw and how much must be sw controlled.
>
>
> > > Userspace support: It's easy to see how userspace could use sysfs to
> > > request a single device state change. But what if the user wants to
> > > suspend an entire subtree? [ ... ]
> >
> > If you wanted to get really fancy, you could establish via a
> > userspace API a named "device collection" which acts as a virtual device.
> > You then apply the state change to the device collection, and the kernel
> > percolates it through all the actual devices, taking locking into account.
>
> I suspect that's fancier than we need, although perhaps it would come in
> handy in special circumstances. For now, it should be good enough to
> restrict such "device collections" to be subtrees of the device tree.
>
> Alan Stern
>
> _______________________________________________
> linux-pm mailing list
> linux-pm@lists.osdl.org
> https://lists.osdl.org/mailman/listinfo/linux-pm
Igor Stoppa, Nokia M / Tampere Finland
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <Pine.LNX.4.50.0508011712220.2764-100000@monsoon.he.net>]
* Re: Toward runtime power management in Linux
[not found] ` <Pine.LNX.4.50.0508011712220.2764-100000@monsoon.he.net>
@ 2005-08-02 17:45 ` Geoff Levand
0 siblings, 0 replies; 18+ messages in thread
From: Geoff Levand @ 2005-08-02 17:45 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: text/plain, Size: 2672 bytes --]
Patrick Mochel wrote:
> - Automatic (or Dynamic) Suspend
>
> This is where a device will enter a low power state after a certain
> amount of time has elapsed without any activity.
>
> The amount of time should be configurable on a per-device basis through
> a sysfs interface.
>
> What defines "inactivity" is driver-dependent, and we expect to be
> class-dependent (some classes may define inactivity as the device not
> being opened; others may define it as having no read()/write() calls;
> still others may define it as not having any network packets besides
> ARP requests; you get the idea..) IOW, it doesn't matter to the core.
>
> The device should enter a low-power state that it supports. It doesn't
> matter what state this is, and it's debatable whether or not it should
> be exported/configurable via sysfs. (It's possible that a userspace-
> based policy may wish to adjust this based on its extra knowledge about
> system features/bugs, or based on the desired latency/consumption
> tradeoff for the particular system or configuration (plugged, unplugged,
> etc).
> The device must be powered back on when a new request comes in. Again,
> whether this is on open(), read(), or socket() is up to the class and
> the drivers of that class.
>
> - Directed Suspend
>
> This where a user or an application specifies a device to enter a lower
> power state.
>
> The states that a device exports (allows to be set) should be exported.
> The application should specify which state to enter.
>
> By default, the device may not respond to I/O requests. There must be a
> flag exported to control this.
>
> - Performance
>
> (This was not covered in detail, but based on the specified interface
> above, it's pretty easy.)
>
> The states a device (and its driver) support should be exported via
> sysfs.
>
> A user or application specifies which state to enter.
>
> This may turn on/off different functional components of the device. The
> drivers need to be prepared to handle that.
>
As you hint on, there is a question of the interface between a policy
manager and the devices. Many embedded devices need to aggressively manage
power, so need to have an interface that allows device specific monitoring
and control, yet for an average system a more generic policy manager included
in a vendor's distribution could provide usable PM on a range of systems
through a generic interface.
So a question is how to support this. I suppose the PM system could allow
both system specific interfaces and a 'generic standard' interface to be
exported, with some mapping between.
-Geoff
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Toward runtime power management in Linux
2005-07-31 2:36 Toward runtime power management in Linux Alan Stern
2005-08-01 2:10 ` Leo L. Schwab
[not found] ` <Pine.LNX.4.50.0508011712220.2764-100000@monsoon.he.net>
@ 2005-08-25 3:12 ` Benjamin Herrenschmidt
2005-08-25 15:27 ` Alan Stern
2 siblings, 1 reply; 18+ messages in thread
From: Benjamin Herrenschmidt @ 2005-08-25 3:12 UTC (permalink / raw)
To: Alan Stern; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: text/plain, Size: 2245 bytes --]
> RTPM core: The scheme described above doesn't necessarily involve the
> PM core. The notifications can be simple subroutine calls, perhaps
> with support from the bus subsystem. It's not obvious how much core
> support we will need for RTPM, apart from the sysfs interface.
>
> Recursion: A consequence of doing things this way is that the
> notifications can potentially use a lot of stack space as they
> progress up the device tree. (I can't think of any simple
> non-recursive technique for implementing the scheme.) Fortunately
> this probably won't be too bad; the notifications will stop when they
> reach a device that doesn't want to change its state (because it has
> other children). So the recursion should not involve too many levels.
> Still, it is something to watch out for.
I think the locking is unmanageable if we do synchronous notification. I
think devices should issue a "request for link state change" and be
asynchronously notified of the actual change, though they might be
allowed to block if they are doing that from process and/or probe()
context (most of the time). I think the actual tree walking should be
done by a separate thread. That simplifies locking tremendously by
suppressing most deadlock conditions.
Another problem is the whole racyness of tree & list walking vs.
add/remove. We try to work around it in various ways that I think can't
work. See the small thread about pci_walk_bus() on lkml that exposes
that kind of races vs. device removal. I think we really need to
indroduce proper iterator objects that get notified on removal.
Racing with device addition is a different issue altogether. It means we
may add devices to already-walked part of the tree, thus have
inconsistent states... unless drivers are made properly aware that the
link state may not be full-on at probe time and deal with that.
> Context: A relatively recent change to the driver model core added a
> semaphore to struct device, and we will want to hold this semaphore
> while making state changes. This immediately implies that RTPM needs
> a process context to run in. Should we have a kernel thread or work
> queue specially devoted to RTPM activities (idle autosuspend and so
> forth)?
Might help.
Ben.
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-25 3:12 ` Benjamin Herrenschmidt
@ 2005-08-25 15:27 ` Alan Stern
2005-08-25 21:42 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 18+ messages in thread
From: Alan Stern @ 2005-08-25 15:27 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Brown, Len; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: TEXT/PLAIN, Size: 3537 bytes --]
On Thu, 25 Aug 2005, Benjamin Herrenschmidt wrote:
> > Recursion: A consequence of doing things this way is that the
> > notifications can potentially use a lot of stack space as they
> > progress up the device tree. (I can't think of any simple
> > non-recursive technique for implementing the scheme.) Fortunately
> > this probably won't be too bad; the notifications will stop when they
> > reach a device that doesn't want to change its state (because it has
> > other children). So the recursion should not involve too many levels.
> > Still, it is something to watch out for.
>
> I think the locking is unmanageable if we do synchronous notification. I
> think devices should issue a "request for link state change" and be
> asynchronously notified of the actual change, though they might be
> allowed to block if they are doing that from process and/or probe()
> context (most of the time). I think the actual tree walking should be
> done by a separate thread. That simplifies locking tremendously by
> suppressing most deadlock conditions.
But it complicates the structure of drivers by forcing them to use a
state-machine approach with a bunch of tedious intermediate states ("link
change request issued, waiting for notification"). It also introduces
complications from the possible arrival of several change requests or
notifications at once, since there's no locking to guarantee mutual
exclusion among them.
> Another problem is the whole racyness of tree & list walking vs.
> add/remove. We try to work around it in various ways that I think can't
> work. See the small thread about pci_walk_bus() on lkml that exposes
> that kind of races vs. device removal. I think we really need to
> indroduce proper iterator objects that get notified on removal.
>
> Racing with device addition is a different issue altogether. It means we
> may add devices to already-walked part of the tree, thus have
> inconsistent states... unless drivers are made properly aware that the
> link state may not be full-on at probe time and deal with that.
I think these races can be handled without too much trouble. Consider the
two cases you mentioned.
Device addition racing with parent suspend: adding a device to
an already-suspended parent. The parent's driver should be
written in such a way that it hold's the parent's PM lock
while determining that a new child has been found. If the parent
is capable of detecting a new child while suspended, then it
should also be capable of adding the child device. If it's not
capable of detecting new children while suspended then the issue
doesn't arise.
Device removal racing with power state changes. During device
removal the PM lock should be held; this will prevent the two
operations from overlapping. You might end up trying to carry
out a power-state change on an already-removed device; that's
not a problem -- it will simply fail.
On Thu, 25 Aug 2005, Brown, Len wrote:
> >I think the locking is unmanageable if we do synchronous
> >notification.
>
> Hmmm, good point.
> But how frequent do we expect walks and add/remove to be?
> If they almost never happen then it sounds like over-design
> to have more than a single lock.
RTPM changes won't be terribly frequent. But add/remove, while maybe not
very frequent in an average sense, do occur in clusters. The lock you're
proposing would end up being a single chokepoint for all devices. That's
exactly the sort of thing removal of the bus subsystem's rwsem was
intended to eliminate.
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-25 15:27 ` Alan Stern
@ 2005-08-25 21:42 ` Benjamin Herrenschmidt
2005-08-26 2:25 ` Alan Stern
0 siblings, 1 reply; 18+ messages in thread
From: Benjamin Herrenschmidt @ 2005-08-25 21:42 UTC (permalink / raw)
To: Alan Stern; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: text/plain, Size: 1322 bytes --]
On Thu, 2005-08-25 at 11:27 -0400, Alan Stern wrote:
> But it complicates the structure of drivers by forcing them to use a
> state-machine approach with a bunch of tedious intermediate states ("link
> change request issued, waiting for notification").
Not necessarily. The driver could do synchronous blocking wait if it's
not running inside the context of the iterator thread which won't be the
case most of the time.
> It also introduces
> complications from the possible arrival of several change requests or
> notifications at once, since there's no locking to guarantee mutual
> exclusion among them.
Who else but the driver is allowed to request a link state change on the
device ? That specific race can be dealt with or considered as a
programming error.
> Device removal racing with power state changes. During device
> removal the PM lock should be held; this will prevent the two
> operations from overlapping. You might end up trying to carry
> out a power-state change on an already-removed device; that's
> not a problem -- it will simply fail.
Those locks are a wonderful deadlock scenario as soon as the driver end
up triggering add/remove events while they are held and that does
happen. I'm really not fan of those global and/or cascaded locks, I find
the approach very deadlock prone.
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: Toward runtime power management in Linux
2005-08-25 21:42 ` Benjamin Herrenschmidt
@ 2005-08-26 2:25 ` Alan Stern
0 siblings, 0 replies; 18+ messages in thread
From: Alan Stern @ 2005-08-26 2:25 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: TEXT/PLAIN, Size: 3057 bytes --]
On Fri, 26 Aug 2005, Benjamin Herrenschmidt wrote:
> On Thu, 2005-08-25 at 11:27 -0400, Alan Stern wrote:
>
> > But it complicates the structure of drivers by forcing them to use a
> > state-machine approach with a bunch of tedious intermediate states ("link
> > change request issued, waiting for notification").
>
> Not necessarily. The driver could do synchronous blocking wait if it's
> not running inside the context of the iterator thread which won't be the
> case most of the time.
I was talking specifically about the part of the driver that _does_ run in
the context of the iterator thread. Your plan makes that part more
complex than it would be otherwise.
> > It also introduces
> > complications from the possible arrival of several change requests or
> > notifications at once, since there's no locking to guarantee mutual
> > exclusion among them.
>
> Who else but the driver is allowed to request a link state change on the
> device ?
A driver for a child device is allowed to. (I.e., it's allowed to request
a state change on a downward-going link.) And in addition to the
link-state changes, the user (through sysfs) is allowed to request a
power-state change.
> That specific race can be dealt with or considered as a
> programming error.
Not at all. I can easily imagine a situation where two child devices try
to send link-change notifications to their common parent at the same time,
or where two user processes try to initiate a power change simultaneously.
The proper way to handle such things is by mutual exclusion -- locking.
> > Device removal racing with power state changes. During device
> > removal the PM lock should be held; this will prevent the two
> > operations from overlapping. You might end up trying to carry
> > out a power-state change on an already-removed device; that's
> > not a problem -- it will simply fail.
>
> Those locks are a wonderful deadlock scenario as soon as the driver end
> up triggering add/remove events while they are held and that does
> happen. I'm really not fan of those global and/or cascaded locks, I find
> the approach very deadlock prone.
There's no question that these locks are easy to misuse. With care I
believe it can be done correctly. As for the power-change code triggering
add/remove events -- that's a problem we will have to deal with no matter
what. Avoiding locks won't make it any easier to solve the problem
correctly, although it may make the consequences of an incorrect
solution less obvious!
Ultimately we may be forced to handle these add/remove events in a
different thread from the one doing the power changes. For instance, say
a child tells its parent that it wants to wake up. The parent is also
suspended, so the parent has to resume before returning to the child.
During the resume, the parent detects that some other children have gone
away, or new ones have appeared. I don't think there's any way to handle
these events in the power-change thread. Any scheme for doing so will be
subject to races.
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <Pine.LNX.4.50.0508012316380.2764-100000@monsoon.he.net>]
* Re: Toward runtime power management in Linux
[not found] <Pine.LNX.4.50.0508012316380.2764-100000@monsoon.he.net>
@ 2005-08-02 14:35 ` Alan Stern
0 siblings, 0 replies; 18+ messages in thread
From: Alan Stern @ 2005-08-02 14:35 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linux-pm mailing list
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2647 bytes --]
On Mon, 1 Aug 2005, Patrick Mochel wrote:
> > I agree that a parent may have to cope with situations where two children
> > are trying to change state at the same time. struct device->semaphore
> > should help there. This doesn't affect what I wrote, however. Link-state
> > changes don't involve races, because a link state describes the
> > connection between one specific parent and one specific child. If two
> > different links change state at the same time, that's not a race.
>
> For two children changing state at the same time, it is not a race. But,
> there could be potentially racy conditions when notifying the parent.
> Maybe. As I think about it more, I'm not sure it's possible to get mixed
> up, since there should always be _some_ delay between a parent receiving a
> notification that a child has suspended and the parent actually suspending
> itself.
This is why we want the driver to lock the parent before notifying it.
And since the driver will already be holding the child's lock, this is a
case where we need to acquire locks in the wrong order (going up the
tree).
> > Me neither. In fact, I would go so far as to say that this is the main
> > impediment to RTPM implementations at the moment. If I knew the answer to
> > the locking-order problem, I could fix up the USB RTPM code right now.
>
> What exactly is the impediment? The locking constraints?
Yes. In a separate message you worried about what happens when there are
multiple parents. I don't see that being a problem here, because for
power-state notifications we will only need to lock one parent at a time:
the one currently being notified.
Right now I'm leaning toward a solution that explicitly allows acquiring
locks in either order (up or down), with the proviso that a process trying
to lock upward will lose if another process is trying to lock the same
devices downward. That is, if A > B, P1 has locked A, P2 has locked B,
and P2 is trying to lock A while P1 is trying to lock B, then P2's locking
attempt will fail rather than block. That should be sufficient to avoid
deadlock.
I think this is the sort of behavior we want to see. Lock acquisition
going down the tree tends to be for more important reasons, like unbinding
drivers and unregistering devices. Lock acquisition going up tends to be
for less important things (like RTPM) which will usually be made
irrelevant by the downward-going process anyhow. After all, there's no
point having a thread trying to change a power state block another thread
that wants to unregister the device!
Now I just need to come up with a clean way to implement it...
Alan Stern
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: Toward runtime power management in Linux
@ 2005-08-25 13:59 Brown, Len
0 siblings, 0 replies; 18+ messages in thread
From: Brown, Len @ 2005-08-25 13:59 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Alan Stern; +Cc: Linux-pm mailing list
>I think the locking is unmanageable if we do synchronous
>notification.
Hmmm, good point.
But how frequent do we expect walks and add/remove to be?
If they almost never happen then it sounds like over-design
to have more than a single lock.
-Len
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2005-08-26 2:25 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-07-31 2:36 Toward runtime power management in Linux Alan Stern
2005-08-01 2:10 ` Leo L. Schwab
2005-08-01 11:44 ` Amit Kucheria
2005-08-01 14:16 ` Alan Stern
[not found] ` <20050802024415.C3518DB57B@adsl-69-107-32-110.dsl.pltn13.pacbell.net>
2005-08-04 8:06 ` Tony Lindgren
2005-08-04 16:02 ` david-b
2005-08-14 19:53 ` Pavel Machek
2005-08-01 14:07 ` Alan Stern
2005-08-01 15:10 ` Jordan Crouse
2005-08-01 15:23 ` Alan Stern
2005-08-04 17:24 ` Igor Stoppa
[not found] ` <Pine.LNX.4.50.0508011712220.2764-100000@monsoon.he.net>
2005-08-02 17:45 ` Geoff Levand
2005-08-25 3:12 ` Benjamin Herrenschmidt
2005-08-25 15:27 ` Alan Stern
2005-08-25 21:42 ` Benjamin Herrenschmidt
2005-08-26 2:25 ` Alan Stern
[not found] <Pine.LNX.4.50.0508012316380.2764-100000@monsoon.he.net>
2005-08-02 14:35 ` Alan Stern
-- strict thread matches above, loose matches on Subject: below --
2005-08-25 13:59 Brown, Len
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox