cpufreq_ondemand.c (39fe5434cb9de5da40510028b17b96bc4eb312b3) | cpufreq_ondemand.c (1c2562459faedc35927546cfa5273ec6c2884cce) |
---|---|
1/* 2 * drivers/cpufreq/cpufreq_ondemand.c 3 * 4 * Copyright (C) 2001 Russell King 5 * (C) 2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>. 6 * Jun Nakajima <jun.nakajima@intel.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 33 unchanged lines hidden (view full) --- 42#define MIN_SAMPLING_RATE_RATIO (2) 43/* for correct statistics, we need at least 10 ticks between each measure */ 44#define MIN_STAT_SAMPLING_RATE \ 45 (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10)) 46#define MIN_SAMPLING_RATE \ 47 (def_sampling_rate / MIN_SAMPLING_RATE_RATIO) 48#define MAX_SAMPLING_RATE (500 * def_sampling_rate) 49#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000) | 1/* 2 * drivers/cpufreq/cpufreq_ondemand.c 3 * 4 * Copyright (C) 2001 Russell King 5 * (C) 2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>. 6 * Jun Nakajima <jun.nakajima@intel.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 33 unchanged lines hidden (view full) --- 42#define MIN_SAMPLING_RATE_RATIO (2) 43/* for correct statistics, we need at least 10 ticks between each measure */ 44#define MIN_STAT_SAMPLING_RATE \ 45 (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10)) 46#define MIN_SAMPLING_RATE \ 47 (def_sampling_rate / MIN_SAMPLING_RATE_RATIO) 48#define MAX_SAMPLING_RATE (500 * def_sampling_rate) 49#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000) |
50#define TRANSITION_LATENCY_LIMIT (10 * 1000) | 50#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) |
51 52static void do_dbs_timer(struct work_struct *work); 53 54/* Sampling types */ 55enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE}; 56 57struct cpu_dbs_info_s { 58 cputime64_t prev_cpu_idle; --- 444 unchanged lines hidden (view full) --- 503 504 this_dbs_info = &per_cpu(cpu_dbs_info, cpu); 505 506 switch (event) { 507 case CPUFREQ_GOV_START: 508 if ((!cpu_online(cpu)) || (!policy->cur)) 509 return -EINVAL; 510 | 51 52static void do_dbs_timer(struct work_struct *work); 53 54/* Sampling types */ 55enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE}; 56 57struct cpu_dbs_info_s { 58 cputime64_t prev_cpu_idle; --- 444 unchanged lines hidden (view full) --- 503 504 this_dbs_info = &per_cpu(cpu_dbs_info, cpu); 505 506 switch (event) { 507 case CPUFREQ_GOV_START: 508 if ((!cpu_online(cpu)) || (!policy->cur)) 509 return -EINVAL; 510 |
511 if (policy->cpuinfo.transition_latency > 512 (TRANSITION_LATENCY_LIMIT * 1000)) { 513 printk(KERN_WARNING "ondemand governor failed to load " 514 "due to too long transition latency\n"); 515 return -EINVAL; 516 } | |
517 if (this_dbs_info->enable) /* Already enabled */ 518 break; 519 520 mutex_lock(&dbs_mutex); 521 dbs_enable++; 522 523 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group); 524 if (rc) { --- 55 unchanged lines hidden (view full) --- 580 policy->min, 581 CPUFREQ_RELATION_L); 582 mutex_unlock(&dbs_mutex); 583 break; 584 } 585 return 0; 586} 587 | 511 if (this_dbs_info->enable) /* Already enabled */ 512 break; 513 514 mutex_lock(&dbs_mutex); 515 dbs_enable++; 516 517 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group); 518 if (rc) { --- 55 unchanged lines hidden (view full) --- 574 policy->min, 575 CPUFREQ_RELATION_L); 576 mutex_unlock(&dbs_mutex); 577 break; 578 } 579 return 0; 580} 581 |
588static struct cpufreq_governor cpufreq_gov_dbs = { 589 .name = "ondemand", 590 .governor = cpufreq_governor_dbs, 591 .owner = THIS_MODULE, | 582struct cpufreq_governor cpufreq_gov_ondemand = { 583 .name = "ondemand", 584 .governor = cpufreq_governor_dbs, 585 .max_transition_latency = TRANSITION_LATENCY_LIMIT, 586 .owner = THIS_MODULE, |
592}; | 587}; |
588EXPORT_SYMBOL(cpufreq_gov_ondemand); |
|
593 594static int __init cpufreq_gov_dbs_init(void) 595{ 596 kondemand_wq = create_workqueue("kondemand"); 597 if (!kondemand_wq) { 598 printk(KERN_ERR "Creation of kondemand failed\n"); 599 return -EFAULT; 600 } | 589 590static int __init cpufreq_gov_dbs_init(void) 591{ 592 kondemand_wq = create_workqueue("kondemand"); 593 if (!kondemand_wq) { 594 printk(KERN_ERR "Creation of kondemand failed\n"); 595 return -EFAULT; 596 } |
601 return cpufreq_register_governor(&cpufreq_gov_dbs); | 597 return cpufreq_register_governor(&cpufreq_gov_ondemand); |
602} 603 604static void __exit cpufreq_gov_dbs_exit(void) 605{ | 598} 599 600static void __exit cpufreq_gov_dbs_exit(void) 601{ |
606 cpufreq_unregister_governor(&cpufreq_gov_dbs); | 602 cpufreq_unregister_governor(&cpufreq_gov_ondemand); |
607 destroy_workqueue(kondemand_wq); 608} 609 610 611MODULE_AUTHOR("Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>"); 612MODULE_AUTHOR("Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>"); 613MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for " 614 "Low Latency Frequency Transition capable processors"); 615MODULE_LICENSE("GPL"); 616 617module_init(cpufreq_gov_dbs_init); 618module_exit(cpufreq_gov_dbs_exit); 619 | 603 destroy_workqueue(kondemand_wq); 604} 605 606 607MODULE_AUTHOR("Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>"); 608MODULE_AUTHOR("Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>"); 609MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for " 610 "Low Latency Frequency Transition capable processors"); 611MODULE_LICENSE("GPL"); 612 613module_init(cpufreq_gov_dbs_init); 614module_exit(cpufreq_gov_dbs_exit); 615 |