diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-07 01:41:46 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-07 01:41:46 -0400 |
commit | 3909278d5cb6c06907df1c542a60e09e2ded4e37 (patch) | |
tree | b3eb071164548f81c021b2b0f076b2f19371933a /kernel | |
parent | a75df6573126387eca0e10bd30ce99c11f6a61b1 (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.c | 16 | ||||
-rw-r--r-- | kernel/sched_adaptive.c | 12 |
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 | ||
117 | static void set_service_level(struct task_struct* t, unsigned int level) | 120 | static 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 | } |