diff options
Diffstat (limited to 'litmus/sched_cedf.c')
-rw-r--r-- | litmus/sched_cedf.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index 82c9682eefbd..f5b77080cc4f 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
@@ -12,10 +12,14 @@ | |||
12 | * the programmer needs to be aware of the topology to place tasks | 12 | * the programmer needs to be aware of the topology to place tasks |
13 | * in the desired cluster | 13 | * in the desired cluster |
14 | * - default clustering is around L2 cache (cache index = 2) | 14 | * - default clustering is around L2 cache (cache index = 2) |
15 | * supported clusters are: L1 (private cache: pedf), L2, L3 | 15 | * supported clusters are: L1 (private cache: pedf), L2, L3, ALL (all |
16 | * online_cpus are placed in a single cluster). | ||
16 | * | 17 | * |
17 | * For details on functions, take a look at sched_gsn_edf.c | 18 | * For details on functions, take a look at sched_gsn_edf.c |
18 | * | 19 | * |
20 | * Currently, we do not support changes in the number of online cpus. | ||
21 | * If the num_online_cpus() dynamically changes, the plugin is broken. | ||
22 | * | ||
19 | * This version uses the simple approach and serializes all scheduling | 23 | * This version uses the simple approach and serializes all scheduling |
20 | * decisions by the use of a queue lock. This is probably not the | 24 | * decisions by the use of a queue lock. This is probably not the |
21 | * best way to do it, but it should suffice for now. | 25 | * best way to do it, but it should suffice for now. |
@@ -643,17 +647,23 @@ static long cedf_activate_plugin(void) | |||
643 | if(!zalloc_cpumask_var(&mask, GFP_ATOMIC)) | 647 | if(!zalloc_cpumask_var(&mask, GFP_ATOMIC)) |
644 | return -ENOMEM; | 648 | return -ENOMEM; |
645 | 649 | ||
646 | chk = get_shared_cpu_map(mask, 0, cluster_cache_index); | 650 | if (unlikely(cluster_cache_index == num_online_cpus())) { |
647 | if (chk) { | 651 | |
648 | /* if chk != 0 then it is the max allowed index */ | 652 | cluster_size = num_online_cpus(); |
649 | printk(KERN_INFO "C-EDF: Cannot support cache index = %d\n", | 653 | } else { |
650 | cluster_cache_index); | ||
651 | printk(KERN_INFO "C-EDF: Using cache index = %d\n", | ||
652 | chk); | ||
653 | cluster_cache_index = chk; | ||
654 | } | ||
655 | 654 | ||
656 | cluster_size = cpumask_weight(mask); | 655 | chk = get_shared_cpu_map(mask, 0, cluster_cache_index); |
656 | if (chk) { | ||
657 | /* if chk != 0 then it is the max allowed index */ | ||
658 | printk(KERN_INFO "C-EDF: Cannot support cache index = %d\n", | ||
659 | cluster_cache_index); | ||
660 | printk(KERN_INFO "C-EDF: Using cache index = %d\n", | ||
661 | chk); | ||
662 | cluster_cache_index = chk; | ||
663 | } | ||
664 | |||
665 | cluster_size = cpumask_weight(mask); | ||
666 | } | ||
657 | 667 | ||
658 | if ((num_online_cpus() % cluster_size) != 0) { | 668 | if ((num_online_cpus() % cluster_size) != 0) { |
659 | /* this can't be right, some cpus are left out */ | 669 | /* this can't be right, some cpus are left out */ |
@@ -696,7 +706,11 @@ static long cedf_activate_plugin(void) | |||
696 | 706 | ||
697 | /* this cpu isn't in any cluster */ | 707 | /* this cpu isn't in any cluster */ |
698 | /* get the shared cpus */ | 708 | /* get the shared cpus */ |
699 | get_shared_cpu_map(mask, cpu, cluster_cache_index); | 709 | if (unlikely(cluster_cache_index == num_online_cpus())) |
710 | cpumask_copy(mask, cpu_online_mask); | ||
711 | else | ||
712 | get_shared_cpu_map(mask, cpu, cluster_cache_index); | ||
713 | |||
700 | cpumask_copy(cedf[i].cpu_map, mask); | 714 | cpumask_copy(cedf[i].cpu_map, mask); |
701 | #ifdef VERBOSE_INIT | 715 | #ifdef VERBOSE_INIT |
702 | print_cluster_topology(mask, cpu); | 716 | print_cluster_topology(mask, cpu); |