An issue with powerd..

Ian Smith smithi at nimnet.asn.au
Thu Dec 27 18:57:29 PST 2007


On Thu, 27 Dec 2007, John Baldwin wrote:
 > So I've had some issues where I get weird hangs when I run with powerd enabled 
 > on my laptop and I think I've finally tracked it down.  Note that this is on 
 > an older current with the older EC code, but the design flaw in powerd is 
 > still relevant even if the new EC code makes my laptop happier (I'm trying to 
 > update my laptop to more recent HEAD, but there's some weird scheduling bug 
 > that I haven't fixed yet in newer stuff).
 > 
 > Anyways, I was trying to debug the weird hangs I had when running with powerd 
 > (machine would go unresponsive and fans would spin up, and after a variable 
 > number of seconds it would come back and all the pending input (mouse 
 > movements, keypresses, etc.) would be processed).  I added some code to track 
 > how long it takes for GPE's to run that would print out on the console if one 
 > took more than 750ms as I had a feeling that something with ACPI was making 
 > the system busy.

Fans spinning up is perhaps interesting?  As noted in my recent whinge
about lack of component documentation, I've yet to suss out interactions
between acpi_thermal (wrt both fans and passive cooling itself modifying
cpu freqs - could this fight with powerd?), devd and other subsystems. 

Yeah I'm slowly beating through the ACPI spec, up to page 46 of >600
pages, but it's reminiscent of reading govt legislation .. I'd love to
find the ~50 page precis, then I may be better able to follow some code. 

 > It was also far worse in console mode than in X.  In console mode I found that 
 > sometimes the system would never "come back".

Presumably X itself keeps it busy enough to keep cpu freq 'reasonable'?
I use gkrellm to keep an eye on cpu freq, temp, load avg .. but my T23
is only a two-speed, min 733MHZ, so I can't see what you're seeing (and
that's my faster laptop :)

 > So I was running in console mode recently with my timing patches and noticed 
 > that when it hung it started warning about GPE events taking several 
 > _seconds_ to process, e.g. 2-3 seconds, or in some cases up to _30_ seconds.  
 > So, my theory is that powerd has lowered my CPU all the way down to 100mhz 
 > (easy to reproduce in non-X, just let the box sit with no apps running) and 
 > that for some reason the machine ends up in a "GPE storm" where it is 
 > spending all its time handling GPE's and never has any CPU left for userland 
 > apps (due to being at 100mhz).  The problem then is that powerd never runs to 
 > bump my CPU up to some reasonable speed.

One workaround some have noted using is to set debug.cpufreq.lowest to
some value considerably higher than 100MHz, say >500MHz to maintain
reasonable responsiveness, at a cost of higher power use when idle.

 > In fact, anytime a completely idle box suddently gets a lot of kernel work 
 > (e.g. a sudden flow of packets) it could in theory end up trying to handle 
 > all this work at the reduced speed since the work has a higher priority than 
 > the powerd process.  To that end, I think that at least part of powerd needs 
 > to be in the kernel, or at least that the kernel should be more proactive 
 > about bumping the speed up when it resumes from Cx due to an interrupt.  A 
 > simple policy would be to bump up to full speed for any non-clock interrupt 
 > (possibly bumping up for a clock interrupt if we wake up softclock as well).
 > 
 > Thoughts?

Just humble grasshopper droppings, master .. but the default powerd
polling interval is 500ms, which is a really long time on a fast box, so
-p 100 or even less might make a considerable difference?

Can't comment on any in-kernel component, but responding per any sort of
single interrupt/s sounds way too triggerhappy compared to monitoring
load, assuming that such as vm.loadavg and kern.cp_time are themselves
updated promptly in high-stress times?

AU$0.02, which rounds down to 0 since we abandoned coins less than 5c ..

cheers, Ian



More information about the freebsd-acpi mailing list