aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2013-01-09 17:13:09 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2013-01-09 17:13:09 -0500
commitbe72103454770d480778ee90ae204c2da6ea30d9 (patch)
treebfd855e5bb27b45eb05a6c4c59b87a5f8da5c695 /src
parentf1c60566bc594e383b9a43993b4d0f13d98a4bd1 (diff)
parentcab0b107e196c5d8a94cb7f825cf3a39987220d6 (diff)
Merge branch 'wip-gpu-rtas12' into wip-slave-threads
Conflicts: Makefile src/syscalls.c
Diffstat (limited to 'src')
-rw-r--r--src/litmus.c84
-rw-r--r--src/signal.c107
-rwxr-xr-x[-rw-r--r--]src/syscalls.c19
-rw-r--r--src/task.c4
4 files changed, 206 insertions, 8 deletions
diff --git a/src/litmus.c b/src/litmus.c
index d3cc6bb..3bab483 100644
--- a/src/litmus.c
+++ b/src/litmus.c
@@ -26,7 +26,7 @@ task_class_t str2class(const char* str)
26 else if (!strcmp(str, "be")) 26 else if (!strcmp(str, "be"))
27 return RT_CLASS_BEST_EFFORT; 27 return RT_CLASS_BEST_EFFORT;
28 else 28 else
29 return -1; 29 return (task_class_t)(-1);
30} 30}
31 31
32#define NS_PER_MS 1000000 32#define NS_PER_MS 1000000
@@ -43,15 +43,19 @@ int be_migrate_to(int target_cpu)
43 43
44int sporadic_task(lt_t e, lt_t p, lt_t phase, 44int sporadic_task(lt_t e, lt_t p, lt_t phase,
45 int cpu, task_class_t cls, 45 int cpu, task_class_t cls,
46 budget_policy_t budget_policy, int set_cpu_set) 46 budget_policy_t budget_policy,
47 budget_signal_policy_t budget_signal_policy,
48 int set_cpu_set)
47{ 49{
48 return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, 50 return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS,
49 cpu, cls, budget_policy, set_cpu_set); 51 cpu, cls, budget_policy, budget_signal_policy, set_cpu_set);
50} 52}
51 53
52int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, 54int sporadic_task_ns(lt_t e, lt_t p, lt_t phase,
53 int cpu, task_class_t cls, 55 int cpu, task_class_t cls,
54 budget_policy_t budget_policy, int set_cpu_set) 56 budget_policy_t budget_policy,
57 budget_signal_policy_t budget_signal_policy,
58 int set_cpu_set)
55{ 59{
56 struct rt_task param; 60 struct rt_task param;
57 int ret; 61 int ret;
@@ -67,6 +71,7 @@ int sporadic_task_ns(lt_t e, lt_t p, lt_t phase,
67 param.cls = cls; 71 param.cls = cls;
68 param.phase = phase; 72 param.phase = phase;
69 param.budget_policy = budget_policy; 73 param.budget_policy = budget_policy;
74 param.budget_signal_policy = budget_signal_policy;
70 75
71 if (set_cpu_set) { 76 if (set_cpu_set) {
72 ret = be_migrate_to(cpu); 77 ret = be_migrate_to(cpu);
@@ -100,3 +105,74 @@ void exit_litmus(void)
100{ 105{
101 /* nothing to do in current version */ 106 /* nothing to do in current version */
102} 107}
108
109int open_kfmlp_gpu_sem(int fd, int name, int num_gpus, int gpu_offset, int num_simult_users, int affinity_aware)
110{
111 int lock_od;
112 int affinity_od;
113 int num_replicas;
114 struct gpu_affinity_observer_args aff_args;
115 int aff_type;
116
117 // number of GPU tokens
118 num_replicas = num_gpus * num_simult_users;
119
120 // create the GPU token lock
121 lock_od = open_kfmlp_sem(fd, name, (void*)&num_replicas);
122 if(lock_od < 0) {
123 perror("open_kfmlp_sem");
124 return -1;
125 }
126
127 // create the affinity method to use.
128 // "no affinity" -> KFMLP_SIMPLE_GPU_AFF_OBS
129 aff_args.obs.lock_od = lock_od;
130 aff_args.replica_to_gpu_offset = gpu_offset;
131 aff_args.nr_simult_users = num_simult_users;
132
133 aff_type = (affinity_aware) ? KFMLP_GPU_AFF_OBS : KFMLP_SIMPLE_GPU_AFF_OBS;
134 affinity_od = od_openx(fd, aff_type, name+1, &aff_args);
135 if(affinity_od < 0) {
136 perror("open_kfmlp_aff");
137 return -1;
138 }
139
140 return lock_od;
141}
142
143
144
145int open_ikglp_gpu_sem(int fd, int name, int num_gpus, int gpu_offset, int num_simult_users, int affinity_aware, int relax_max_fifo_len)
146{
147 int lock_od;
148 int affinity_od;
149 int num_replicas;
150 struct gpu_affinity_observer_args aff_args;
151 int aff_type;
152
153 // number of GPU tokens
154 num_replicas = num_gpus * num_simult_users;
155
156 // create the GPU token lock
157 lock_od = open_ikglp_sem(fd, name, (void*)&num_replicas);
158 if(lock_od < 0) {
159 perror("open_ikglp_sem");
160 return -1;
161 }
162
163 // create the affinity method to use.
164 // "no affinity" -> KFMLP_SIMPLE_GPU_AFF_OBS
165 aff_args.obs.lock_od = lock_od;
166 aff_args.replica_to_gpu_offset = gpu_offset;
167 aff_args.nr_simult_users = num_simult_users;
168 aff_args.relaxed_rules = (relax_max_fifo_len) ? 1 : 0;
169
170 aff_type = (affinity_aware) ? IKGLP_GPU_AFF_OBS : IKGLP_SIMPLE_GPU_AFF_OBS;
171 affinity_od = od_openx(fd, aff_type, name+1, &aff_args);
172 if(affinity_od < 0) {
173 perror("open_ikglp_aff");
174 return -1;
175 }
176
177 return lock_od;
178}
diff --git a/src/signal.c b/src/signal.c
new file mode 100644
index 0000000..bfe18b9
--- /dev/null
+++ b/src/signal.c
@@ -0,0 +1,107 @@
1#include <stdio.h>
2#include <string.h>
3
4#include "litmus.h"
5#include "internal.h"
6
7/* setjmp calls are stored on a singlely link list,
8 * one stack per thread.
9 */
10static __thread litmus_sigjmp_t *g_sigjmp_tail = 0;
11
12void push_sigjmp(litmus_sigjmp_t *buf)
13{
14 buf->prev = g_sigjmp_tail;
15 g_sigjmp_tail = buf;
16}
17
18litmus_sigjmp_t* pop_sigjmp(void)
19{
20 litmus_sigjmp_t* ret;
21 ret = g_sigjmp_tail;
22 g_sigjmp_tail = (ret) ? ret->prev : NULL;
23 return ret;
24}
25
26static void reg_litmus_signals(unsigned long litmus_sig_mask,
27 struct sigaction *pAction)
28{
29 int ret;
30
31 if (litmus_sig_mask | SIG_BUDGET_MASK) {
32 ret = sigaction(SIG_BUDGET, pAction, NULL);
33 check("SIG_BUDGET");
34 }
35 /* more signals ... */
36}
37
38void ignore_litmus_signals(unsigned long litmus_sig_mask)
39{
40 activate_litmus_signals(litmus_sig_mask, SIG_IGN);
41}
42
43void activate_litmus_signals(unsigned long litmus_sig_mask,
44 litmus_sig_handler_t handle)
45{
46 struct sigaction action;
47 memset(&action, 0, sizeof(action));
48 action.sa_handler = handle;
49
50 reg_litmus_signals(litmus_sig_mask, &action);
51}
52
53void activate_litmus_signal_actions(unsigned long litmus_sig_mask,
54 litmus_sig_actions_t handle)
55{
56 struct sigaction action;
57 memset(&action, 0, sizeof(action));
58 action.sa_sigaction = handle;
59 action.sa_flags = SA_SIGINFO;
60
61 reg_litmus_signals(litmus_sig_mask, &action);
62}
63
64void block_litmus_signals(unsigned long litmus_sig_mask)
65{
66 int ret;
67 sigset_t sigs;
68 sigemptyset(&sigs);
69
70 if (litmus_sig_mask | SIG_BUDGET_MASK) {
71 sigaddset(&sigs, SIG_BUDGET);
72 }
73 /* more signals ... */
74
75 ret = sigprocmask(SIG_BLOCK, &sigs, NULL);
76 check("SIG_BLOCK litmus signals");
77}
78
79void unblock_litmus_signals(unsigned long litmus_sig_mask)
80{
81 int ret;
82 sigset_t sigs;
83 sigemptyset(&sigs);
84
85 if (litmus_sig_mask | SIG_BUDGET_MASK) {
86 sigaddset(&sigs, SIG_BUDGET);
87 }
88 /* more ... */
89
90 ret = sigprocmask(SIG_UNBLOCK, &sigs, NULL);
91 check("SIG_UNBLOCK litmus signals");
92}
93
94
95void longjmp_on_litmus_signal(int signum)
96{
97 /* We get signal! Main screen turn on! */
98 litmus_sigjmp_t *lit_env;
99 lit_env = pop_sigjmp();
100 if (lit_env) {
101 /* What you say?! */
102 siglongjmp(lit_env->env, signum); /* restores signal mask */
103 }
104 else {
105 /* silently ignore the signal */
106 }
107}
diff --git a/src/syscalls.c b/src/syscalls.c
index 44d5808..56ad218 100644..100755
--- a/src/syscalls.c
+++ b/src/syscalls.c
@@ -52,6 +52,16 @@ int litmus_unlock(int od)
52 return syscall(__NR_litmus_unlock, od); 52 return syscall(__NR_litmus_unlock, od);
53} 53}
54 54
55int litmus_dgl_lock(int *ods, int dgl_size)
56{
57 return syscall(__NR_litmus_dgl_lock, ods, dgl_size);
58}
59
60int litmus_dgl_unlock(int *ods, int dgl_size)
61{
62 return syscall(__NR_litmus_dgl_unlock, ods, dgl_size);
63}
64
55int get_job_no(unsigned int *job_no) 65int get_job_no(unsigned int *job_no)
56{ 66{
57 return syscall(__NR_query_job_no, job_no); 67 return syscall(__NR_query_job_no, job_no);
@@ -87,7 +97,12 @@ int null_call(cycles_t *timestamp)
87 return syscall(__NR_null_call, timestamp); 97 return syscall(__NR_null_call, timestamp);
88} 98}
89 99
90int slave_non_rt_threads(void) 100int enable_aux_rt_tasks(int flags)
101{
102 return syscall(__NR_set_aux_tasks, flags | AUX_ENABLE);
103}
104
105int disable_aux_rt_tasks(int flags)
91{ 106{
92 return syscall(__NR_slave_non_rt_threads); 107 return syscall(__NR_set_aux_tasks, flags & ~AUX_ENABLE);
93} 108}
diff --git a/src/task.c b/src/task.c
index 4d237bd..26fc15a 100644
--- a/src/task.c
+++ b/src/task.c
@@ -41,13 +41,13 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup,
41} 41}
42 42
43int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, 43int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period,
44 task_class_t class) 44 task_class_t rt_class)
45{ 45{
46 struct rt_task params; 46 struct rt_task params;
47 params.cpu = cpu; 47 params.cpu = cpu;
48 params.period = period; 48 params.period = period;
49 params.exec_cost = wcet; 49 params.exec_cost = wcet;
50 params.cls = class; 50 params.cls = rt_class;
51 params.phase = 0; 51 params.phase = 0;
52 /* enforce budget for tasks that might not use sleep_next_period() */ 52 /* enforce budget for tasks that might not use sleep_next_period() */
53 params.budget_policy = QUANTUM_ENFORCEMENT; 53 params.budget_policy = QUANTUM_ENFORCEMENT;