diff options
| author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2011-01-03 07:29:48 -0500 |
|---|---|---|
| committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2011-01-05 08:02:21 -0500 |
| commit | 7648363e5636bd865aeac3236eb4675f0687eb4a (patch) | |
| tree | 3aa9553e8b7f443657e98e6121e9f3ab3b2da408 | |
| parent | 73da50b48b6e7c60add2fcf0b683318b76ecb340 (diff) | |
cleanup C-EDF cluster size configuration
Refactor the code that determines the C-EDF cluster size.
- Use an enum with symbolic constants instead of magic int values.
- Complain and fail to switch if an unsupported cluster size is requested.
- Default to ALL as suggested by Glenn and Andrea.
| -rw-r--r-- | litmus/sched_cedf.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index e815e31b1d84..098a449c2490 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
| @@ -45,14 +45,17 @@ | |||
| 45 | #include <litmus/litmus_proc.h> | 45 | #include <litmus/litmus_proc.h> |
| 46 | #include <linux/uaccess.h> | 46 | #include <linux/uaccess.h> |
| 47 | 47 | ||
| 48 | /* | 48 | /* Reference configuration variable. Determines which cache level is used to |
| 49 | * It makes sense only to cluster around L2 or L3, so if cluster_index = 2 | 49 | * group CPUs into clusters. GLOBAL_CLUSTER, which is the default, means that |
| 50 | * (default) we cluster all the CPUs that shares a L2 cache, while | 50 | * all CPUs form a single cluster (just like GSN-EDF). |
| 51 | * cluster_cache_index = 3 we cluster all CPs that shares a L3 cache | ||
| 52 | */ | 51 | */ |
| 53 | int cluster_index = 2; | 52 | static enum { |
| 53 | GLOBAL_CLUSTER = 0, | ||
| 54 | L1_CLUSTER = 1, | ||
| 55 | L2_CLUSTER = 2, | ||
| 56 | L3_CLUSTER = 3 | ||
| 57 | } cluster_config = GLOBAL_CLUSTER; | ||
| 54 | 58 | ||
| 55 | /* forward declaration... a funny thing with C ;) */ | ||
| 56 | struct clusterdomain; | 59 | struct clusterdomain; |
| 57 | 60 | ||
| 58 | /* cpu_entry_t - maintain the linked and scheduled state | 61 | /* cpu_entry_t - maintain the linked and scheduled state |
| @@ -649,26 +652,25 @@ static long cedf_activate_plugin(void) | |||
| 649 | /* de-allocate old clusters, if any */ | 652 | /* de-allocate old clusters, if any */ |
| 650 | cleanup_cedf(); | 653 | cleanup_cedf(); |
| 651 | 654 | ||
| 652 | printk(KERN_INFO "C-EDF: Activate Plugin, cache index = %d\n", | 655 | printk(KERN_INFO "C-EDF: Activate Plugin, cluster configuration = %d\n", |
| 653 | cluster_index); | 656 | cluster_config); |
| 654 | 657 | ||
| 655 | /* need to get cluster_size first */ | 658 | /* need to get cluster_size first */ |
| 656 | if(!zalloc_cpumask_var(&mask, GFP_ATOMIC)) | 659 | if(!zalloc_cpumask_var(&mask, GFP_ATOMIC)) |
| 657 | return -ENOMEM; | 660 | return -ENOMEM; |
| 658 | 661 | ||
| 659 | if (unlikely(cluster_index == num_online_cpus())) { | 662 | if (unlikely(cluster_config == GLOBAL_CLUSTER)) { |
| 660 | |||
| 661 | cluster_size = num_online_cpus(); | 663 | cluster_size = num_online_cpus(); |
| 662 | } else { | 664 | } else { |
| 663 | 665 | chk = get_shared_cpu_map(mask, 0, cluster_config); | |
| 664 | chk = get_shared_cpu_map(mask, 0, cluster_index); | ||
| 665 | if (chk) { | 666 | if (chk) { |
| 666 | /* if chk != 0 then it is the max allowed index */ | 667 | /* if chk != 0 then it is the max allowed index */ |
| 667 | printk(KERN_INFO "C-EDF: Cannot support cache index = %d\n", | 668 | printk(KERN_INFO "C-EDF: Cluster configuration = %d " |
| 668 | cluster_index); | 669 | "is not supported on this hardware.\n", |
| 669 | printk(KERN_INFO "C-EDF: Using cache index = %d\n", | 670 | cluster_config); |
| 670 | chk); | 671 | /* User should notice that the configuration failed, so |
| 671 | cluster_index = chk; | 672 | * let's bail out. */ |
| 673 | return -EINVAL; | ||
| 672 | } | 674 | } |
| 673 | 675 | ||
| 674 | cluster_size = cpumask_weight(mask); | 676 | cluster_size = cpumask_weight(mask); |
| @@ -716,10 +718,10 @@ static long cedf_activate_plugin(void) | |||
| 716 | 718 | ||
| 717 | /* this cpu isn't in any cluster */ | 719 | /* this cpu isn't in any cluster */ |
| 718 | /* get the shared cpus */ | 720 | /* get the shared cpus */ |
| 719 | if (unlikely(cluster_index == num_online_cpus())) | 721 | if (unlikely(cluster_config == GLOBAL_CLUSTER)) |
| 720 | cpumask_copy(mask, cpu_online_mask); | 722 | cpumask_copy(mask, cpu_online_mask); |
| 721 | else | 723 | else |
| 722 | get_shared_cpu_map(mask, cpu, cluster_index); | 724 | get_shared_cpu_map(mask, cpu, cluster_config); |
| 723 | 725 | ||
| 724 | cpumask_copy(cedf[i].cpu_map, mask); | 726 | cpumask_copy(cedf[i].cpu_map, mask); |
| 725 | #ifdef VERBOSE_INIT | 727 | #ifdef VERBOSE_INIT |
| @@ -776,11 +778,21 @@ static int proc_read_cluster_size(char *page, char **start, | |||
| 776 | int *eof, void *data) | 778 | int *eof, void *data) |
| 777 | { | 779 | { |
| 778 | int len; | 780 | int len; |
| 779 | if (cluster_index >= 1 && cluster_index <= 3) | 781 | switch (cluster_config) { |
| 780 | len = snprintf(page, PAGE_SIZE, "L%d\n", cluster_index); | 782 | case GLOBAL_CLUSTER: |
| 781 | else | ||
| 782 | len = snprintf(page, PAGE_SIZE, "ALL\n"); | 783 | len = snprintf(page, PAGE_SIZE, "ALL\n"); |
| 783 | 784 | break; | |
| 785 | case L1_CLUSTER: | ||
| 786 | case L2_CLUSTER: | ||
| 787 | case L3_CLUSTER: | ||
| 788 | len = snprintf(page, PAGE_SIZE, "L%d\n", cluster_config); | ||
| 789 | break; | ||
| 790 | default: | ||
| 791 | /* This should be impossible, but let's be paranoid. */ | ||
| 792 | len = snprintf(page, PAGE_SIZE, "INVALID (%d)\n", | ||
| 793 | cluster_config); | ||
| 794 | break; | ||
| 795 | } | ||
| 784 | return len; | 796 | return len; |
| 785 | } | 797 | } |
| 786 | 798 | ||
| @@ -808,13 +820,13 @@ static int proc_write_cluster_size(struct file *file, | |||
| 808 | 820 | ||
| 809 | /* do a quick and dirty comparison to find the cluster size */ | 821 | /* do a quick and dirty comparison to find the cluster size */ |
| 810 | if (!strcmp(cache_name, "L2")) | 822 | if (!strcmp(cache_name, "L2")) |
| 811 | cluster_index = 2; | 823 | cluster_config = L2_CLUSTER; |
| 812 | else if (!strcmp(cache_name, "L3")) | 824 | else if (!strcmp(cache_name, "L3")) |
| 813 | cluster_index = 3; | 825 | cluster_config = L3_CLUSTER; |
| 814 | else if (!strcmp(cache_name, "L1")) | 826 | else if (!strcmp(cache_name, "L1")) |
| 815 | cluster_index = 1; | 827 | cluster_config = L1_CLUSTER; |
| 816 | else if (!strcmp(cache_name, "ALL")) | 828 | else if (!strcmp(cache_name, "ALL")) |
| 817 | cluster_index = num_online_cpus(); | 829 | cluster_config = GLOBAL_CLUSTER; |
| 818 | else | 830 | else |
| 819 | printk(KERN_INFO "Cluster '%s' is unknown.\n", cache_name); | 831 | printk(KERN_INFO "Cluster '%s' is unknown.\n", cache_name); |
| 820 | 832 | ||
