diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-12 15:00:54 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-12 15:00:54 -0400 |
commit | 30d31fd0e255257da8e823b8129d33e7fcfeb7cc (patch) | |
tree | 12e07b1cd51f78f9b266bb458bc9a6383915aed3 /litmus/dgl.c | |
parent | f7297fa9c64dfd89bc8f92e2ef817295004ec093 (diff) |
DGL makes all decisions using pull_hp when preemption is enabled.
Diffstat (limited to 'litmus/dgl.c')
-rw-r--r-- | litmus/dgl.c | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/litmus/dgl.c b/litmus/dgl.c index 40f298221839..1132b7ce92a9 100644 --- a/litmus/dgl.c +++ b/litmus/dgl.c | |||
@@ -67,7 +67,7 @@ static void print_waiting(struct dgl *dgl, struct dgl_resource *resource) | |||
67 | /* | 67 | /* |
68 | * Add @req to @list in priority order (higher numbers are lower priority). | 68 | * Add @req to @list in priority order (higher numbers are lower priority). |
69 | */ | 69 | */ |
70 | static void add_req(struct dgl_req *req, struct list_head *list) | 70 | static void add_req(struct dgl *dgl, struct dgl_req *req, struct list_head *list) |
71 | { | 71 | { |
72 | struct dgl_req *pos; | 72 | struct dgl_req *pos; |
73 | struct list_head *last = list; | 73 | struct list_head *last = list; |
@@ -82,7 +82,7 @@ static void add_req(struct dgl_req *req, struct list_head *list) | |||
82 | } | 82 | } |
83 | last = &pos->list; | 83 | last = &pos->list; |
84 | 84 | ||
85 | BUG_ON(check++ > 10); | 85 | BUG_ON(check++ > dgl->num_replicas); |
86 | } | 86 | } |
87 | list_add(&req->list, last); | 87 | list_add(&req->list, last); |
88 | } | 88 | } |
@@ -92,16 +92,11 @@ static void release_cpu(struct dgl *dgl, struct dgl_group_req *greq) | |||
92 | int cpu = greq->cpu; | 92 | int cpu = greq->cpu; |
93 | struct task_struct *task = greq->task; | 93 | struct task_struct *task = greq->task; |
94 | 94 | ||
95 | TRACE_GREQ(greq, "no longer acquired on CPU %d\n", cpu); | 95 | TRACE_GREQ(greq, "No longer acquired on CPU %d\n", cpu); |
96 | BUG_ON(dgl->acquired[cpu] != greq); | 96 | BUG_ON(dgl->acquired[cpu] != greq); |
97 | 97 | ||
98 | dgl->acquired[cpu] = NULL; | 98 | dgl->acquired[cpu] = NULL; |
99 | --dgl->running; | 99 | --dgl->running; |
100 | |||
101 | /* if (task) { */ | ||
102 | /* sched_trace_server_switch_away(cpu_sid(dgl, cpu), 0, */ | ||
103 | /* -task->pid, get_rt_job(task)); */ | ||
104 | /* } */ | ||
105 | } | 100 | } |
106 | 101 | ||
107 | static void take_cpu(struct dgl *dgl, struct dgl_group_req *greq) | 102 | static void take_cpu(struct dgl *dgl, struct dgl_group_req *greq) |
@@ -114,11 +109,6 @@ static void take_cpu(struct dgl *dgl, struct dgl_group_req *greq) | |||
114 | 109 | ||
115 | dgl->acquired[cpu] = greq; | 110 | dgl->acquired[cpu] = greq; |
116 | ++dgl->running; | 111 | ++dgl->running; |
117 | |||
118 | /* if (task) { */ | ||
119 | /* sched_trace_server_switch_to(cpu_sid(dgl, cpu), 0, */ | ||
120 | /* -task->pid, get_rt_job(task)); */ | ||
121 | /* } */ | ||
122 | } | 112 | } |
123 | 113 | ||
124 | static int try_bump_lp(struct dgl *dgl, struct dgl_resource *resource, | 114 | static int try_bump_lp(struct dgl *dgl, struct dgl_resource *resource, |
@@ -176,7 +166,7 @@ static int try_bump_lp(struct dgl *dgl, struct dgl_resource *resource, | |||
176 | 166 | ||
177 | /* Now in waiting list */ | 167 | /* Now in waiting list */ |
178 | list_del_init(&acquired->list); | 168 | list_del_init(&acquired->list); |
179 | add_req(acquired, &resource->waiting); | 169 | add_req(dgl, acquired, &resource->waiting); |
180 | 170 | ||
181 | BUG_ON(!acquired->satisfied); | 171 | BUG_ON(!acquired->satisfied); |
182 | acquired->satisfied = 0; | 172 | acquired->satisfied = 0; |
@@ -204,7 +194,7 @@ static int try_bump_lp(struct dgl *dgl, struct dgl_resource *resource, | |||
204 | static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, | 194 | static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, |
205 | struct dgl_req *req) | 195 | struct dgl_req *req) |
206 | { | 196 | { |
207 | int word, bit, rid, room; | 197 | int word, bit, rid, room, bumped = 0; |
208 | unsigned long waiting; | 198 | unsigned long waiting; |
209 | struct dgl_group_req *greq; | 199 | struct dgl_group_req *greq; |
210 | 200 | ||
@@ -214,9 +204,9 @@ static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, | |||
214 | TRACE_GREQ(greq, "try acquire\n"); | 204 | TRACE_GREQ(greq, "try acquire\n"); |
215 | 205 | ||
216 | room = resource->free_replicas >= req->replicas; | 206 | room = resource->free_replicas >= req->replicas; |
217 | if (!room) room = try_bump_lp(dgl, resource, req); | 207 | bumped = room || try_bump_lp(dgl, resource, req); |
218 | 208 | ||
219 | if (!room) { | 209 | if (!(room || bumped)) { |
220 | TRACE_GREQ(greq, "cannot acquire %d replicas, %d free\n", | 210 | TRACE_GREQ(greq, "cannot acquire %d replicas, %d free\n", |
221 | req->replicas, resource->free_replicas); | 211 | req->replicas, resource->free_replicas); |
222 | return 0; | 212 | return 0; |
@@ -229,7 +219,7 @@ static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, | |||
229 | /* Move from waiting to acquired */ | 219 | /* Move from waiting to acquired */ |
230 | req->satisfied = 1; | 220 | req->satisfied = 1; |
231 | list_del_init(&req->list); | 221 | list_del_init(&req->list); |
232 | add_req(req, &resource->acquired); | 222 | add_req(dgl, req, &resource->acquired); |
233 | 223 | ||
234 | TRACE_GREQ(greq, "acquired %d replicas of rid %d\n", | 224 | TRACE_GREQ(greq, "acquired %d replicas of rid %d\n", |
235 | req->replicas, rid); | 225 | req->replicas, rid); |
@@ -253,6 +243,7 @@ static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, | |||
253 | dgl->cpu_acquired(greq); | 243 | dgl->cpu_acquired(greq); |
254 | } | 244 | } |
255 | 245 | ||
246 | |||
256 | return 1; | 247 | return 1; |
257 | } | 248 | } |
258 | 249 | ||
@@ -260,14 +251,12 @@ static void try_pull_hp(struct dgl *dgl, struct dgl_resource *resource) | |||
260 | { | 251 | { |
261 | int succ; | 252 | int succ; |
262 | struct dgl_req *waiting, *tmp; | 253 | struct dgl_req *waiting, *tmp; |
254 | struct list_head *wlist = &resource->waiting; | ||
263 | 255 | ||
264 | TRACE("Pulling into resource\n"); | 256 | TRACE("Pulling into resource\n"); |
265 | 257 | ||
266 | list_for_each_entry_safe(waiting, tmp, &resource->waiting, list) { | 258 | list_for_each_entry_safe(waiting, tmp, wlist, list) { |
267 | if (!resource->free_replicas) { | 259 | TRACE_GREQ(waiting->greq, "Trying to pull into resource\n"); |
268 | TRACE("Quitting with no more free replicas\n"); | ||
269 | break; | ||
270 | } | ||
271 | succ = try_acquire(dgl, resource, waiting); | 260 | succ = try_acquire(dgl, resource, waiting); |
272 | } | 261 | } |
273 | } | 262 | } |
@@ -408,14 +397,20 @@ void add_group_req(struct dgl *dgl, struct dgl_group_req *greq, int cpu) | |||
408 | req->list.prev, i, req->list.next); | 397 | req->list.prev, i, req->list.next); |
409 | list_del_init(&req->list); | 398 | list_del_init(&req->list); |
410 | } | 399 | } |
411 | BUG_ON(in_list(&req->list)); | ||
412 | 400 | ||
413 | succ = try_acquire(dgl, resource, req); | 401 | add_req(dgl, req, &resource->waiting); |
402 | |||
403 | if (!dgl->cpu_preempted) { | ||
404 | try_acquire(dgl, resource, req); | ||
405 | } else { | ||
406 | try_pull_hp(dgl, resource); | ||
407 | } | ||
408 | |||
409 | succ = (dgl->acquired[greq->cpu] == greq); | ||
414 | all_succ &= succ; | 410 | all_succ &= succ; |
415 | 411 | ||
416 | if (!succ) { | 412 | if (!succ) { |
417 | TRACE_GREQ(greq, "waiting on rid %d\n", i); | 413 | TRACE_GREQ(greq, "waiting on rid %d\n", i); |
418 | add_req(req, &resource->waiting); | ||
419 | } | 414 | } |
420 | } | 415 | } |
421 | 416 | ||