Sorry for the delay, I was off before New Year and then could not test it ... On óÂÔ, 2001-12-22 at 17:44, Andreas Steinmetz wrote: > Hi, > I merged 2., 3. and 4. (attached) with some modifications. > > 1. There is now a module parameter apm-idle-threshold which allows to override > the compiled in idle percentage threshold above which BIOS idle calls are > done. > > 2. I modified Andrej's mechanism to detect a defunct BIOS (stating 'does stop > CPU' when it actually doesn't) to take into account that there's other > interrupts than the timer interrupt that could reactivate the cpu. > As there's 16 hardware interrupts on x86 (apm is arch specific anyway) I do > use a leaky bucket counter for a maximum of 16 idle rounds until jiffies is > increased. When the counter reaches zero it stays at this value and the > system idle routine is called. If BIOS idle is a noop then the counter > reaches zero fast, thus effectively halting the cpu. > I do not think you need it. Either interrupt waked up somebody and set need_resched and we exit loop or nobody is ready to run and we can sleep again. Why complicate things any more than needed? > Andrej, could you please test the patch if it works for your laptop? > It does not work and I am very surprised it works for somebody (well, there are conditios when it will work). By default pm_idle is always NULL so we *never* actually call kernel function that really stops CPU. Main idle task is cpu_idle that does if (pm_idle) pm_idle() or default_idle and CPU is halted in default_idle. So your patch just enters busy loop calling BIOS APM Idle over and over again just like it was before. Attached patch makes apm_cpu_idle do the same and call either old pm_idle (a.k.a. sys_idle) or default_idle. I removed your interrupt handling - it does not actually affect the problem but it still is not needed IMHO. t1, t2 are changed from int into long because jiffies is long - not sure if it is really needed. cheers and sorry for delay -andrej