diff options
| -rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 55 |
1 files changed, 18 insertions, 37 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index 7498f2506ade..a152d2c46be7 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
| @@ -65,6 +65,8 @@ struct cpu_dbs_info_s { | |||
| 65 | unsigned int prev_cpu_idle_up; | 65 | unsigned int prev_cpu_idle_up; |
| 66 | unsigned int prev_cpu_idle_down; | 66 | unsigned int prev_cpu_idle_down; |
| 67 | unsigned int enable; | 67 | unsigned int enable; |
| 68 | unsigned int down_skip; | ||
| 69 | unsigned int requested_freq; | ||
| 68 | }; | 70 | }; |
| 69 | static DEFINE_PER_CPU(struct cpu_dbs_info_s, cpu_dbs_info); | 71 | static DEFINE_PER_CPU(struct cpu_dbs_info_s, cpu_dbs_info); |
| 70 | 72 | ||
| @@ -297,35 +299,12 @@ static void dbs_check_cpu(int cpu) | |||
| 297 | unsigned int tmp_idle_ticks, total_idle_ticks; | 299 | unsigned int tmp_idle_ticks, total_idle_ticks; |
| 298 | unsigned int freq_step; | 300 | unsigned int freq_step; |
| 299 | unsigned int freq_down_sampling_rate; | 301 | unsigned int freq_down_sampling_rate; |
| 300 | static unsigned short down_skip[NR_CPUS]; | ||
| 301 | static unsigned int requested_freq[NR_CPUS]; | ||
| 302 | static unsigned int init_flag = NR_CPUS; | ||
| 303 | struct cpu_dbs_info_s *this_dbs_info = &per_cpu(cpu_dbs_info, cpu); | 302 | struct cpu_dbs_info_s *this_dbs_info = &per_cpu(cpu_dbs_info, cpu); |
| 304 | struct cpufreq_policy *policy; | 303 | struct cpufreq_policy *policy; |
| 305 | 304 | ||
| 306 | if (!this_dbs_info->enable) | 305 | if (!this_dbs_info->enable) |
| 307 | return; | 306 | return; |
| 308 | 307 | ||
| 309 | if ( init_flag != 0 ) { | ||
| 310 | for_each_cpu(init_flag) { | ||
| 311 | down_skip[init_flag] = 0; | ||
| 312 | /* I doubt a CPU exists with a freq of 0hz :) */ | ||
| 313 | requested_freq[init_flag] = 0; | ||
| 314 | } | ||
| 315 | init_flag = 0; | ||
| 316 | } | ||
| 317 | |||
| 318 | /* | ||
| 319 | * If its a freshly initialised cpu we setup requested_freq. This | ||
| 320 | * check could be avoided if we did not care about a first time | ||
| 321 | * stunted increase in CPU speed when there is a load. I feel we | ||
| 322 | * should be initialising this to something. The removal of a CPU | ||
| 323 | * is not a problem, after a short time the CPU should settle down | ||
| 324 | * to a 'natural' frequency. | ||
| 325 | */ | ||
| 326 | if (requested_freq[cpu] == 0) | ||
| 327 | requested_freq[cpu] = this_dbs_info->cur_policy->cur; | ||
| 328 | |||
| 329 | policy = this_dbs_info->cur_policy; | 308 | policy = this_dbs_info->cur_policy; |
| 330 | 309 | ||
| 331 | /* | 310 | /* |
| @@ -360,12 +339,12 @@ static void dbs_check_cpu(int cpu) | |||
| 360 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); | 339 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); |
| 361 | 340 | ||
| 362 | if (idle_ticks < up_idle_ticks) { | 341 | if (idle_ticks < up_idle_ticks) { |
| 363 | down_skip[cpu] = 0; | 342 | this_dbs_info->down_skip = 0; |
| 364 | this_dbs_info->prev_cpu_idle_down = | 343 | this_dbs_info->prev_cpu_idle_down = |
| 365 | this_dbs_info->prev_cpu_idle_up; | 344 | this_dbs_info->prev_cpu_idle_up; |
| 366 | 345 | ||
| 367 | /* if we are already at full speed then break out early */ | 346 | /* if we are already at full speed then break out early */ |
| 368 | if (requested_freq[cpu] == policy->max) | 347 | if (this_dbs_info->requested_freq == policy->max) |
| 369 | return; | 348 | return; |
| 370 | 349 | ||
| 371 | freq_step = (dbs_tuners_ins.freq_step * policy->max) / 100; | 350 | freq_step = (dbs_tuners_ins.freq_step * policy->max) / 100; |
| @@ -374,18 +353,18 @@ static void dbs_check_cpu(int cpu) | |||
| 374 | if (unlikely(freq_step == 0)) | 353 | if (unlikely(freq_step == 0)) |
| 375 | freq_step = 5; | 354 | freq_step = 5; |
| 376 | 355 | ||
| 377 | requested_freq[cpu] += freq_step; | 356 | this_dbs_info->requested_freq += freq_step; |
| 378 | if (requested_freq[cpu] > policy->max) | 357 | if (this_dbs_info->requested_freq > policy->max) |
| 379 | requested_freq[cpu] = policy->max; | 358 | this_dbs_info->requested_freq = policy->max; |
| 380 | 359 | ||
| 381 | __cpufreq_driver_target(policy, requested_freq[cpu], | 360 | __cpufreq_driver_target(policy, this_dbs_info->requested_freq, |
| 382 | CPUFREQ_RELATION_H); | 361 | CPUFREQ_RELATION_H); |
| 383 | return; | 362 | return; |
| 384 | } | 363 | } |
| 385 | 364 | ||
| 386 | /* Check for frequency decrease */ | 365 | /* Check for frequency decrease */ |
| 387 | down_skip[cpu]++; | 366 | this_dbs_info->down_skip++; |
| 388 | if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor) | 367 | if (this_dbs_info->down_skip < dbs_tuners_ins.sampling_down_factor) |
| 389 | return; | 368 | return; |
| 390 | 369 | ||
| 391 | /* Check for frequency decrease */ | 370 | /* Check for frequency decrease */ |
| @@ -399,7 +378,7 @@ static void dbs_check_cpu(int cpu) | |||
| 399 | 378 | ||
| 400 | /* Scale idle ticks by 100 and compare with up and down ticks */ | 379 | /* Scale idle ticks by 100 and compare with up and down ticks */ |
| 401 | idle_ticks *= 100; | 380 | idle_ticks *= 100; |
| 402 | down_skip[cpu] = 0; | 381 | this_dbs_info->down_skip = 0; |
| 403 | 382 | ||
| 404 | freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * | 383 | freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * |
| 405 | dbs_tuners_ins.sampling_down_factor; | 384 | dbs_tuners_ins.sampling_down_factor; |
| @@ -412,7 +391,7 @@ static void dbs_check_cpu(int cpu) | |||
| 412 | * or if we 'cannot' reduce the speed as the user might want | 391 | * or if we 'cannot' reduce the speed as the user might want |
| 413 | * freq_step to be zero | 392 | * freq_step to be zero |
| 414 | */ | 393 | */ |
| 415 | if (requested_freq[cpu] == policy->min | 394 | if (this_dbs_info->requested_freq == policy->min |
| 416 | || dbs_tuners_ins.freq_step == 0) | 395 | || dbs_tuners_ins.freq_step == 0) |
| 417 | return; | 396 | return; |
| 418 | 397 | ||
| @@ -422,11 +401,11 @@ static void dbs_check_cpu(int cpu) | |||
| 422 | if (unlikely(freq_step == 0)) | 401 | if (unlikely(freq_step == 0)) |
| 423 | freq_step = 5; | 402 | freq_step = 5; |
| 424 | 403 | ||
| 425 | requested_freq[cpu] -= freq_step; | 404 | this_dbs_info->requested_freq -= freq_step; |
| 426 | if (requested_freq[cpu] < policy->min) | 405 | if (this_dbs_info->requested_freq < policy->min) |
| 427 | requested_freq[cpu] = policy->min; | 406 | this_dbs_info->requested_freq = policy->min; |
| 428 | 407 | ||
| 429 | __cpufreq_driver_target(policy, requested_freq[cpu], | 408 | __cpufreq_driver_target(policy, this_dbs_info->requested_freq, |
| 430 | CPUFREQ_RELATION_H); | 409 | CPUFREQ_RELATION_H); |
| 431 | return; | 410 | return; |
| 432 | } | 411 | } |
| @@ -489,6 +468,8 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
| 489 | = j_dbs_info->prev_cpu_idle_up; | 468 | = j_dbs_info->prev_cpu_idle_up; |
| 490 | } | 469 | } |
| 491 | this_dbs_info->enable = 1; | 470 | this_dbs_info->enable = 1; |
| 471 | this_dbs_info->down_skip = 0; | ||
| 472 | this_dbs_info->requested_freq = policy->cur; | ||
| 492 | sysfs_create_group(&policy->kobj, &dbs_attr_group); | 473 | sysfs_create_group(&policy->kobj, &dbs_attr_group); |
| 493 | dbs_enable++; | 474 | dbs_enable++; |
| 494 | /* | 475 | /* |
