rpms/kernel/F-7 kernel-2.6.spec, 1.3251, 1.3252 linux-2.6-ondemand-timer.patch, 1.5, 1.6
Dave Jones (davej)
fedora-extras-commits at redhat.com
Thu Jul 5 20:44:18 UTC 2007
- Previous message: rpms/kernel/F-7 linux-2.6-acpi-preserve-ebx-in-acpi_copy_wakeup_routine.patch, NONE, 1.1 linux-2.6-libata-pata_it821x-partly-fix-dma.patch, NONE, 1.1 kernel-2.6.spec, 1.3250, 1.3251
- Next message: rpms/kernel/devel linux-2.6-ondemand-timer.patch, 1.6, 1.7 kernel-2.6.spec, 1.3270, 1.3271
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: davej
Update of /cvs/pkgs/rpms/kernel/F-7
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv2970
Modified Files:
kernel-2.6.spec linux-2.6-ondemand-timer.patch
Log Message:
* Thu Jul 05 2007 Dave Jones <davej at redhat.com>
- Further tickless improvements to ondemand cpufreq governor.
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-7/kernel-2.6.spec,v
retrieving revision 1.3251
retrieving revision 1.3252
diff -u -r1.3251 -r1.3252
--- kernel-2.6.spec 5 Jul 2007 20:36:55 -0000 1.3251
+++ kernel-2.6.spec 5 Jul 2007 20:43:43 -0000 1.3252
@@ -2465,6 +2465,9 @@
%endif
%changelog
+* Thu Jul 05 2007 Dave Jones <davej at redhat.com>
+- Further tickless improvements to ondemand cpufreq governor.
+
* Thu Jul 05 2007 Chuck Ebbert <cebbert at redhat.com>
- ACPI: fix possible hang on suspend
- pata_it821x: partially fix DMA in RAID mode
linux-2.6-ondemand-timer.patch:
Index: linux-2.6-ondemand-timer.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-7/linux-2.6-ondemand-timer.patch,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- linux-2.6-ondemand-timer.patch 29 Mar 2007 00:00:56 -0000 1.5
+++ linux-2.6-ondemand-timer.patch 5 Jul 2007 20:43:43 -0000 1.6
@@ -328,3 +328,172 @@
do { \
INIT_WORK_NAR(&(_work)->work, (_func)); \
+
+Userspace governor registers a frequency change notifier at init time, even
+when no CPU is set to userspace governor. Make it register only when
+atleast one CPU is using userspace.
+
+Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
+
+Index: linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_userspace.c
+===================================================================
+--- linux-2.6.22-rc-mm.orig/drivers/cpufreq/cpufreq_userspace.c
++++ linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_userspace.c
+@@ -37,6 +37,7 @@ static unsigned int cpu_set_freq[NR_CPUS
+ static unsigned int cpu_is_managed[NR_CPUS];
+
+ static DEFINE_MUTEX (userspace_mutex);
++static int cpus_using_userspace_governor;
+
+ #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg)
+
+@@ -47,7 +48,11 @@ userspace_cpufreq_notifier(struct notifi
+ {
+ struct cpufreq_freqs *freq = data;
+
+- dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", freq->cpu, freq->new);
++ if (!cpu_is_managed[freq->cpu])
++ return 0;
++
++ dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n",
++ freq->cpu, freq->new);
+ cpu_cur_freq[freq->cpu] = freq->new;
+
+ return 0;
+@@ -142,6 +147,13 @@ static int cpufreq_governor_userspace(st
+ if (rc)
+ goto start_out;
+
++ if (cpus_using_userspace_governor == 0) {
++ cpufreq_register_notifier(
++ &userspace_cpufreq_notifier_block,
++ CPUFREQ_TRANSITION_NOTIFIER);
++ }
++ cpus_using_userspace_governor++;
++
+ cpu_is_managed[cpu] = 1;
+ cpu_min_freq[cpu] = policy->min;
+ cpu_max_freq[cpu] = policy->max;
+@@ -153,6 +165,13 @@ start_out:
+ break;
+ case CPUFREQ_GOV_STOP:
+ mutex_lock(&userspace_mutex);
++ cpus_using_userspace_governor--;
++ if (cpus_using_userspace_governor == 0) {
++ cpufreq_unregister_notifier(
++ &userspace_cpufreq_notifier_block,
++ CPUFREQ_TRANSITION_NOTIFIER);
++ }
++
+ cpu_is_managed[cpu] = 0;
+ cpu_min_freq[cpu] = 0;
+ cpu_max_freq[cpu] = 0;
+@@ -198,7 +217,6 @@ EXPORT_SYMBOL(cpufreq_gov_userspace);
+
+ static int __init cpufreq_gov_userspace_init(void)
+ {
+- cpufreq_register_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
+ return cpufreq_register_governor(&cpufreq_gov_userspace);
+ }
+
+@@ -206,7 +224,6 @@ static int __init cpufreq_gov_userspace_
+ static void __exit cpufreq_gov_userspace_exit(void)
+ {
+ cpufreq_unregister_governor(&cpufreq_gov_userspace);
+- cpufreq_unregister_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
+ }
+
+
+
+Due to rounding and inexact jiffy accounting, idle_ticks can sometimes
+be higher than total_ticks. Make sure those cases are handled as
+zero load case.
+
+Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
+
+Index: linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_ondemand.c
+===================================================================
+--- linux-2.6.22-rc-mm.orig/drivers/cpufreq/cpufreq_ondemand.c
++++ linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_ondemand.c
+@@ -325,7 +325,7 @@ static struct attribute_group dbs_attr_g
+ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
+ {
+ unsigned int idle_ticks, total_ticks;
+- unsigned int load;
++ unsigned int load = 0;
+ cputime64_t cur_jiffies;
+
+ struct cpufreq_policy *policy;
+@@ -370,7 +370,8 @@ static void dbs_check_cpu(struct cpu_dbs
+ if (tmp_idle_ticks < idle_ticks)
+ idle_ticks = tmp_idle_ticks;
+ }
+- load = (100 * (total_ticks - idle_ticks)) / total_ticks;
++ if (likely(total_ticks > idle_ticks))
++ load = (100 * (total_ticks - idle_ticks)) / total_ticks;
+
+ /* Check for frequency increase */
+ if (load > dbs_tuners_ins.up_threshold) {
+
+With tickless kernel and software coordination os P-states, ondemand
+can look at wrong idle statistics. This can happen when ondemand sampling
+is happening on CPU 0 and due to software coordination sampling also looks at
+utilization of CPU 1. If CPU 1 is in tickless state at that moment, its idle
+statistics will not be uptodate and CPU 0 thinks CPU 1 is idle for less
+amount of time than it actually is.
+
+This can be resolved by looking at all the busy times of CPUs, which is
+accurate, even with tickless, and use that to determine idle time in a
+round about way (total time - busy time).
+
+Thanks to Arjan for originally reporting this ondemand issue on
+Lenovo T61.
+
+Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
+
+Index: linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_ondemand.c
+===================================================================
+--- linux-2.6.22-rc-mm.orig/drivers/cpufreq/cpufreq_ondemand.c
++++ linux-2.6.22-rc-mm/drivers/cpufreq/cpufreq_ondemand.c
+@@ -96,15 +96,25 @@ static struct dbs_tuners {
+
+ static inline cputime64_t get_cpu_idle_time(unsigned int cpu)
+ {
+- cputime64_t retval;
++ cputime64_t idle_time;
++ cputime64_t cur_jiffies;
++ cputime64_t busy_time;
+
+- retval = cputime64_add(kstat_cpu(cpu).cpustat.idle,
+- kstat_cpu(cpu).cpustat.iowait);
++ cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
++ busy_time = cputime64_add(kstat_cpu(cpu).cpustat.user,
++ kstat_cpu(cpu).cpustat.system);
+
+- if (dbs_tuners_ins.ignore_nice)
+- retval = cputime64_add(retval, kstat_cpu(cpu).cpustat.nice);
++ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
++ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
++ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);
+
+- return retval;
++ if (!dbs_tuners_ins.ignore_nice) {
++ busy_time = cputime64_add(busy_time,
++ kstat_cpu(cpu).cpustat.nice);
++ }
++
++ idle_time = cputime64_sub(cur_jiffies, busy_time);
++ return idle_time;
+ }
+
+ /*
+@@ -339,7 +349,8 @@ static void dbs_check_cpu(struct cpu_dbs
+ cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
+ total_ticks = (unsigned int) cputime64_sub(cur_jiffies,
+ this_dbs_info->prev_cpu_wall);
+- this_dbs_info->prev_cpu_wall = cur_jiffies;
++ this_dbs_info->prev_cpu_wall = get_jiffies_64();
++
+ if (!total_ticks)
+ return;
+ /*
- Previous message: rpms/kernel/F-7 linux-2.6-acpi-preserve-ebx-in-acpi_copy_wakeup_routine.patch, NONE, 1.1 linux-2.6-libata-pata_it821x-partly-fix-dma.patch, NONE, 1.1 kernel-2.6.spec, 1.3250, 1.3251
- Next message: rpms/kernel/devel linux-2.6-ondemand-timer.patch, 1.6, 1.7 kernel-2.6.spec, 1.3270, 1.3271
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the scm-commits
mailing list