aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/dgl.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-10-12 15:00:54 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-10-12 15:00:54 -0400
commit30d31fd0e255257da8e823b8129d33e7fcfeb7cc (patch)
tree12e07b1cd51f78f9b266bb458bc9a6383915aed3 /litmus/dgl.c
parentf7297fa9c64dfd89bc8f92e2ef817295004ec093 (diff)
DGL makes all decisions using pull_hp when preemption is enabled.
Diffstat (limited to 'litmus/dgl.c')
-rw-r--r--litmus/dgl.c47
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 */
70static void add_req(struct dgl_req *req, struct list_head *list) 70static 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
107static void take_cpu(struct dgl *dgl, struct dgl_group_req *greq) 102static 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
124static int try_bump_lp(struct dgl *dgl, struct dgl_resource *resource, 114static 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,
204static unsigned long try_acquire(struct dgl *dgl, struct dgl_resource *resource, 194static 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