aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-07 01:41:46 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-07 01:41:46 -0400
commit3909278d5cb6c06907df1c542a60e09e2ded4e37 (patch)
treeb3eb071164548f81c021b2b0f076b2f19371933a /kernel
parenta75df6573126387eca0e10bd30ce99c11f6a61b1 (diff)
adaptive: introduce fixed point math
Introduces fixed point math header stuff and start of predictor support in sched_adaptive.c
Diffstat (limited to 'kernel')
-rw-r--r--kernel/litmus.c16
-rw-r--r--kernel/sched_adaptive.c12
2 files changed, 17 insertions, 11 deletions
diff --git a/kernel/litmus.c b/kernel/litmus.c
index d3d397ae9e..62f69eb8cc 100644
--- a/kernel/litmus.c
+++ b/kernel/litmus.c
@@ -9,6 +9,7 @@
9#include <linux/litmus.h> 9#include <linux/litmus.h>
10#include <linux/sched.h> 10#include <linux/sched.h>
11#include <linux/sched_plugin.h> 11#include <linux/sched_plugin.h>
12#include <linux/fpmath.h>
12 13
13#include <linux/trace.h> 14#include <linux/trace.h>
14 15
@@ -185,7 +186,8 @@ asmlinkage long sys_set_service_levels(pid_t pid,
185 struct task_struct *target; 186 struct task_struct *target;
186 service_level_t level, *klevels; 187 service_level_t level, *klevels;
187 int retval = -EINVAL, i; 188 int retval = -EINVAL, i;
188 unsigned long last_utility = 0; 189 fp_t last_value = FP(0);
190 fp_t last_weight = FP(0);
189 191
190 TRACE("Setting up service levels for process %d.\n", pid); 192 TRACE("Setting up service levels for process %d.\n", pid);
191 193
@@ -233,18 +235,18 @@ asmlinkage long sys_set_service_levels(pid_t pid,
233 kfree(klevels); 235 kfree(klevels);
234 goto out; 236 goto out;
235 } 237 }
236 if (level.exec_cost <= 0)
237 goto out;
238 if (level.period <= 0) 238 if (level.period <= 0)
239 goto out; 239 goto out;
240 if (level.period < level.exec_cost) 240 if (_leq(level.weight, last_weight))
241 goto out; 241 goto out;
242 if (level.utility <= last_utility) 242 if (_leq(level.value, last_value))
243 goto out; 243 goto out;
244 last_utility = level.utility; 244 last_value = level.value;
245 last_weight = level.weight;
245 klevels[i] = level; 246 klevels[i] = level;
246 } 247 }
247 target->rt_param.basic_params.exec_cost = klevels[0].exec_cost; 248 target->rt_param.basic_params.exec_cost = _round(_mul(klevels[0].weight,
249 FP(klevels[0].period)));
248 target->rt_param.basic_params.period = klevels[0].period; 250 target->rt_param.basic_params.period = klevels[0].period;
249 target->rt_param.service_level = klevels; 251 target->rt_param.service_level = klevels;
250 target->rt_param.no_service_levels = count; 252 target->rt_param.no_service_levels = count;
diff --git a/kernel/sched_adaptive.c b/kernel/sched_adaptive.c
index 16f249f03e..490e46501b 100644
--- a/kernel/sched_adaptive.c
+++ b/kernel/sched_adaptive.c
@@ -16,6 +16,9 @@
16#include <linux/edf_common.h> 16#include <linux/edf_common.h>
17#include <linux/sched_trace.h> 17#include <linux/sched_trace.h>
18 18
19#include <linux/fpmath.h>
20#include <linux/sched_adaptive.h>
21
19/* Overview of GSN-EDF operations. 22/* Overview of GSN-EDF operations.
20 * 23 *
21 * For a detailed explanation of GSN-EDF have a look at the FMLP paper. This 24 * For a detailed explanation of GSN-EDF have a look at the FMLP paper. This
@@ -116,14 +119,15 @@ static rt_domain_t adaptive;
116 119
117static void set_service_level(struct task_struct* t, unsigned int level) 120static void set_service_level(struct task_struct* t, unsigned int level)
118{ 121{
122 service_level_t *new;
119 BUG_ON(!t); 123 BUG_ON(!t);
120 BUG_ON(t->rt_param.no_service_levels <= level); 124 BUG_ON(t->rt_param.no_service_levels <= level);
121 125
122 t->rt_param.cur_service_level = level; 126 t->rt_param.cur_service_level = level;
123 t->rt_param.basic_params.period = 127 new = t->rt_param.service_level + level;
124 t->rt_param.service_level[level].period; 128 t->rt_param.basic_params.period = new->period;
125 t->rt_param.basic_params.exec_cost = 129 t->rt_param.basic_params.exec_cost = _round(_mul(new->weight,
126 t->rt_param.service_level[level].exec_cost; 130 FP(new->period)));
127 sched_trace_service_level_change(t); 131 sched_trace_service_level_change(t);
128 TRACE_TASK(t, "service level %u activated\n", level); 132 TRACE_TASK(t, "service level %u activated\n", level);
129} 133}