aboutsummaryrefslogtreecommitdiffstats
path: root/include/litmus
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2011-06-22 01:30:25 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2011-08-27 12:04:53 -0400
commitb4c52e27caa701a16e120b43a0e70ca6529a58a4 (patch)
tree677c7326db2a1334b28870c2cf4dc3a9795be08e /include/litmus
parentb751e4e17e667f11404fc2f290416c0df050e964 (diff)
C-EDF: Make migration affinity work with Release Master
Needed to update C-EDF to handle release master. Also updated get_nearest_available_cpu() to take NO_CPU instead of -1 to indicate that there is no release master. While NO_CPU is 0xffffffff (-1 in two's complement), we still translate this value to -1 in case NO_CPU changes. Signed-off-by: Andrea Bastoni <bastoni@cs.unc.edu>
Diffstat (limited to 'include/litmus')
-rw-r--r--include/litmus/affinity.h15
1 files changed, 8 insertions, 7 deletions
diff --git a/include/litmus/affinity.h b/include/litmus/affinity.h
index 5eee0eaa170d..ca2e442eb547 100644
--- a/include/litmus/affinity.h
+++ b/include/litmus/affinity.h
@@ -24,12 +24,12 @@ void init_topology(void); /* called by Litmus module's _init_litmus() */
24 24
25/* Works like: 25/* Works like:
26void get_nearest_available_cpu( 26void get_nearest_available_cpu(
27 cpu_entry_t* nearest, 27 cpu_entry_t **nearest,
28 cpu_entry_t* start, 28 cpu_entry_t *start,
29 cpu_entry_t* entries, 29 cpu_entry_t *entries,
30 int release_master) 30 int release_master)
31 31
32Set release_master = -1 for no RM. 32Set release_master = NO_CPU for no Release Master.
33 33
34We use a macro here to exploit the fact that C-EDF and G-EDF 34We use a macro here to exploit the fact that C-EDF and G-EDF
35have similar structures for their cpu_entry_t structs, even though 35have similar structures for their cpu_entry_t structs, even though
@@ -48,13 +48,14 @@ dissertation.)
48 } else { \ 48 } else { \
49 int __level; \ 49 int __level; \
50 int __cpu; \ 50 int __cpu; \
51 struct neighborhood* __neighbors = &neigh_info[(start)->cpu]; \ 51 int __release_master = ((release_master) == NO_CPU) ? -1 : (release_master); \
52 struct neighborhood *__neighbors = &neigh_info[(start)->cpu]; \
52 \ 53 \
53 for (__level = 0; (__level < NUM_CACHE_LEVELS) && !(nearest); ++__level) { \ 54 for (__level = 0; (__level < NUM_CACHE_LEVELS) && !(nearest); ++__level) { \
54 if (__neighbors->size[__level] > 1) { \ 55 if (__neighbors->size[__level] > 1) { \
55 for_each_cpu(__cpu, __neighbors->neighbors[__level]) { \ 56 for_each_cpu(__cpu, __neighbors->neighbors[__level]) { \
56 if (__cpu != (release_master)) { \ 57 if (__cpu != __release_master) { \
57 cpu_entry_t* __entry = &per_cpu((entries), __cpu); \ 58 cpu_entry_t *__entry = &per_cpu((entries), __cpu); \
58 if (!__entry->linked) { \ 59 if (!__entry->linked) { \
59 (nearest) = __entry; \ 60 (nearest) = __entry; \
60 break; \ 61 break; \