aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-20 16:14:00 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 11:28:20 -0400
commitde2d5dfa2dce8ec40555b3bb6dfe21627e472c52 (patch)
tree9dd7909e70b4f3c669ce3c58be75396cad0ed820
parent6f89d4f31485546674187cf3b4d472f230b263d0 (diff)
Add support for one single cluster (all cpus) on C-EDF
- With the "ALL" cluster size option the behavior of C-EDF is equivalent to G-EDF (one single cluster)
-rw-r--r--litmus/litmus.c6
-rw-r--r--litmus/sched_cedf.c38
2 files changed, 31 insertions, 13 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c
index 86ad5b375934..b71fc819eb51 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -582,8 +582,10 @@ static int proc_read_cluster_size(char *page, char **start,
582 len = snprintf(page, PAGE_SIZE, "L2\n"); 582 len = snprintf(page, PAGE_SIZE, "L2\n");
583 else if (cluster_cache_index == 3) 583 else if (cluster_cache_index == 3)
584 len = snprintf(page, PAGE_SIZE, "L3\n"); 584 len = snprintf(page, PAGE_SIZE, "L3\n");
585 else /* (cluster_cache_index == 1) */ 585 else if (cluster_cache_index == 1)
586 len = snprintf(page, PAGE_SIZE, "L1\n"); 586 len = snprintf(page, PAGE_SIZE, "L1\n");
587 else
588 len = snprintf(page, PAGE_SIZE, "ALL\n");
587 589
588 return len; 590 return len;
589} 591}
@@ -617,6 +619,8 @@ static int proc_write_cluster_size(struct file *file,
617 cluster_cache_index = 3; 619 cluster_cache_index = 3;
618 else if (!strcmp(cache_name, "L1")) 620 else if (!strcmp(cache_name, "L1"))
619 cluster_cache_index = 1; 621 cluster_cache_index = 1;
622 else if (!strcmp(cache_name, "ALL"))
623 cluster_cache_index = num_online_cpus();
620 else 624 else
621 printk(KERN_INFO "Cluster '%s' is unknown.\n", cache_name); 625 printk(KERN_INFO "Cluster '%s' is unknown.\n", cache_name);
622 626
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);