aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/sched_adaptive.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/sched_adaptive.h')
-rw-r--r--include/linux/sched_adaptive.h161
1 files changed, 0 insertions, 161 deletions
diff --git a/include/linux/sched_adaptive.h b/include/linux/sched_adaptive.h
deleted file mode 100644
index 81b803ad31..0000000000
--- a/include/linux/sched_adaptive.h
+++ /dev/null
@@ -1,161 +0,0 @@
1#ifndef __ADAPTIVE_H__
2#define __ADAPTIVE_H__
3
4/* All time dependent functions
5 * rely on this field.
6 * Update in the optimizer before use!
7 */
8extern jiffie_t opt_time;
9
10
11static inline fp_t ideal(fp_t weight, jiffie_t delta_t)
12{
13 return _mul(weight, FP(delta_t));
14}
15
16static noinline long ideal_exec_time(struct task_struct* t)
17{
18 jiffie_t delta = opt_time - get_last_release(t);
19 return _round(ideal(get_est_weight(t), delta));
20}
21
22/* this makes a whole bunch of linearity assumptions */
23static noinline fp_t weight_transfer(struct task_struct* t,
24 unsigned int from, unsigned int to,
25 fp_t act_weight)
26{
27 fp_t rel_from, rel_to, ret;
28 rel_from = get_sl(t, from).weight;
29 rel_to = get_sl(t, to).weight;
30 ret.val = (act_weight.val * rel_to.val) / rel_from.val;
31 /*_div(_mul(act_weight, rel_to), rel_from);*/
32 TRACE("weight_transfer(%ld, %ld, %ld) => %ld to=%u from=%u\n",
33 rel_from.val, rel_to.val, act_weight.val, ret.val, from, to);
34 return ret;
35}
36
37static noinline fp_t est_weight_at(struct task_struct* t, unsigned int level)
38{
39 if (t->rt_param.no_service_levels)
40 return weight_transfer(t, get_cur_sl(t), level,
41 get_est_weight(t));
42 else
43 return get_est_weight(t);
44
45}
46
47static noinline void update_estimate(predictor_state_t *state, fp_t actual_weight,
48 fp_t a, fp_t b)
49{
50 fp_t err, new;
51
52 TRACE("OLD ESTIMATE Weight" _FP_ " ActWt " _FP_ " A:" _FP_ ", B:" _FP_
53 "\n", fp2str(state->estimate), fp2str(actual_weight), fp2str(a),
54 fp2str(b));
55
56 err = _sub(actual_weight, state->estimate);
57 new = _add(_mul(a, err),
58 _mul(b, state->accumulated));
59 state->estimate = new;
60 state->accumulated = _add(state->accumulated, err);
61 TRACE("ERROR " _FP_ ", NEW " _FP_ ", ACC" _FP_ "\n", fp2str(err),
62 fp2str(new), fp2str(state->accumulated));
63}
64
65static noinline fp_t linear_metric(struct task_struct* t)
66{
67 fp_t v1, vmax, g1, gmax;
68 fp_t est_w;
69 unsigned int l = t->rt_param.no_service_levels;
70 unsigned int lcur;
71
72 if (l <= 1)
73 return FP(0);
74
75 lcur = get_cur_sl(t);;
76 est_w = get_est_weight(t);
77
78 TRACE_TASK(t, " linear_metric: lcur=%u l=%u est_w=" _FP_ "\n",
79 lcur, l, est_w);
80/* TRACE_TASK(t, " linear_metric: est_w.val=%ld\n", est_w.val); */
81
82
83 v1 = t->rt_param.service_level[0].value;
84 vmax = t->rt_param.service_level[l - 1].value;
85
86 TRACE_TASK(t, " linear_metric: v1=" _FP_ " vmax=" _FP_ "\n", v1, vmax);
87/* TRACE_TASK(t, " linear_metric: v1=%ld vmax=%ld\n", v1.val, vmax.val);*/
88
89
90 g1 = weight_transfer(t, lcur, 0, est_w);
91 gmax = weight_transfer(t, lcur, l - 1, est_w);
92
93 TRACE_TASK(t, " linear_metric: g1=" _FP_ " gmax=" _FP_ "\n", g1, gmax);
94/* TRACE_TASK(t, " linear_metric: g1=%ld gmax=%ld\n", g1, gmax); */
95
96
97 TRACE_BUG_ON(_eq(_sub(gmax, g1), FP(0)));
98 if (_eq(_sub(gmax, g1), FP(0)))
99 return FP(0);
100 return _div(_sub(vmax, v1),
101 _sub(gmax, g1));
102}
103
104static noinline unsigned long reweighted_period(fp_t ow, fp_t nw, unsigned long alloc,
105 jiffie_t deadline, jiffie_t release)
106{
107 fp_t dl;
108 dl = _mul(FP(deadline - release), ow);
109 dl = _sub(dl, FP(alloc));
110 dl = _div(dl, nw);
111 return _round(dl);
112}
113
114static noinline int is_under_allocated(struct task_struct* t)
115{
116 return ideal_exec_time(t) >= t->rt_param.times.exec_time;
117}
118
119static noinline jiffie_t dec_equal_point_delay(struct task_struct* t)
120{
121 if (_lt(FP(0), get_est_weight(t)))
122 /* when t was released plus time needed to equalize
123 * minus now
124 */
125 return get_last_release(t) +
126 _round(_div( FP(t->rt_param.times.exec_time),
127 get_est_weight(t))) -
128 opt_time;
129 else
130 /* if the weight is zero we just take the
131 * deadline
132 */
133 return t->rt_param.times.deadline;
134}
135
136static noinline jiffie_t inc_equal_point_delay(struct task_struct* t)
137{
138 if (_lt(FP(0), t->rt_param.opt_nw))
139 /* when t was released plus time needed to equalize
140 * minus now
141 */
142 return get_last_release(t) +
143 _round(_div( FP(t->rt_param.times.exec_time),
144 t->rt_param.opt_nw)) -
145 opt_time;
146 else
147 /* if the weight is zero we just take the
148 * deadline
149 */
150 return t->rt_param.times.deadline;
151}
152
153static noinline jiffie_t decrease_delay(struct task_struct* t)
154{
155 if (has_active_job(t) && !is_under_allocated(t))
156 return dec_equal_point_delay(t);
157 return 0;
158}
159
160
161#endif