From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:25:38
Hi,
This patchset introduces cpuidle infrastructure to POWER, prototyping
for pSeries, and also does a major refactoring of current x86 idle
power management and a cleanup of cpuidle infrastructure.
My earlier iterations can be found at:
v5 --> http://lkml.org/lkml/2009/9/22/26
v4 --> http://lkml.org/lkml/2009/9/1/133
v3 --> http://lkml.org/lkml/2009/8/27/124
v2 --> http://lkml.org/lkml/2009/8/26/233
v1 --> http://lkml.org/lkml/2009/8/19/150
Changes in this version:
------------------------------------------
Remove the bug from previous iteration in the routine
cpuidle_remove_from_list(), which was causing the kernel to panic on
platform supporting multiple sleep states.
Add the routine cpuidle_kick_cpus() in POWER, which is needed to kick
the cpus out of their idle when changing the idle routines.
TODO:
-------------------------------------------
Peterz suggested it would be nice to have a sysfs interface through
which an idle routine can be forced at runtime.
Also, current implementation registers every cpu as a cpuidle_device,
but this is an overkill and the registering mechanism should be a
systemwide process and not per-cpu. (probably one of the original
cpuidle authors can reply to this - Venki, Shaohua Li? ).
ppc_md.power_save has been replaced by cpuidle_idle_call only for
pseries. So this needs to be done for all POWER platforms so that
ppc_md.power_save is completely removed.
Any comments on the design is welcome.
--arun
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:27:25
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
This patch cleans up drivers/cpuidle/cpuidle.c
Earlier cpuidle assumed pm_idle as the default idle loop. Break that
assumption and make it more generic. cpuidle_idle_call() which is the
main idle loop of cpuidle is to be called by architectures which have
registered to cpuidle.
Remove routines cpuidle_install/uninstall_idle_handler() and
cpuidle_kick_cpus() which are not needed anymore.
Signed-off-by: Arun R Bharadwaj <redacted>
---
drivers/cpuidle/cpuidle.c | 48 +++++++--------------------------------------
drivers/cpuidle/cpuidle.h | 1
drivers/cpuidle/governor.c | 3 --
include/linux/cpuidle.h | 3 ++
4 files changed, 11 insertions(+), 44 deletions(-)
Index: linux.trees.git/drivers/cpuidle/cpuidle.c
===================================================================
@@ -46,7 +43,7 @@ static int __cpuidle_register_device(str**NOTE:nolocksorsemaphoresshouldbeusedhere*/-staticvoidcpuidle_idle_call(void)+voidcpuidle_idle_call(void){structcpuidle_device*dev=__get_cpu_var(cpuidle_devices);structcpuidle_state*target_state;
@@ -54,13 +51,10 @@ static void cpuidle_idle_call(void)/* check if the device is ready */if(!dev||!dev->enabled){-if(pm_idle_old)-pm_idle_old();-else#if defined(CONFIG_ARCH_HAS_DEFAULT_IDLE)-default_idle();+default_idle();#else-local_irq_enable();+local_irq_enable();#endifreturn;}
@@ -74,7 +68,11 @@ static void cpuidle_idle_call(void)hrtimer_peek_ahead_timers();#endif/* ask the governor for the next state */-next_state=cpuidle_curr_governor->select(dev);+if(dev->state_count>1)+next_state=cpuidle_curr_governor->select(dev);+else+next_state=0;+if(need_resched())return;target_state=&dev->states[next_state];
@@ -94,35 +92,11 @@ static void cpuidle_idle_call(void)}/**-*cpuidle_install_idle_handler-installsthecpuidleidleloophandler-*/-voidcpuidle_install_idle_handler(void)-{-if(enabled_devices&&(pm_idle!=cpuidle_idle_call)){-/* Make sure all changes finished before we switch to new idle */-smp_wmb();-pm_idle=cpuidle_idle_call;-}-}--/**-*cpuidle_uninstall_idle_handler-uninstallsthecpuidleidleloophandler-*/-voidcpuidle_uninstall_idle_handler(void)-{-if(enabled_devices&&pm_idle_old&&(pm_idle!=pm_idle_old)){-pm_idle=pm_idle_old;-cpuidle_kick_cpus();-}-}--/***cpuidle_pause_and_lock-temporarilydisablesCPUIDLE*/voidcpuidle_pause_and_lock(void){mutex_lock(&cpuidle_lock);-cpuidle_uninstall_idle_handler();}EXPORT_SYMBOL_GPL(cpuidle_pause_and_lock);
@@ -48,8 +48,6 @@ int cpuidle_switch_governor(struct cpuidif(gov==cpuidle_curr_governor)return0;-cpuidle_uninstall_idle_handler();-if(cpuidle_curr_governor){list_for_each_entry(dev,&cpuidle_detected_devices,device_list)cpuidle_disable_device(dev);
@@ -63,7 +61,6 @@ int cpuidle_switch_governor(struct cpuidreturn-EINVAL;list_for_each_entry(dev,&cpuidle_detected_devices,device_list)cpuidle_enable_device(dev);-cpuidle_install_idle_handler();printk(KERN_INFO"cpuidle: using governor %s\n",gov->name);}
@@ -9,7 +9,6 @@/* For internal use only */externstructcpuidle_governor*cpuidle_curr_governor;-externstructcpuidle_driver*cpuidle_curr_driver;externstructlist_headcpuidle_governors;externstructlist_headcpuidle_detected_devices;externstructmutexcpuidle_lock;
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:28:26
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Implement a list based registering mechanism for architectures which
have multiple sets of idle routines which are to be registered.
Currently, in x86 it is done by merely setting pm_idle = idle_routine
and managing this pm_idle pointer is messy.
To give an example of how this mechanism works:
In x86, initially, idle routine is selected from the set of poll/mwait/
c1e/default idle loops. So the selected idle loop is registered in cpuidle
as one idle state cpuidle devices. Once ACPI comes up, it registers
another set of idle states on top of this state. Again, suppose a module
registers another set of idle loops, it is added to this list.
This provides a clean way of registering and unregistering idle state
routines.
In the current implementation, pm_idle is set as the current idle routine
being used and the old idle routine has to be maintained and when a module
registers/unregisters an idle routine, confusion arises.
Signed-off-by: Arun R Bharadwaj <redacted>
---
drivers/cpuidle/cpuidle.c | 51 ++++++++++++++++++++++++++++++++++++++++++----
include/linux/cpuidle.h | 1
2 files changed, 48 insertions(+), 4 deletions(-)
Index: linux.trees.git/drivers/cpuidle/cpuidle.c
===================================================================
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:29:40
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
This patch cleans up x86 of all instances of pm_idle.
pm_idle which was earlier called from cpu_idle() idle loop
is replaced by cpuidle_idle_call.
x86 also registers to cpuidle when the idle routine is selected,
by populating the cpuidle_device data structure for each cpu.
This is replicated for apm module and for xen, which also used pm_idle.
Signed-off-by: Arun R Bharadwaj <redacted>
---
arch/x86/kernel/apm_32.c | 37 +++++++++++++++++++++--
arch/x86/kernel/process.c | 69 ++++++++++++++++++++++++++++++++++---------
arch/x86/kernel/process_32.c | 3 +
arch/x86/kernel/process_64.c | 3 +
arch/x86/xen/setup.c | 22 +++++++++++++
5 files changed, 114 insertions(+), 20 deletions(-)
Index: linux.trees.git/arch/x86/kernel/process.c
===================================================================
@@ -247,12 +249,6 @@ int sys_vfork(struct pt_regs *regs)unsignedlongboot_option_idle_override=0;EXPORT_SYMBOL(boot_option_idle_override);-/*-*Powermanagementidlefunction,ifany..-*/-void(*pm_idle)(void);-EXPORT_SYMBOL(pm_idle);-#ifdef CONFIG_X86_32/**ThishaltmagicwasaworkaroundforancientfloppyDMA
@@ -531,15 +527,58 @@ static void c1e_idle(void)default_idle();}+staticvoid(*local_idle)(void);+DEFINE_PER_CPU(structcpuidle_device,idle_devices);++structcpuidle_drivercpuidle_default_driver={+.name="cpuidle_default",+};++staticintlocal_idle_loop(structcpuidle_device*dev,structcpuidle_state*st)+{+ktime_tt1,t2;+s64diff;+intret;++t1=ktime_get();+local_idle();+t2=ktime_get();++diff=ktime_to_us(ktime_sub(t2,t1));+if(diff>INT_MAX)+diff=INT_MAX;+ret=(int)diff;++returnret;+}+staticint__cpuinitsetup_cpuidle_simple(void)+{+structcpuidle_device*dev;+intcpu;++if(!cpuidle_curr_driver)+cpuidle_register_driver(&cpuidle_default_driver);++for_each_online_cpu(cpu){+dev=&per_cpu(idle_devices,cpu);+dev->cpu=cpu;+dev->states[0].enter=local_idle_loop;+dev->state_count=1;+cpuidle_register_device(dev);+}+return0;+}+late_initcall(setup_cpuidle_simple);+void__cpuinitselect_idle_routine(conststructcpuinfo_x86*c){#ifdef CONFIG_SMP-if(pm_idle==poll_idle&&smp_num_siblings>1){+if(local_idle==poll_idle&&smp_num_siblings>1){printk(KERN_WARNING"WARNING: polling idle and HT enabled,"" performance may degrade.\n");}#endif-if(pm_idle)+if(local_idle)return;if(cpu_has(c,X86_FEATURE_MWAIT)&&mwait_usable(c)){
@@ -547,18 +586,20 @@ void __cpuinit select_idle_routine(const*OneCPUsupportsmwait=>AllCPUssupportsmwait*/printk(KERN_INFO"using mwait in idle threads.\n");-pm_idle=mwait_idle;+local_idle=mwait_idle;}elseif(check_c1e_idle(c)){printk(KERN_INFO"using C1E aware idle routine\n");-pm_idle=c1e_idle;+local_idle=c1e_idle;}else-pm_idle=default_idle;+local_idle=default_idle;++return;}void__initinit_c1e_mask(void){/* If we're using c1e_idle, we need to allocate c1e_mask. */-if(pm_idle==c1e_idle){+if(local_idle==c1e_idle){alloc_cpumask_var(&c1e_mask,GFP_KERNEL);cpumask_clear(c1e_mask);}
@@ -142,7 +143,7 @@ void cpu_idle(void)enter_idle();/* Don't trace irqs off for idle */stop_critical_timings();-pm_idle();+cpuidle_idle_call();start_critical_timings();/* In many cases the interrupt that ended idlehasalreadycalledexit_idle.Butsomeidle
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:30:43
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
This patch enables the cpuidle option in Kconfig for pSeries.
Currently cpuidle infrastructure is enabled only for x86 and ARM.
This code is almost completely borrowed from x86 to enable
cpuidle for pSeries.
Signed-off-by: Arun R Bharadwaj <redacted>
---
arch/powerpc/Kconfig | 17 +++++++++++++++++
arch/powerpc/include/asm/system.h | 2 ++
arch/powerpc/kernel/idle.c | 19 +++++++++++++++++++
3 files changed, 38 insertions(+)
Index: linux.trees.git/arch/powerpc/Kconfig
===================================================================
@@ -243,6 +246,20 @@ source "kernel/Kconfig.freezer"source"arch/powerpc/sysdev/Kconfig"source"arch/powerpc/platforms/Kconfig"+menu"Power management options"++source"drivers/cpuidle/Kconfig"++configPSERIES_PROCESSOR_IDLE+bool"Idle Power Management Support for pSeries"+depends onPPC_PSERIES&&CPU_IDLE+defaulty+help+IdlePowerManagementSupportforpSeries.Thishooksontocpuidle+infrastructuretohelpinidlecpupowermanagement.++endmenu+menu"Kernel options"configHIGHMEM
@@ -102,6 +102,25 @@ void cpu_idle(void)}}+staticvoiddo_nothing(void*unused)+{+}++/*+*cpu_idle_wait-UsedtoensurethatalltheCPUscomeoutoftheold+*idleloopandstartusingthenewidleloop.+*RequiredwhilechangingidlehandleronSMPsystems.+*Callermusthavechangedidlehandlertothenewvaluebeforethecall.+*/+voidcpu_idle_wait(void)+{+/* Ensure that new value of ppc_md.power_save is set */+smp_mb();+/* kick all the CPUs so that they exit out of ppc_md.power_save */+smp_call_function(do_nothing,NULL,1);+}+EXPORT_SYMBOL_GPL(cpu_idle_wait);+intpowersave_nap;#ifdef CONFIG_SYSCTL
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:31:53
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
This patch removes the routines, pseries_shared_idle_sleep and
pseries_dedicated_idle_sleep, since this is implemented as a part
of arch/powerpc/platform/pseries/processor_idle.c
Also, similar to x86, call cpuidle_idle_call from cpu_idle() idle
loop instead of ppc_md.power_save.
Signed-off-by: Arun R Bharadwaj <redacted>
---
arch/powerpc/kernel/idle.c | 50 +++++++-----------
arch/powerpc/platforms/pseries/setup.c | 89 ---------------------------------
2 files changed, 22 insertions(+), 117 deletions(-)
Index: linux.trees.git/arch/powerpc/platforms/pseries/setup.c
===================================================================
@@ -75,9 +75,6 @@ EXPORT_SYMBOL(CMO_PageSize);intfwnmi_active;/* TRUE if an FWNMI handler is present */-staticvoidpseries_shared_idle_sleep(void);-staticvoidpseries_dedicated_idle_sleep(void);-staticstructdevice_node*pSeries_mpic_node;staticvoidpSeries_show_cpuinfo(structseq_file*m)
@@ -60,35 +61,26 @@ void cpu_idle(void)while(!need_resched()&&!cpu_should_die()){ppc64_runlatch_off();-if(ppc_md.power_save){-clear_thread_flag(TIF_POLLING_NRFLAG);-/*-*smp_mbissoclearingofTIF_POLLING_NRFLAG-*isorderedw.r.t.need_resched()test.-*/-smp_mb();-local_irq_disable();--/* Don't trace irqs off for idle */-stop_critical_timings();--/* check again after disabling irqs */-if(!need_resched()&&!cpu_should_die())-ppc_md.power_save();--start_critical_timings();--local_irq_enable();-set_thread_flag(TIF_POLLING_NRFLAG);--}else{-/*-*Gointolowthreadpriorityandpossibly-*lowpowermode.-*/-HMT_low();-HMT_very_low();-}+clear_thread_flag(TIF_POLLING_NRFLAG);+/*+*smp_mbissoclearingofTIF_POLLING_NRFLAG+*isorderedw.r.t.need_resched()test.+*/+smp_mb();+local_irq_disable();++/* Don't trace irqs off for idle */+stop_critical_timings();++/* check again after disabling irqs */+if(!need_resched()&&!cpu_should_die())+cpuidle_idle_call();++start_critical_timings();++local_irq_enable();+set_thread_flag(TIF_POLLING_NRFLAG);+}HMT_medium();
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:32:56
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
In arch/powerpc/kernel/idle.c create a default_idle() routine by moving
the failover condition of the cpu_idle() idle loop. This is needed by
cpuidle infrastructure to call default_idle when other idle routines
are not yet registered. Functionality remains the same, but the code is
slightly moved around.
Signed-off-by: Arun R Bharadwaj <redacted>
---
arch/powerpc/Kconfig | 3 +++
arch/powerpc/include/asm/system.h | 1 +
arch/powerpc/kernel/idle.c | 6 ++++++
3 files changed, 10 insertions(+)
Index: linux.trees.git/arch/powerpc/Kconfig
===================================================================
@@ -218,6 +218,7 @@ extern unsigned long klimit;externvoid*alloc_maybe_bootmem(size_tsize,gfp_tmask);externvoid*zalloc_maybe_bootmem(size_tsize,gfp_tmask);+externvoiddefault_idle(void);externintpowersave_nap;/* set if nap mode can be used in idle loop *//*
From: Arun R Bharadwaj <hidden> Date: 2009-09-22 11:33:47
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
This patch creates arch/powerpc/platforms/pseries/processor_idle.c,
which implements the cpuidle infrastructure for pseries.
It implements a pseries_cpuidle_loop() which would be the main idle loop
called from cpu_idle(). It makes decision of entering either cede1 or cede2
for dedicated lpar and shared_cede for shared lpar processor based on the
decision taken by the cpuidle governor.
Signed-off-by: Arun R Bharadwaj <redacted>
---
arch/powerpc/platforms/pseries/Makefile | 1
arch/powerpc/platforms/pseries/processor_idle.c | 191 ++++++++++++++++++++++++
arch/powerpc/platforms/pseries/pseries.h | 9 +
arch/powerpc/platforms/pseries/setup.c | 8 -
4 files changed, 207 insertions(+), 2 deletions(-)
Index: linux.trees.git/arch/powerpc/platforms/pseries/Makefile
===================================================================
From: Arun R Bharadwaj <hidden> Date: 2009-09-24 05:13:06
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the current
implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle as
a cpuidle_device. So every cpu has to go through the process of
setting up the idle states and then registering as a cpuidle device.
What exactly is the reason behind this?
Is this really necessary or can we have a system-wide one-time registering
to cpuidle by ACPI?
I'm currently in the process of enabling cpuidle for POWER systems and
find that having a system-wide registering mechanism to be a cleaner
design.
--arun
From: Arjan van de Ven <hidden> Date: 2009-09-24 12:25:50
On Thu, 24 Sep 2009 10:42:41 +0530
Arun R Bharadwaj [off-list ref] wrote:
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the current
implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle as
a cpuidle_device. So every cpu has to go through the process of
setting up the idle states and then registering as a cpuidle device.
What exactly is the reason behind this?
technically a BIOS can opt to give you C states via ACPI on some cpus,
but not on others.
in practice when this happens it tends to be a bug.. but it's
technically a valid configuration
--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
* Arjan van de Ven [off-list ref] [2009-09-24 14:22:28]:
On Thu, 24 Sep 2009 10:42:41 +0530
Arun R Bharadwaj [off-list ref] wrote:
quoted
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the current
implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle as
a cpuidle_device. So every cpu has to go through the process of
setting up the idle states and then registering as a cpuidle device.
What exactly is the reason behind this?
technically a BIOS can opt to give you C states via ACPI on some cpus,
but not on others.
in practice when this happens it tends to be a bug.. but it's
technically a valid configuration
So we will need to keep the per-cpu registration as of now because we
may have such buggy BIOS in the field and we don't want the cpuidle
framework to malfunction there.
--Vaidy
On Thu, Sep 24, 2009 at 5:52 PM, Arjan van de Ven [off-list ref] wrote:
On Thu, 24 Sep 2009 10:42:41 +0530
Arun R Bharadwaj [off-list ref] wrote:
quoted
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the current
implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle as
a cpuidle_device. So every cpu has to go through the process of
setting up the idle states and then registering as a cpuidle device.
What exactly is the reason behind this?
technically a BIOS can opt to give you C states via ACPI on some cpus,
but not on others.
in practice when this happens it tends to be a bug.. but it's
technically a valid configuration
In this day and age of flashable BIOS with recovery BIOS built in,
can't we just print out a big far warning, asking users of such
systems to go back to their vendors and ask for updates or find the
updates and apply them? Does the OS have to do the heavy lifting and
allow users to live with buggy BIOS's.
When you say it is a technically valid configuration, you mean that
the ACPI spec allows for such inconsistency?
Balbir Singh
From: Peter Zijlstra <hidden> Date: 2009-09-25 08:53:59
On Fri, 2009-09-25 at 12:36 +0530, Vaidyanathan Srinivasan wrote:
* Arjan van de Ven [off-list ref] [2009-09-24 14:22:28]:
quoted
On Thu, 24 Sep 2009 10:42:41 +0530
Arun R Bharadwaj [off-list ref] wrote:
quoted
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the current
implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle as
a cpuidle_device. So every cpu has to go through the process of
setting up the idle states and then registering as a cpuidle device.
What exactly is the reason behind this?
technically a BIOS can opt to give you C states via ACPI on some cpus,
but not on others.
in practice when this happens it tends to be a bug.. but it's
technically a valid configuration
So we will need to keep the per-cpu registration as of now because we
may have such buggy BIOS in the field and we don't want the cpuidle
framework to malfunction there.
If the BIOS doesn't mention a certain C state on a cpu, and you try to
set it anyway, does that go boom?
This whole per-cpu registration thing is horridly ugly, can't you have a
per-cpu C state exception mask and leave it at that -- if its really
needed?
From: Arjan van de Ven <hidden> Date: 2009-09-25 09:36:21
On Fri, 25 Sep 2009 10:54:24 +0200
Peter Zijlstra [off-list ref] wrote:
On Fri, 2009-09-25 at 12:36 +0530, Vaidyanathan Srinivasan wrote:
quoted
* Arjan van de Ven [off-list ref] [2009-09-24 14:22:28]:
quoted
On Thu, 24 Sep 2009 10:42:41 +0530
Arun R Bharadwaj [off-list ref] wrote:
quoted
* Arun R Bharadwaj [off-list ref] [2009-09-22
16:55:27]:
Hi Len, (or other acpi folks),
I had a question regarding ACPI-cpuidle interaction in the
current implementation.
Currently, every cpu (i.e. acpi_processor) registers to cpuidle
as a cpuidle_device. So every cpu has to go through the process
of setting up the idle states and then registering as a cpuidle
device.
What exactly is the reason behind this?
technically a BIOS can opt to give you C states via ACPI on some
cpus, but not on others.
in practice when this happens it tends to be a bug.. but it's
technically a valid configuration
So we will need to keep the per-cpu registration as of now because
we may have such buggy BIOS in the field and we don't want the
cpuidle framework to malfunction there.
If the BIOS doesn't mention a certain C state on a cpu, and you try to
set it anyway, does that go boom?
This whole per-cpu registration thing is horridly ugly, can't you
have a per-cpu C state exception mask and leave it at that -- if its
really needed?
the real solution is to make the acpi code always know about C1, even
if the bios doesn't.... That's one for Len :)
(C1 is just "hlt", what we do in the other idle loop ;-)
--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
From: Arun R Bharadwaj <hidden> Date: 2009-09-25 17:09:05
* Arun R Bharadwaj [off-list ref] [2009-09-22 16:55:27]:
Hi,
I have done the following experiments and have posted the results
below.
Average of 5 iterations:
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Kernbench make -j16 results on a
16 core x86 machine _with_deep_sleep_ support (C1,C2,C3)
Without the patches applied With the patches applied
31.8s 30.4s
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Kernbench make -j8 results on a
8 core x86 machine _without_deep_sleep_ support (only mwait)
Without the patches applied With the patches applied
20.2s 20.4s
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Kernbench make -j8 results on a 8 core _dedicated_lpar_pSeries_ machine
Without the patches applied With the patches applied
4m, 37s 4m, 36s
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Please let me know if any other kind of testing is necessary.
Based on the feedback, I will post out the next iteration with a few
minor bug fixes.
thanks,
arun