2 * Real-Time Scheduling Class (mapped to the SCHED_FIFO and SCHED_RR
7 * Update the current task's runtime statistics. Skip current tasks that
8 * are not in our scheduling class.
10 static void update_curr_rt(struct rq
*rq
)
12 struct task_struct
*curr
= rq
->curr
;
15 if (!task_has_rt_policy(curr
))
18 delta_exec
= rq
->clock
- curr
->se
.exec_start
;
19 if (unlikely((s64
)delta_exec
< 0))
22 schedstat_set(curr
->se
.exec_max
, max(curr
->se
.exec_max
, delta_exec
));
24 curr
->se
.sum_exec_runtime
+= delta_exec
;
25 curr
->se
.exec_start
= rq
->clock
;
26 cpuacct_charge(curr
, delta_exec
);
29 static void enqueue_task_rt(struct rq
*rq
, struct task_struct
*p
, int wakeup
)
31 struct rt_prio_array
*array
= &rq
->rt
.active
;
33 list_add_tail(&p
->run_list
, array
->queue
+ p
->prio
);
34 __set_bit(p
->prio
, array
->bitmap
);
38 * Adding/removing a task to/from a priority array:
40 static void dequeue_task_rt(struct rq
*rq
, struct task_struct
*p
, int sleep
)
42 struct rt_prio_array
*array
= &rq
->rt
.active
;
46 list_del(&p
->run_list
);
47 if (list_empty(array
->queue
+ p
->prio
))
48 __clear_bit(p
->prio
, array
->bitmap
);
52 * Put task to the end of the run list without the overhead of dequeue
53 * followed by enqueue.
55 static void requeue_task_rt(struct rq
*rq
, struct task_struct
*p
)
57 struct rt_prio_array
*array
= &rq
->rt
.active
;
59 list_move_tail(&p
->run_list
, array
->queue
+ p
->prio
);
63 yield_task_rt(struct rq
*rq
)
65 requeue_task_rt(rq
, rq
->curr
);
69 * Preempt the current task with a newly woken task if needed:
71 static void check_preempt_curr_rt(struct rq
*rq
, struct task_struct
*p
)
73 if (p
->prio
< rq
->curr
->prio
)
74 resched_task(rq
->curr
);
77 static struct task_struct
*pick_next_task_rt(struct rq
*rq
)
79 struct rt_prio_array
*array
= &rq
->rt
.active
;
80 struct task_struct
*next
;
81 struct list_head
*queue
;
84 idx
= sched_find_first_bit(array
->bitmap
);
85 if (idx
>= MAX_RT_PRIO
)
88 queue
= array
->queue
+ idx
;
89 next
= list_entry(queue
->next
, struct task_struct
, run_list
);
91 next
->se
.exec_start
= rq
->clock
;
96 static void put_prev_task_rt(struct rq
*rq
, struct task_struct
*p
)
104 * Load-balancing iterator. Note: while the runqueue stays locked
105 * during the whole iteration, the current task might be
106 * dequeued so the iterator has to be dequeue-safe. Here we
107 * achieve that by always pre-iterating before returning
110 static struct task_struct
*load_balance_start_rt(void *arg
)
113 struct rt_prio_array
*array
= &rq
->rt
.active
;
114 struct list_head
*head
, *curr
;
115 struct task_struct
*p
;
118 idx
= sched_find_first_bit(array
->bitmap
);
119 if (idx
>= MAX_RT_PRIO
)
122 head
= array
->queue
+ idx
;
125 p
= list_entry(curr
, struct task_struct
, run_list
);
129 rq
->rt
.rt_load_balance_idx
= idx
;
130 rq
->rt
.rt_load_balance_head
= head
;
131 rq
->rt
.rt_load_balance_curr
= curr
;
136 static struct task_struct
*load_balance_next_rt(void *arg
)
139 struct rt_prio_array
*array
= &rq
->rt
.active
;
140 struct list_head
*head
, *curr
;
141 struct task_struct
*p
;
144 idx
= rq
->rt
.rt_load_balance_idx
;
145 head
= rq
->rt
.rt_load_balance_head
;
146 curr
= rq
->rt
.rt_load_balance_curr
;
149 * If we arrived back to the head again then
150 * iterate to the next queue (if any):
152 if (unlikely(head
== curr
)) {
153 int next_idx
= find_next_bit(array
->bitmap
, MAX_RT_PRIO
, idx
+1);
155 if (next_idx
>= MAX_RT_PRIO
)
159 head
= array
->queue
+ idx
;
162 rq
->rt
.rt_load_balance_idx
= idx
;
163 rq
->rt
.rt_load_balance_head
= head
;
166 p
= list_entry(curr
, struct task_struct
, run_list
);
170 rq
->rt
.rt_load_balance_curr
= curr
;
176 load_balance_rt(struct rq
*this_rq
, int this_cpu
, struct rq
*busiest
,
177 unsigned long max_load_move
,
178 struct sched_domain
*sd
, enum cpu_idle_type idle
,
179 int *all_pinned
, int *this_best_prio
)
181 struct rq_iterator rt_rq_iterator
;
183 rt_rq_iterator
.start
= load_balance_start_rt
;
184 rt_rq_iterator
.next
= load_balance_next_rt
;
185 /* pass 'busiest' rq argument into
186 * load_balance_[start|next]_rt iterators
188 rt_rq_iterator
.arg
= busiest
;
190 return balance_tasks(this_rq
, this_cpu
, busiest
, max_load_move
, sd
,
191 idle
, all_pinned
, this_best_prio
, &rt_rq_iterator
);
195 move_one_task_rt(struct rq
*this_rq
, int this_cpu
, struct rq
*busiest
,
196 struct sched_domain
*sd
, enum cpu_idle_type idle
)
198 struct rq_iterator rt_rq_iterator
;
200 rt_rq_iterator
.start
= load_balance_start_rt
;
201 rt_rq_iterator
.next
= load_balance_next_rt
;
202 rt_rq_iterator
.arg
= busiest
;
204 return iter_move_one_task(this_rq
, this_cpu
, busiest
, sd
, idle
,
209 static void task_tick_rt(struct rq
*rq
, struct task_struct
*p
)
212 * RR tasks need a special form of timeslice management.
213 * FIFO tasks have no timeslices.
215 if (p
->policy
!= SCHED_RR
)
221 p
->time_slice
= DEF_TIMESLICE
;
224 * Requeue to the end of queue if we are not the only element
227 if (p
->run_list
.prev
!= p
->run_list
.next
) {
228 requeue_task_rt(rq
, p
);
229 set_tsk_need_resched(p
);
233 static void set_curr_task_rt(struct rq
*rq
)
235 struct task_struct
*p
= rq
->curr
;
237 p
->se
.exec_start
= rq
->clock
;
240 const struct sched_class rt_sched_class
= {
241 .next
= &fair_sched_class
,
242 .enqueue_task
= enqueue_task_rt
,
243 .dequeue_task
= dequeue_task_rt
,
244 .yield_task
= yield_task_rt
,
246 .check_preempt_curr
= check_preempt_curr_rt
,
248 .pick_next_task
= pick_next_task_rt
,
249 .put_prev_task
= put_prev_task_rt
,
252 .load_balance
= load_balance_rt
,
253 .move_one_task
= move_one_task_rt
,
256 .set_curr_task
= set_curr_task_rt
,
257 .task_tick
= task_tick_rt
,