diff options
Diffstat (limited to 'include/litmus/affinity.h')
-rw-r--r-- | include/litmus/affinity.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/include/litmus/affinity.h b/include/litmus/affinity.h new file mode 100644 index 000000000000..4d7c618c8175 --- /dev/null +++ b/include/litmus/affinity.h | |||
@@ -0,0 +1,52 @@ | |||
1 | #ifndef __LITMUS_AFFINITY_H | ||
2 | #define __LITMUS_AFFINITY_H | ||
3 | |||
4 | #include <linux/cpumask.h> | ||
5 | |||
6 | /* Works like: | ||
7 | void get_nearest_available_cpu( | ||
8 | cpu_entry_t **nearest, | ||
9 | cpu_entry_t *start, | ||
10 | cpu_entry_t *entries, | ||
11 | int release_master, | ||
12 | cpumask_var_t cpus_to_test) | ||
13 | |||
14 | Set release_master = NO_CPU for no Release Master. | ||
15 | |||
16 | We use a macro here to exploit the fact that C-EDF and G-EDF | ||
17 | have similar structures for their cpu_entry_t structs, even though | ||
18 | they do not share a common base-struct. The macro allows us to | ||
19 | avoid code duplication. | ||
20 | |||
21 | */ | ||
22 | #define get_nearest_available_cpu(nearest, start, entries, release_master, cpus_to_test) \ | ||
23 | { \ | ||
24 | (nearest) = NULL; \ | ||
25 | if (!(start)->linked && likely((start)->cpu != (release_master))) { \ | ||
26 | (nearest) = (start); \ | ||
27 | } else { \ | ||
28 | int __cpu; \ | ||
29 | \ | ||
30 | /* FIXME: get rid of the iteration with a bitmask + AND */ \ | ||
31 | for_each_cpu(__cpu, cpus_to_test) { \ | ||
32 | if (likely(__cpu != release_master)) { \ | ||
33 | cpu_entry_t *__entry = &per_cpu((entries), __cpu); \ | ||
34 | if (cpus_share_cache((start)->cpu, __entry->cpu) \ | ||
35 | && !__entry->linked) { \ | ||
36 | (nearest) = __entry; \ | ||
37 | break; \ | ||
38 | } \ | ||
39 | } \ | ||
40 | } \ | ||
41 | } \ | ||
42 | \ | ||
43 | if ((nearest)) { \ | ||
44 | TRACE("P%d is closest available CPU to P%d\n", \ | ||
45 | (nearest)->cpu, (start)->cpu); \ | ||
46 | } else { \ | ||
47 | TRACE("Could not find an available CPU close to P%d\n", \ | ||
48 | (start)->cpu); \ | ||
49 | } \ | ||
50 | } | ||
51 | |||
52 | #endif | ||