1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "sched.h"
19#include "pelt.h"
20
21struct dl_bandwidth def_dl_bandwidth;
22
23static inline struct task_struct *dl_task_of(struct sched_dl_entity *dl_se)
24{
25 return container_of(dl_se, struct task_struct, dl);
26}
27
28static inline struct rq *rq_of_dl_rq(struct dl_rq *dl_rq)
29{
30 return container_of(dl_rq, struct rq, dl);
31}
32
33static inline struct dl_rq *dl_rq_of_se(struct sched_dl_entity *dl_se)
34{
35 struct task_struct *p = dl_task_of(dl_se);
36 struct rq *rq = task_rq(p);
37
38 return &rq->dl;
39}
40
41static inline int on_dl_rq(struct sched_dl_entity *dl_se)
42{
43 return !RB_EMPTY_NODE(&dl_se->rb_node);
44}
45
46#ifdef CONFIG_SMP
47static inline struct dl_bw *dl_bw_of(int i)
48{
49 RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held(),
50 "sched RCU must be held");
51 return &cpu_rq(i)->rd->dl_bw;
52}
53
54static inline int dl_bw_cpus(int i)
55{
56 struct root_domain *rd = cpu_rq(i)->rd;
57 int cpus = 0;
58
59 RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held(),
60 "sched RCU must be held");
61 for_each_cpu_and(i, rd->span, cpu_active_mask)
62 cpus++;
63
64 return cpus;
65}
66#else
67static inline struct dl_bw *dl_bw_of(int i)
68{
69 return &cpu_rq(i)->dl.dl_bw;
70}
71
72static inline int dl_bw_cpus(int i)
73{
74 return 1;
75}
76#endif
77
78static inline
79void __add_running_bw(u64 dl_bw, struct dl_rq *dl_rq)
80{
81 u64 old = dl_rq->running_bw;
82
83 lockdep_assert_held(&(rq_of_dl_rq(dl_rq))->lock);
84 dl_rq->running_bw += dl_bw;
85 SCHED_WARN_ON(dl_rq->running_bw < old);
86 SCHED_WARN_ON(dl_rq->running_bw > dl_rq->this_bw);
87
88 cpufreq_update_util(rq_of_dl_rq(dl_rq), 0);
89}
90
91static inline
92void __sub_running_bw(u64 dl_bw, struct dl_rq *dl_rq)
93{
94 u64 old = dl_rq->running_bw;
95
96 lockdep_assert_held(&(rq_of_dl_rq(dl_rq))->lock);
97 dl_rq->running_bw -= dl_bw;
98 SCHED_WARN_ON(dl_rq->running_bw > old);
99 if (dl_rq->running_bw > old)
100 dl_rq->running_bw = 0;
101
102 cpufreq_update_util(rq_of_dl_rq(dl_rq), 0);
103}
104
105static inline
106void __add_rq_bw(u64 dl_bw, struct dl_rq *dl_rq)
107{
108 u64 old = dl_rq->this_bw;
109
110 lockdep_assert_held(&(rq_of_dl_rq(dl_rq))->lock);
111 dl_rq->this_bw += dl_bw;
112 SCHED_WARN_ON(dl_rq->this_bw < old);
113}
114
115static inline
116void __sub_rq_bw(u64 dl_bw, struct dl_rq *dl_rq)
117{
118 u64 old = dl_rq->this_bw;
119
120 lockdep_assert_held(&(rq_of_dl_rq(dl_rq))->lock);
121 dl_rq->this_bw -= dl_bw;
122 SCHED_WARN_ON(dl_rq->this_bw > old);
123 if (dl_rq->this_bw > old)
124 dl_rq->this_bw = 0;
125 SCHED_WARN_ON(dl_rq->running_bw > dl_rq->this_bw);
126}
127
128static inline
129void add_rq_bw(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
130{
131 if (!dl_entity_is_special(dl_se))
132 __add_rq_bw(dl_se->dl_bw, dl_rq);
133}
134
135static inline
136void sub_rq_bw(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
137{
138 if (!dl_entity_is_special(dl_se))
139 __sub_rq_bw(dl_se->dl_bw, dl_rq);
140}
141
142static inline
143void add_running_bw(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
144{
145 if (!dl_entity_is_special(dl_se))
146 __add_running_bw(dl_se->dl_bw, dl_rq);
147}
148
149static inline
150void sub_running_bw(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
151{
152 if (!dl_entity_is_special(dl_se))
153 __sub_running_bw(dl_se->dl_bw, dl_rq);
154}
155
156void dl_change_utilization(struct task_struct *p, u64 new_bw)
157{
158 struct rq *rq;
159
160 BUG_ON(p->dl.flags & SCHED_FLAG_SUGOV);
161
162 if (task_on_rq_queued(p))
163 return;
164
165 rq = task_rq(p);
166 if (p->dl.dl_non_contending) {
167 sub_running_bw(&p->dl, &rq->dl);
168 p->dl.dl_non_contending = 0;
169
170
171
172
173
174
175
176 if (hrtimer_try_to_cancel(&p->dl.inactive_timer) == 1)
177 put_task_struct(p);
178 }
179 __sub_rq_bw(p->dl.dl_bw, &rq->dl);
180 __add_rq_bw(new_bw, &rq->dl);
181}
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237static void task_non_contending(struct task_struct *p)
238{
239 struct sched_dl_entity *dl_se = &p->dl;
240 struct hrtimer *timer = &dl_se->inactive_timer;
241 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
242 struct rq *rq = rq_of_dl_rq(dl_rq);
243 s64 zerolag_time;
244
245
246
247
248
249 if (dl_se->dl_runtime == 0)
250 return;
251
252 if (dl_entity_is_special(dl_se))
253 return;
254
255 WARN_ON(hrtimer_active(&dl_se->inactive_timer));
256 WARN_ON(dl_se->dl_non_contending);
257
258 zerolag_time = dl_se->deadline -
259 div64_long((dl_se->runtime * dl_se->dl_period),
260 dl_se->dl_runtime);
261
262
263
264
265
266 zerolag_time -= rq_clock(rq);
267
268
269
270
271
272 if (zerolag_time < 0) {
273 if (dl_task(p))
274 sub_running_bw(dl_se, dl_rq);
275 if (!dl_task(p) || p->state == TASK_DEAD) {
276 struct dl_bw *dl_b = dl_bw_of(task_cpu(p));
277
278 if (p->state == TASK_DEAD)
279 sub_rq_bw(&p->dl, &rq->dl);
280 raw_spin_lock(&dl_b->lock);
281 __dl_sub(dl_b, p->dl.dl_bw, dl_bw_cpus(task_cpu(p)));
282 __dl_clear_params(p);
283 raw_spin_unlock(&dl_b->lock);
284 }
285
286 return;
287 }
288
289 dl_se->dl_non_contending = 1;
290 get_task_struct(p);
291 hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL);
292}
293
294static void task_contending(struct sched_dl_entity *dl_se, int flags)
295{
296 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
297
298
299
300
301
302 if (dl_se->dl_runtime == 0)
303 return;
304
305 if (flags & ENQUEUE_MIGRATED)
306 add_rq_bw(dl_se, dl_rq);
307
308 if (dl_se->dl_non_contending) {
309 dl_se->dl_non_contending = 0;
310
311
312
313
314
315
316
317 if (hrtimer_try_to_cancel(&dl_se->inactive_timer) == 1)
318 put_task_struct(dl_task_of(dl_se));
319 } else {
320
321
322
323
324
325
326
327 add_running_bw(dl_se, dl_rq);
328 }
329}
330
331static inline int is_leftmost(struct task_struct *p, struct dl_rq *dl_rq)
332{
333 struct sched_dl_entity *dl_se = &p->dl;
334
335 return dl_rq->root.rb_leftmost == &dl_se->rb_node;
336}
337
338void init_dl_bandwidth(struct dl_bandwidth *dl_b, u64 period, u64 runtime)
339{
340 raw_spin_lock_init(&dl_b->dl_runtime_lock);
341 dl_b->dl_period = period;
342 dl_b->dl_runtime = runtime;
343}
344
345void init_dl_bw(struct dl_bw *dl_b)
346{
347 raw_spin_lock_init(&dl_b->lock);
348 raw_spin_lock(&def_dl_bandwidth.dl_runtime_lock);
349 if (global_rt_runtime() == RUNTIME_INF)
350 dl_b->bw = -1;
351 else
352 dl_b->bw = to_ratio(global_rt_period(), global_rt_runtime());
353 raw_spin_unlock(&def_dl_bandwidth.dl_runtime_lock);
354 dl_b->total_bw = 0;
355}
356
357void init_dl_rq(struct dl_rq *dl_rq)
358{
359 dl_rq->root = RB_ROOT_CACHED;
360
361#ifdef CONFIG_SMP
362
363 dl_rq->earliest_dl.curr = dl_rq->earliest_dl.next = 0;
364
365 dl_rq->dl_nr_migratory = 0;
366 dl_rq->overloaded = 0;
367 dl_rq->pushable_dl_tasks_root = RB_ROOT_CACHED;
368#else
369 init_dl_bw(&dl_rq->dl_bw);
370#endif
371
372 dl_rq->running_bw = 0;
373 dl_rq->this_bw = 0;
374 init_dl_rq_bw_ratio(dl_rq);
375}
376
377#ifdef CONFIG_SMP
378
379static inline int dl_overloaded(struct rq *rq)
380{
381 return atomic_read(&rq->rd->dlo_count);
382}
383
384static inline void dl_set_overload(struct rq *rq)
385{
386 if (!rq->online)
387 return;
388
389 cpumask_set_cpu(rq->cpu, rq->rd->dlo_mask);
390
391
392
393
394
395
396 smp_wmb();
397 atomic_inc(&rq->rd->dlo_count);
398}
399
400static inline void dl_clear_overload(struct rq *rq)
401{
402 if (!rq->online)
403 return;
404
405 atomic_dec(&rq->rd->dlo_count);
406 cpumask_clear_cpu(rq->cpu, rq->rd->dlo_mask);
407}
408
409static void update_dl_migration(struct dl_rq *dl_rq)
410{
411 if (dl_rq->dl_nr_migratory && dl_rq->dl_nr_running > 1) {
412 if (!dl_rq->overloaded) {
413 dl_set_overload(rq_of_dl_rq(dl_rq));
414 dl_rq->overloaded = 1;
415 }
416 } else if (dl_rq->overloaded) {
417 dl_clear_overload(rq_of_dl_rq(dl_rq));
418 dl_rq->overloaded = 0;
419 }
420}
421
422static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
423{
424 struct task_struct *p = dl_task_of(dl_se);
425
426 if (p->nr_cpus_allowed > 1)
427 dl_rq->dl_nr_migratory++;
428
429 update_dl_migration(dl_rq);
430}
431
432static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
433{
434 struct task_struct *p = dl_task_of(dl_se);
435
436 if (p->nr_cpus_allowed > 1)
437 dl_rq->dl_nr_migratory--;
438
439 update_dl_migration(dl_rq);
440}
441
442
443
444
445
446static void enqueue_pushable_dl_task(struct rq *rq, struct task_struct *p)
447{
448 struct dl_rq *dl_rq = &rq->dl;
449 struct rb_node **link = &dl_rq->pushable_dl_tasks_root.rb_root.rb_node;
450 struct rb_node *parent = NULL;
451 struct task_struct *entry;
452 bool leftmost = true;
453
454 BUG_ON(!RB_EMPTY_NODE(&p->pushable_dl_tasks));
455
456 while (*link) {
457 parent = *link;
458 entry = rb_entry(parent, struct task_struct,
459 pushable_dl_tasks);
460 if (dl_entity_preempt(&p->dl, &entry->dl))
461 link = &parent->rb_left;
462 else {
463 link = &parent->rb_right;
464 leftmost = false;
465 }
466 }
467
468 if (leftmost)
469 dl_rq->earliest_dl.next = p->dl.deadline;
470
471 rb_link_node(&p->pushable_dl_tasks, parent, link);
472 rb_insert_color_cached(&p->pushable_dl_tasks,
473 &dl_rq->pushable_dl_tasks_root, leftmost);
474}
475
476static void dequeue_pushable_dl_task(struct rq *rq, struct task_struct *p)
477{
478 struct dl_rq *dl_rq = &rq->dl;
479
480 if (RB_EMPTY_NODE(&p->pushable_dl_tasks))
481 return;
482
483 if (dl_rq->pushable_dl_tasks_root.rb_leftmost == &p->pushable_dl_tasks) {
484 struct rb_node *next_node;
485
486 next_node = rb_next(&p->pushable_dl_tasks);
487 if (next_node) {
488 dl_rq->earliest_dl.next = rb_entry(next_node,
489 struct task_struct, pushable_dl_tasks)->dl.deadline;
490 }
491 }
492
493 rb_erase_cached(&p->pushable_dl_tasks, &dl_rq->pushable_dl_tasks_root);
494 RB_CLEAR_NODE(&p->pushable_dl_tasks);
495}
496
497static inline int has_pushable_dl_tasks(struct rq *rq)
498{
499 return !RB_EMPTY_ROOT(&rq->dl.pushable_dl_tasks_root.rb_root);
500}
501
502static int push_dl_task(struct rq *rq);
503
504static inline bool need_pull_dl_task(struct rq *rq, struct task_struct *prev)
505{
506 return dl_task(prev);
507}
508
509static DEFINE_PER_CPU(struct callback_head, dl_push_head);
510static DEFINE_PER_CPU(struct callback_head, dl_pull_head);
511
512static void push_dl_tasks(struct rq *);
513static void pull_dl_task(struct rq *);
514
515static inline void deadline_queue_push_tasks(struct rq *rq)
516{
517 if (!has_pushable_dl_tasks(rq))
518 return;
519
520 queue_balance_callback(rq, &per_cpu(dl_push_head, rq->cpu), push_dl_tasks);
521}
522
523static inline void deadline_queue_pull_task(struct rq *rq)
524{
525 queue_balance_callback(rq, &per_cpu(dl_pull_head, rq->cpu), pull_dl_task);
526}
527
528static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq);
529
530static struct rq *dl_task_offline_migration(struct rq *rq, struct task_struct *p)
531{
532 struct rq *later_rq = NULL;
533
534 later_rq = find_lock_later_rq(p, rq);
535 if (!later_rq) {
536 int cpu;
537
538
539
540
541
542 cpu = cpumask_any_and(cpu_active_mask, &p->cpus_allowed);
543 if (cpu >= nr_cpu_ids) {
544
545
546
547
548 BUG_ON(dl_bandwidth_enabled());
549
550
551
552
553
554
555 cpu = cpumask_any(cpu_active_mask);
556 }
557 later_rq = cpu_rq(cpu);
558 double_lock_balance(rq, later_rq);
559 }
560
561 set_task_cpu(p, later_rq->cpu);
562 double_unlock_balance(later_rq, rq);
563
564 return later_rq;
565}
566
567#else
568
569static inline
570void enqueue_pushable_dl_task(struct rq *rq, struct task_struct *p)
571{
572}
573
574static inline
575void dequeue_pushable_dl_task(struct rq *rq, struct task_struct *p)
576{
577}
578
579static inline
580void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
581{
582}
583
584static inline
585void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
586{
587}
588
589static inline bool need_pull_dl_task(struct rq *rq, struct task_struct *prev)
590{
591 return false;
592}
593
594static inline void pull_dl_task(struct rq *rq)
595{
596}
597
598static inline void deadline_queue_push_tasks(struct rq *rq)
599{
600}
601
602static inline void deadline_queue_pull_task(struct rq *rq)
603{
604}
605#endif
606
607static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags);
608static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags);
609static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p, int flags);
610
611
612
613
614
615
616
617
618
619
620
621
622
623static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
624{
625 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
626 struct rq *rq = rq_of_dl_rq(dl_rq);
627
628 WARN_ON(dl_se->dl_boosted);
629 WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
630
631
632
633
634
635
636 if (dl_se->dl_throttled)
637 return;
638
639
640
641
642
643
644 dl_se->deadline = rq_clock(rq) + dl_se->dl_deadline;
645 dl_se->runtime = dl_se->dl_runtime;
646}
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666static void replenish_dl_entity(struct sched_dl_entity *dl_se,
667 struct sched_dl_entity *pi_se)
668{
669 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
670 struct rq *rq = rq_of_dl_rq(dl_rq);
671
672 BUG_ON(pi_se->dl_runtime <= 0);
673
674
675
676
677
678 if (dl_se->dl_deadline == 0) {
679 dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
680 dl_se->runtime = pi_se->dl_runtime;
681 }
682
683 if (dl_se->dl_yielded && dl_se->runtime > 0)
684 dl_se->runtime = 0;
685
686
687
688
689
690
691
692 while (dl_se->runtime <= 0) {
693 dl_se->deadline += pi_se->dl_period;
694 dl_se->runtime += pi_se->dl_runtime;
695 }
696
697
698
699
700
701
702
703
704
705
706 if (dl_time_before(dl_se->deadline, rq_clock(rq))) {
707 printk_deferred_once("sched: DL replenish lagged too much\n");
708 dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
709 dl_se->runtime = pi_se->dl_runtime;
710 }
711
712 if (dl_se->dl_yielded)
713 dl_se->dl_yielded = 0;
714 if (dl_se->dl_throttled)
715 dl_se->dl_throttled = 0;
716}
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742static bool dl_entity_overflow(struct sched_dl_entity *dl_se,
743 struct sched_dl_entity *pi_se, u64 t)
744{
745 u64 left, right;
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765 left = (pi_se->dl_deadline >> DL_SCALE) * (dl_se->runtime >> DL_SCALE);
766 right = ((dl_se->deadline - t) >> DL_SCALE) *
767 (pi_se->dl_runtime >> DL_SCALE);
768
769 return dl_time_before(right, left);
770}
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790static void
791update_dl_revised_wakeup(struct sched_dl_entity *dl_se, struct rq *rq)
792{
793 u64 laxity = dl_se->deadline - rq_clock(rq);
794
795
796
797
798
799
800
801 WARN_ON(dl_time_before(dl_se->deadline, rq_clock(rq)));
802
803 dl_se->runtime = (dl_se->dl_density * laxity) >> BW_SHIFT;
804}
805
806
807
808
809
810
811
812
813
814
815
816
817static inline bool dl_is_implicit(struct sched_dl_entity *dl_se)
818{
819 return dl_se->dl_deadline == dl_se->dl_period;
820}
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852static void update_dl_entity(struct sched_dl_entity *dl_se,
853 struct sched_dl_entity *pi_se)
854{
855 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
856 struct rq *rq = rq_of_dl_rq(dl_rq);
857
858 if (dl_time_before(dl_se->deadline, rq_clock(rq)) ||
859 dl_entity_overflow(dl_se, pi_se, rq_clock(rq))) {
860
861 if (unlikely(!dl_is_implicit(dl_se) &&
862 !dl_time_before(dl_se->deadline, rq_clock(rq)) &&
863 !dl_se->dl_boosted)){
864 update_dl_revised_wakeup(dl_se, rq);
865 return;
866 }
867
868 dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
869 dl_se->runtime = pi_se->dl_runtime;
870 }
871}
872
873static inline u64 dl_next_period(struct sched_dl_entity *dl_se)
874{
875 return dl_se->deadline - dl_se->dl_deadline + dl_se->dl_period;
876}
877
878
879
880
881
882
883
884
885
886
887
888static int start_dl_timer(struct task_struct *p)
889{
890 struct sched_dl_entity *dl_se = &p->dl;
891 struct hrtimer *timer = &dl_se->dl_timer;
892 struct rq *rq = task_rq(p);
893 ktime_t now, act;
894 s64 delta;
895
896 lockdep_assert_held(&rq->lock);
897
898
899
900
901
902
903 act = ns_to_ktime(dl_next_period(dl_se));
904 now = hrtimer_cb_get_time(timer);
905 delta = ktime_to_ns(now) - rq_clock(rq);
906 act = ktime_add_ns(act, delta);
907
908
909
910
911
912
913 if (ktime_us_delta(act, now) < 0)
914 return 0;
915
916
917
918
919
920
921
922
923
924
925 if (!hrtimer_is_queued(timer)) {
926 get_task_struct(p);
927 hrtimer_start(timer, act, HRTIMER_MODE_ABS);
928 }
929
930 return 1;
931}
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946static enum hrtimer_restart dl_task_timer(struct hrtimer *timer)
947{
948 struct sched_dl_entity *dl_se = container_of(timer,
949 struct sched_dl_entity,
950 dl_timer);
951 struct task_struct *p = dl_task_of(dl_se);
952 struct rq_flags rf;
953 struct rq *rq;
954
955 rq = task_rq_lock(p, &rf);
956
957
958
959
960
961 if (!dl_task(p))
962 goto unlock;
963
964
965
966
967
968 if (dl_se->dl_boosted)
969 goto unlock;
970
971
972
973
974
975 if (!dl_se->dl_throttled)
976 goto unlock;
977
978 sched_clock_tick();
979 update_rq_clock(rq);
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995 if (!task_on_rq_queued(p)) {
996 replenish_dl_entity(dl_se, dl_se);
997 goto unlock;
998 }
999
1000#ifdef CONFIG_SMP
1001 if (unlikely(!rq->online)) {
1002
1003
1004
1005
1006 lockdep_unpin_lock(&rq->lock, rf.cookie);
1007 rq = dl_task_offline_migration(rq, p);
1008 rf.cookie = lockdep_pin_lock(&rq->lock);
1009 update_rq_clock(rq);
1010
1011
1012
1013
1014
1015
1016 }
1017#endif
1018
1019 enqueue_task_dl(rq, p, ENQUEUE_REPLENISH);
1020 if (dl_task(rq->curr))
1021 check_preempt_curr_dl(rq, p, 0);
1022 else
1023 resched_curr(rq);
1024
1025#ifdef CONFIG_SMP
1026
1027
1028
1029
1030 if (has_pushable_dl_tasks(rq)) {
1031
1032
1033
1034
1035 rq_unpin_lock(rq, &rf);
1036 push_dl_task(rq);
1037 rq_repin_lock(rq, &rf);
1038 }
1039#endif
1040
1041unlock:
1042 task_rq_unlock(rq, p, &rf);
1043
1044
1045
1046
1047
1048 put_task_struct(p);
1049
1050 return HRTIMER_NORESTART;
1051}
1052
1053void init_dl_task_timer(struct sched_dl_entity *dl_se)
1054{
1055 struct hrtimer *timer = &dl_se->dl_timer;
1056
1057 hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1058 timer->function = dl_task_timer;
1059}
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079static inline void dl_check_constrained_dl(struct sched_dl_entity *dl_se)
1080{
1081 struct task_struct *p = dl_task_of(dl_se);
1082 struct rq *rq = rq_of_dl_rq(dl_rq_of_se(dl_se));
1083
1084 if (dl_time_before(dl_se->deadline, rq_clock(rq)) &&
1085 dl_time_before(rq_clock(rq), dl_next_period(dl_se))) {
1086 if (unlikely(dl_se->dl_boosted || !start_dl_timer(p)))
1087 return;
1088 dl_se->dl_throttled = 1;
1089 if (dl_se->runtime > 0)
1090 dl_se->runtime = 0;
1091 }
1092}
1093
1094static
1095int dl_runtime_exceeded(struct sched_dl_entity *dl_se)
1096{
1097 return (dl_se->runtime <= 0);
1098}
1099
1100extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq);
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121static u64 grub_reclaim(u64 delta, struct rq *rq, struct sched_dl_entity *dl_se)
1122{
1123 u64 u_inact = rq->dl.this_bw - rq->dl.running_bw;
1124 u64 u_act;
1125 u64 u_act_min = (dl_se->dl_bw * rq->dl.bw_ratio) >> RATIO_SHIFT;
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135 if (u_inact + rq->dl.extra_bw > BW_UNIT - u_act_min)
1136 u_act = u_act_min;
1137 else
1138 u_act = BW_UNIT - u_inact - rq->dl.extra_bw;
1139
1140 return (delta * u_act) >> BW_SHIFT;
1141}
1142
1143
1144
1145
1146
1147static void update_curr_dl(struct rq *rq)
1148{
1149 struct task_struct *curr = rq->curr;
1150 struct sched_dl_entity *dl_se = &curr->dl;
1151 u64 delta_exec, scaled_delta_exec;
1152 int cpu = cpu_of(rq);
1153 u64 now;
1154
1155 if (!dl_task(curr) || !on_dl_rq(dl_se))
1156 return;
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166 now = rq_clock_task(rq);
1167 delta_exec = now - curr->se.exec_start;
1168 if (unlikely((s64)delta_exec <= 0)) {
1169 if (unlikely(dl_se->dl_yielded))
1170 goto throttle;
1171 return;
1172 }
1173
1174 schedstat_set(curr->se.statistics.exec_max,
1175 max(curr->se.statistics.exec_max, delta_exec));
1176
1177 curr->se.sum_exec_runtime += delta_exec;
1178 account_group_exec_runtime(curr, delta_exec);
1179
1180 curr->se.exec_start = now;
1181 cgroup_account_cputime(curr, delta_exec);
1182
1183 if (dl_entity_is_special(dl_se))
1184 return;
1185
1186
1187
1188
1189
1190
1191
1192
1193 if (unlikely(dl_se->flags & SCHED_FLAG_RECLAIM)) {
1194 scaled_delta_exec = grub_reclaim(delta_exec,
1195 rq,
1196 &curr->dl);
1197 } else {
1198 unsigned long scale_freq = arch_scale_freq_capacity(cpu);
1199 unsigned long scale_cpu = arch_scale_cpu_capacity(NULL, cpu);
1200
1201 scaled_delta_exec = cap_scale(delta_exec, scale_freq);
1202 scaled_delta_exec = cap_scale(scaled_delta_exec, scale_cpu);
1203 }
1204
1205 dl_se->runtime -= scaled_delta_exec;
1206
1207throttle:
1208 if (dl_runtime_exceeded(dl_se) || dl_se->dl_yielded) {
1209 dl_se->dl_throttled = 1;
1210
1211
1212 if (dl_runtime_exceeded(dl_se) &&
1213 (dl_se->flags & SCHED_FLAG_DL_OVERRUN))
1214 dl_se->dl_overrun = 1;
1215
1216 __dequeue_task_dl(rq, curr, 0);
1217 if (unlikely(dl_se->dl_boosted || !start_dl_timer(curr)))
1218 enqueue_task_dl(rq, curr, ENQUEUE_REPLENISH);
1219
1220 if (!is_leftmost(curr, &rq->dl))
1221 resched_curr(rq);
1222 }
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235 if (rt_bandwidth_enabled()) {
1236 struct rt_rq *rt_rq = &rq->rt;
1237
1238 raw_spin_lock(&rt_rq->rt_runtime_lock);
1239
1240
1241
1242
1243
1244 if (sched_rt_bandwidth_account(rt_rq))
1245 rt_rq->rt_time += delta_exec;
1246 raw_spin_unlock(&rt_rq->rt_runtime_lock);
1247 }
1248}
1249
1250static enum hrtimer_restart inactive_task_timer(struct hrtimer *timer)
1251{
1252 struct sched_dl_entity *dl_se = container_of(timer,
1253 struct sched_dl_entity,
1254 inactive_timer);
1255 struct task_struct *p = dl_task_of(dl_se);
1256 struct rq_flags rf;
1257 struct rq *rq;
1258
1259 rq = task_rq_lock(p, &rf);
1260
1261 sched_clock_tick();
1262 update_rq_clock(rq);
1263
1264 if (!dl_task(p) || p->state == TASK_DEAD) {
1265 struct dl_bw *dl_b = dl_bw_of(task_cpu(p));
1266
1267 if (p->state == TASK_DEAD && dl_se->dl_non_contending) {
1268 sub_running_bw(&p->dl, dl_rq_of_se(&p->dl));
1269 sub_rq_bw(&p->dl, dl_rq_of_se(&p->dl));
1270 dl_se->dl_non_contending = 0;
1271 }
1272
1273 raw_spin_lock(&dl_b->lock);
1274 __dl_sub(dl_b, p->dl.dl_bw, dl_bw_cpus(task_cpu(p)));
1275 raw_spin_unlock(&dl_b->lock);
1276 __dl_clear_params(p);
1277
1278 goto unlock;
1279 }
1280 if (dl_se->dl_non_contending == 0)
1281 goto unlock;
1282
1283 sub_running_bw(dl_se, &rq->dl);
1284 dl_se->dl_non_contending = 0;
1285unlock:
1286 task_rq_unlock(rq, p, &rf);
1287 put_task_struct(p);
1288
1289 return HRTIMER_NORESTART;
1290}
1291
1292void init_dl_inactive_task_timer(struct sched_dl_entity *dl_se)
1293{
1294 struct hrtimer *timer = &dl_se->inactive_timer;
1295
1296 hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1297 timer->function = inactive_task_timer;
1298}
1299
1300#ifdef CONFIG_SMP
1301
1302static void inc_dl_deadline(struct dl_rq *dl_rq, u64 deadline)
1303{
1304 struct rq *rq = rq_of_dl_rq(dl_rq);
1305
1306 if (dl_rq->earliest_dl.curr == 0 ||
1307 dl_time_before(deadline, dl_rq->earliest_dl.curr)) {
1308 dl_rq->earliest_dl.curr = deadline;
1309 cpudl_set(&rq->rd->cpudl, rq->cpu, deadline);
1310 }
1311}
1312
1313static void dec_dl_deadline(struct dl_rq *dl_rq, u64 deadline)
1314{
1315 struct rq *rq = rq_of_dl_rq(dl_rq);
1316
1317
1318
1319
1320
1321 if (!dl_rq->dl_nr_running) {
1322 dl_rq->earliest_dl.curr = 0;
1323 dl_rq->earliest_dl.next = 0;
1324 cpudl_clear(&rq->rd->cpudl, rq->cpu);
1325 } else {
1326 struct rb_node *leftmost = dl_rq->root.rb_leftmost;
1327 struct sched_dl_entity *entry;
1328
1329 entry = rb_entry(leftmost, struct sched_dl_entity, rb_node);
1330 dl_rq->earliest_dl.curr = entry->deadline;
1331 cpudl_set(&rq->rd->cpudl, rq->cpu, entry->deadline);
1332 }
1333}
1334
1335#else
1336
1337static inline void inc_dl_deadline(struct dl_rq *dl_rq, u64 deadline) {}
1338static inline void dec_dl_deadline(struct dl_rq *dl_rq, u64 deadline) {}
1339
1340#endif
1341
1342static inline
1343void inc_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
1344{
1345 int prio = dl_task_of(dl_se)->prio;
1346 u64 deadline = dl_se->deadline;
1347
1348 WARN_ON(!dl_prio(prio));
1349 dl_rq->dl_nr_running++;
1350 add_nr_running(rq_of_dl_rq(dl_rq), 1);
1351
1352 inc_dl_deadline(dl_rq, deadline);
1353 inc_dl_migration(dl_se, dl_rq);
1354}
1355
1356static inline
1357void dec_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
1358{
1359 int prio = dl_task_of(dl_se)->prio;
1360
1361 WARN_ON(!dl_prio(prio));
1362 WARN_ON(!dl_rq->dl_nr_running);
1363 dl_rq->dl_nr_running--;
1364 sub_nr_running(rq_of_dl_rq(dl_rq), 1);
1365
1366 dec_dl_deadline(dl_rq, dl_se->deadline);
1367 dec_dl_migration(dl_se, dl_rq);
1368}
1369
1370static void __enqueue_dl_entity(struct sched_dl_entity *dl_se)
1371{
1372 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
1373 struct rb_node **link = &dl_rq->root.rb_root.rb_node;
1374 struct rb_node *parent = NULL;
1375 struct sched_dl_entity *entry;
1376 int leftmost = 1;
1377
1378 BUG_ON(!RB_EMPTY_NODE(&dl_se->rb_node));
1379
1380 while (*link) {
1381 parent = *link;
1382 entry = rb_entry(parent, struct sched_dl_entity, rb_node);
1383 if (dl_time_before(dl_se->deadline, entry->deadline))
1384 link = &parent->rb_left;
1385 else {
1386 link = &parent->rb_right;
1387 leftmost = 0;
1388 }
1389 }
1390
1391 rb_link_node(&dl_se->rb_node, parent, link);
1392 rb_insert_color_cached(&dl_se->rb_node, &dl_rq->root, leftmost);
1393
1394 inc_dl_tasks(dl_se, dl_rq);
1395}
1396
1397static void __dequeue_dl_entity(struct sched_dl_entity *dl_se)
1398{
1399 struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
1400
1401 if (RB_EMPTY_NODE(&dl_se->rb_node))
1402 return;
1403
1404 rb_erase_cached(&dl_se->rb_node, &dl_rq->root);
1405 RB_CLEAR_NODE(&dl_se->rb_node);
1406
1407 dec_dl_tasks(dl_se, dl_rq);
1408}
1409
1410static void
1411enqueue_dl_entity(struct sched_dl_entity *dl_se,
1412 struct sched_dl_entity *pi_se, int flags)
1413{
1414 BUG_ON(on_dl_rq(dl_se));
1415
1416
1417
1418
1419
1420
1421 if (flags & ENQUEUE_WAKEUP) {
1422 task_contending(dl_se, flags);
1423 update_dl_entity(dl_se, pi_se);
1424 } else if (flags & ENQUEUE_REPLENISH) {
1425 replenish_dl_entity(dl_se, pi_se);
1426 } else if ((flags & ENQUEUE_RESTORE) &&
1427 dl_time_before(dl_se->deadline,
1428 rq_clock(rq_of_dl_rq(dl_rq_of_se(dl_se))))) {
1429 setup_new_dl_entity(dl_se);
1430 }
1431
1432 __enqueue_dl_entity(dl_se);
1433}
1434
1435static void dequeue_dl_entity(struct sched_dl_entity *dl_se)
1436{
1437 __dequeue_dl_entity(dl_se);
1438}
1439
1440static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags)
1441{
1442 struct task_struct *pi_task = rt_mutex_get_top_task(p);
1443 struct sched_dl_entity *pi_se = &p->dl;
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453 if (pi_task && dl_prio(pi_task->normal_prio) && p->dl.dl_boosted) {
1454 pi_se = &pi_task->dl;
1455 } else if (!dl_prio(p->normal_prio)) {
1456
1457
1458
1459
1460
1461
1462
1463 BUG_ON(!p->dl.dl_boosted || flags != ENQUEUE_REPLENISH);
1464 return;
1465 }
1466
1467
1468
1469
1470
1471
1472
1473 if (!p->dl.dl_throttled && !dl_is_implicit(&p->dl))
1474 dl_check_constrained_dl(&p->dl);
1475
1476 if (p->on_rq == TASK_ON_RQ_MIGRATING || flags & ENQUEUE_RESTORE) {
1477 add_rq_bw(&p->dl, &rq->dl);
1478 add_running_bw(&p->dl, &rq->dl);
1479 }
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493 if (p->dl.dl_throttled && !(flags & ENQUEUE_REPLENISH)) {
1494 if (flags & ENQUEUE_WAKEUP)
1495 task_contending(&p->dl, flags);
1496
1497 return;
1498 }
1499
1500 enqueue_dl_entity(&p->dl, pi_se, flags);
1501
1502 if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
1503 enqueue_pushable_dl_task(rq, p);
1504}
1505
1506static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags)
1507{
1508 dequeue_dl_entity(&p->dl);
1509 dequeue_pushable_dl_task(rq, p);
1510}
1511
1512static void dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags)
1513{
1514 update_curr_dl(rq);
1515 __dequeue_task_dl(rq, p, flags);
1516
1517 if (p->on_rq == TASK_ON_RQ_MIGRATING || flags & DEQUEUE_SAVE) {
1518 sub_running_bw(&p->dl, &rq->dl);
1519 sub_rq_bw(&p->dl, &rq->dl);
1520 }
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531 if (flags & DEQUEUE_SLEEP)
1532 task_non_contending(p);
1533}
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545static void yield_task_dl(struct rq *rq)
1546{
1547
1548
1549
1550
1551
1552
1553 rq->curr->dl.dl_yielded = 1;
1554
1555 update_rq_clock(rq);
1556 update_curr_dl(rq);
1557
1558
1559
1560
1561
1562 rq_clock_skip_update(rq);
1563}
1564
1565#ifdef CONFIG_SMP
1566
1567static int find_later_rq(struct task_struct *task);
1568
1569static int
1570select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags)
1571{
1572 struct task_struct *curr;
1573 struct rq *rq;
1574
1575 if (sd_flag != SD_BALANCE_WAKE)
1576 goto out;
1577
1578 rq = cpu_rq(cpu);
1579
1580 rcu_read_lock();
1581 curr = READ_ONCE(rq->curr);
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 if (unlikely(dl_task(curr)) &&
1593 (curr->nr_cpus_allowed < 2 ||
1594 !dl_entity_preempt(&p->dl, &curr->dl)) &&
1595 (p->nr_cpus_allowed > 1)) {
1596 int target = find_later_rq(p);
1597
1598 if (target != -1 &&
1599 (dl_time_before(p->dl.deadline,
1600 cpu_rq(target)->dl.earliest_dl.curr) ||
1601 (cpu_rq(target)->dl.dl_nr_running == 0)))
1602 cpu = target;
1603 }
1604 rcu_read_unlock();
1605
1606out:
1607 return cpu;
1608}
1609
1610static void migrate_task_rq_dl(struct task_struct *p, int new_cpu __maybe_unused)
1611{
1612 struct rq *rq;
1613
1614 if (p->state != TASK_WAKING)
1615 return;
1616
1617 rq = task_rq(p);
1618
1619
1620
1621
1622
1623 raw_spin_lock(&rq->lock);
1624 if (p->dl.dl_non_contending) {
1625 sub_running_bw(&p->dl, &rq->dl);
1626 p->dl.dl_non_contending = 0;
1627
1628
1629
1630
1631
1632
1633
1634 if (hrtimer_try_to_cancel(&p->dl.inactive_timer) == 1)
1635 put_task_struct(p);
1636 }
1637 sub_rq_bw(&p->dl, &rq->dl);
1638 raw_spin_unlock(&rq->lock);
1639}
1640
1641static void check_preempt_equal_dl(struct rq *rq, struct task_struct *p)
1642{
1643
1644
1645
1646
1647 if (rq->curr->nr_cpus_allowed == 1 ||
1648 !cpudl_find(&rq->rd->cpudl, rq->curr, NULL))
1649 return;
1650
1651
1652
1653
1654
1655 if (p->nr_cpus_allowed != 1 &&
1656 cpudl_find(&rq->rd->cpudl, p, NULL))
1657 return;
1658
1659 resched_curr(rq);
1660}
1661
1662#endif
1663
1664
1665
1666
1667
1668static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
1669 int flags)
1670{
1671 if (dl_entity_preempt(&p->dl, &rq->curr->dl)) {
1672 resched_curr(rq);
1673 return;
1674 }
1675
1676#ifdef CONFIG_SMP
1677
1678
1679
1680
1681 if ((p->dl.deadline == rq->curr->dl.deadline) &&
1682 !test_tsk_need_resched(rq->curr))
1683 check_preempt_equal_dl(rq, p);
1684#endif
1685}
1686
1687#ifdef CONFIG_SCHED_HRTICK
1688static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
1689{
1690 hrtick_start(rq, p->dl.runtime);
1691}
1692#else
1693static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
1694{
1695}
1696#endif
1697
1698static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq,
1699 struct dl_rq *dl_rq)
1700{
1701 struct rb_node *left = rb_first_cached(&dl_rq->root);
1702
1703 if (!left)
1704 return NULL;
1705
1706 return rb_entry(left, struct sched_dl_entity, rb_node);
1707}
1708
1709static struct task_struct *
1710pick_next_task_dl(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
1711{
1712 struct sched_dl_entity *dl_se;
1713 struct task_struct *p;
1714 struct dl_rq *dl_rq;
1715
1716 dl_rq = &rq->dl;
1717
1718 if (need_pull_dl_task(rq, prev)) {
1719
1720
1721
1722
1723
1724
1725 rq_unpin_lock(rq, rf);
1726 pull_dl_task(rq);
1727 rq_repin_lock(rq, rf);
1728
1729
1730
1731
1732
1733 if (rq->stop && task_on_rq_queued(rq->stop))
1734 return RETRY_TASK;
1735 }
1736
1737
1738
1739
1740
1741 if (prev->sched_class == &dl_sched_class)
1742 update_curr_dl(rq);
1743
1744 if (unlikely(!dl_rq->dl_nr_running))
1745 return NULL;
1746
1747 put_prev_task(rq, prev);
1748
1749 dl_se = pick_next_dl_entity(rq, dl_rq);
1750 BUG_ON(!dl_se);
1751
1752 p = dl_task_of(dl_se);
1753 p->se.exec_start = rq_clock_task(rq);
1754
1755
1756 dequeue_pushable_dl_task(rq, p);
1757
1758 if (hrtick_enabled(rq))
1759 start_hrtick_dl(rq, p);
1760
1761 deadline_queue_push_tasks(rq);
1762
1763 if (rq->curr->sched_class != &dl_sched_class)
1764 update_dl_rq_load_avg(rq_clock_task(rq), rq, 0);
1765
1766 return p;
1767}
1768
1769static void put_prev_task_dl(struct rq *rq, struct task_struct *p)
1770{
1771 update_curr_dl(rq);
1772
1773 update_dl_rq_load_avg(rq_clock_task(rq), rq, 1);
1774 if (on_dl_rq(&p->dl) && p->nr_cpus_allowed > 1)
1775 enqueue_pushable_dl_task(rq, p);
1776}
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
1787{
1788 update_curr_dl(rq);
1789
1790 update_dl_rq_load_avg(rq_clock_task(rq), rq, 1);
1791
1792
1793
1794
1795
1796 if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
1797 is_leftmost(p, &rq->dl))
1798 start_hrtick_dl(rq, p);
1799}
1800
1801static void task_fork_dl(struct task_struct *p)
1802{
1803
1804
1805
1806
1807}
1808
1809static void set_curr_task_dl(struct rq *rq)
1810{
1811 struct task_struct *p = rq->curr;
1812
1813 p->se.exec_start = rq_clock_task(rq);
1814
1815
1816 dequeue_pushable_dl_task(rq, p);
1817}
1818
1819#ifdef CONFIG_SMP
1820
1821
1822#define DL_MAX_TRIES 3
1823
1824static int pick_dl_task(struct rq *rq, struct task_struct *p, int cpu)
1825{
1826 if (!task_running(rq, p) &&
1827 cpumask_test_cpu(cpu, &p->cpus_allowed))
1828 return 1;
1829 return 0;
1830}
1831
1832
1833
1834
1835
1836static struct task_struct *pick_earliest_pushable_dl_task(struct rq *rq, int cpu)
1837{
1838 struct rb_node *next_node = rq->dl.pushable_dl_tasks_root.rb_leftmost;
1839 struct task_struct *p = NULL;
1840
1841 if (!has_pushable_dl_tasks(rq))
1842 return NULL;
1843
1844next_node:
1845 if (next_node) {
1846 p = rb_entry(next_node, struct task_struct, pushable_dl_tasks);
1847
1848 if (pick_dl_task(rq, p, cpu))
1849 return p;
1850
1851 next_node = rb_next(next_node);
1852 goto next_node;
1853 }
1854
1855 return NULL;
1856}
1857
1858static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl);
1859
1860static int find_later_rq(struct task_struct *task)
1861{
1862 struct sched_domain *sd;
1863 struct cpumask *later_mask = this_cpu_cpumask_var_ptr(local_cpu_mask_dl);
1864 int this_cpu = smp_processor_id();
1865 int cpu = task_cpu(task);
1866
1867
1868 if (unlikely(!later_mask))
1869 return -1;
1870
1871 if (task->nr_cpus_allowed == 1)
1872 return -1;
1873
1874
1875
1876
1877
1878 if (!cpudl_find(&task_rq(task)->rd->cpudl, task, later_mask))
1879 return -1;
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893 if (cpumask_test_cpu(cpu, later_mask))
1894 return cpu;
1895
1896
1897
1898
1899 if (!cpumask_test_cpu(this_cpu, later_mask))
1900 this_cpu = -1;
1901
1902 rcu_read_lock();
1903 for_each_domain(cpu, sd) {
1904 if (sd->flags & SD_WAKE_AFFINE) {
1905 int best_cpu;
1906
1907
1908
1909
1910
1911 if (this_cpu != -1 &&
1912 cpumask_test_cpu(this_cpu, sched_domain_span(sd))) {
1913 rcu_read_unlock();
1914 return this_cpu;
1915 }
1916
1917 best_cpu = cpumask_first_and(later_mask,
1918 sched_domain_span(sd));
1919
1920
1921
1922
1923
1924
1925 if (best_cpu < nr_cpu_ids) {
1926 rcu_read_unlock();
1927 return best_cpu;
1928 }
1929 }
1930 }
1931 rcu_read_unlock();
1932
1933
1934
1935
1936
1937 if (this_cpu != -1)
1938 return this_cpu;
1939
1940 cpu = cpumask_any(later_mask);
1941 if (cpu < nr_cpu_ids)
1942 return cpu;
1943
1944 return -1;
1945}
1946
1947
1948static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq)
1949{
1950 struct rq *later_rq = NULL;
1951 int tries;
1952 int cpu;
1953
1954 for (tries = 0; tries < DL_MAX_TRIES; tries++) {
1955 cpu = find_later_rq(task);
1956
1957 if ((cpu == -1) || (cpu == rq->cpu))
1958 break;
1959
1960 later_rq = cpu_rq(cpu);
1961
1962 if (later_rq->dl.dl_nr_running &&
1963 !dl_time_before(task->dl.deadline,
1964 later_rq->dl.earliest_dl.curr)) {
1965
1966
1967
1968
1969
1970 later_rq = NULL;
1971 break;
1972 }
1973
1974
1975 if (double_lock_balance(rq, later_rq)) {
1976 if (unlikely(task_rq(task) != rq ||
1977 !cpumask_test_cpu(later_rq->cpu, &task->cpus_allowed) ||
1978 task_running(rq, task) ||
1979 !dl_task(task) ||
1980 !task_on_rq_queued(task))) {
1981 double_unlock_balance(rq, later_rq);
1982 later_rq = NULL;
1983 break;
1984 }
1985 }
1986
1987
1988
1989
1990
1991
1992 if (!later_rq->dl.dl_nr_running ||
1993 dl_time_before(task->dl.deadline,
1994 later_rq->dl.earliest_dl.curr))
1995 break;
1996
1997
1998 double_unlock_balance(rq, later_rq);
1999 later_rq = NULL;
2000 }
2001
2002 return later_rq;
2003}
2004
2005static struct task_struct *pick_next_pushable_dl_task(struct rq *rq)
2006{
2007 struct task_struct *p;
2008
2009 if (!has_pushable_dl_tasks(rq))
2010 return NULL;
2011
2012 p = rb_entry(rq->dl.pushable_dl_tasks_root.rb_leftmost,
2013 struct task_struct, pushable_dl_tasks);
2014
2015 BUG_ON(rq->cpu != task_cpu(p));
2016 BUG_ON(task_current(rq, p));
2017 BUG_ON(p->nr_cpus_allowed <= 1);
2018
2019 BUG_ON(!task_on_rq_queued(p));
2020 BUG_ON(!dl_task(p));
2021
2022 return p;
2023}
2024
2025
2026
2027
2028
2029
2030static int push_dl_task(struct rq *rq)
2031{
2032 struct task_struct *next_task;
2033 struct rq *later_rq;
2034 int ret = 0;
2035
2036 if (!rq->dl.overloaded)
2037 return 0;
2038
2039 next_task = pick_next_pushable_dl_task(rq);
2040 if (!next_task)
2041 return 0;
2042
2043retry:
2044 if (unlikely(next_task == rq->curr)) {
2045 WARN_ON(1);
2046 return 0;
2047 }
2048
2049
2050
2051
2052
2053
2054 if (dl_task(rq->curr) &&
2055 dl_time_before(next_task->dl.deadline, rq->curr->dl.deadline) &&
2056 rq->curr->nr_cpus_allowed > 1) {
2057 resched_curr(rq);
2058 return 0;
2059 }
2060
2061
2062 get_task_struct(next_task);
2063
2064
2065 later_rq = find_lock_later_rq(next_task, rq);
2066 if (!later_rq) {
2067 struct task_struct *task;
2068
2069
2070
2071
2072
2073
2074 task = pick_next_pushable_dl_task(rq);
2075 if (task == next_task) {
2076
2077
2078
2079
2080 goto out;
2081 }
2082
2083 if (!task)
2084
2085 goto out;
2086
2087 put_task_struct(next_task);
2088 next_task = task;
2089 goto retry;
2090 }
2091
2092 deactivate_task(rq, next_task, 0);
2093 sub_running_bw(&next_task->dl, &rq->dl);
2094 sub_rq_bw(&next_task->dl, &rq->dl);
2095 set_task_cpu(next_task, later_rq->cpu);
2096 add_rq_bw(&next_task->dl, &later_rq->dl);
2097
2098
2099
2100
2101
2102 update_rq_clock(later_rq);
2103 add_running_bw(&next_task->dl, &later_rq->dl);
2104 activate_task(later_rq, next_task, ENQUEUE_NOCLOCK);
2105 ret = 1;
2106
2107 resched_curr(later_rq);
2108
2109 double_unlock_balance(rq, later_rq);
2110
2111out:
2112 put_task_struct(next_task);
2113
2114 return ret;
2115}
2116
2117static void push_dl_tasks(struct rq *rq)
2118{
2119
2120 while (push_dl_task(rq))
2121 ;
2122}
2123
2124static void pull_dl_task(struct rq *this_rq)
2125{
2126 int this_cpu = this_rq->cpu, cpu;
2127 struct task_struct *p;
2128 bool resched = false;
2129 struct rq *src_rq;
2130 u64 dmin = LONG_MAX;
2131
2132 if (likely(!dl_overloaded(this_rq)))
2133 return;
2134
2135
2136
2137
2138
2139 smp_rmb();
2140
2141 for_each_cpu(cpu, this_rq->rd->dlo_mask) {
2142 if (this_cpu == cpu)
2143 continue;
2144
2145 src_rq = cpu_rq(cpu);
2146
2147
2148
2149
2150
2151 if (this_rq->dl.dl_nr_running &&
2152 dl_time_before(this_rq->dl.earliest_dl.curr,
2153 src_rq->dl.earliest_dl.next))
2154 continue;
2155
2156
2157 double_lock_balance(this_rq, src_rq);
2158
2159
2160
2161
2162
2163 if (src_rq->dl.dl_nr_running <= 1)
2164 goto skip;
2165
2166 p = pick_earliest_pushable_dl_task(src_rq, this_cpu);
2167
2168
2169
2170
2171
2172
2173 if (p && dl_time_before(p->dl.deadline, dmin) &&
2174 (!this_rq->dl.dl_nr_running ||
2175 dl_time_before(p->dl.deadline,
2176 this_rq->dl.earliest_dl.curr))) {
2177 WARN_ON(p == src_rq->curr);
2178 WARN_ON(!task_on_rq_queued(p));
2179
2180
2181
2182
2183
2184 if (dl_time_before(p->dl.deadline,
2185 src_rq->curr->dl.deadline))
2186 goto skip;
2187
2188 resched = true;
2189
2190 deactivate_task(src_rq, p, 0);
2191 sub_running_bw(&p->dl, &src_rq->dl);
2192 sub_rq_bw(&p->dl, &src_rq->dl);
2193 set_task_cpu(p, this_cpu);
2194 add_rq_bw(&p->dl, &this_rq->dl);
2195 add_running_bw(&p->dl, &this_rq->dl);
2196 activate_task(this_rq, p, 0);
2197 dmin = p->dl.deadline;
2198
2199
2200 }
2201skip:
2202 double_unlock_balance(this_rq, src_rq);
2203 }
2204
2205 if (resched)
2206 resched_curr(this_rq);
2207}
2208
2209
2210
2211
2212
2213static void task_woken_dl(struct rq *rq, struct task_struct *p)
2214{
2215 if (!task_running(rq, p) &&
2216 !test_tsk_need_resched(rq->curr) &&
2217 p->nr_cpus_allowed > 1 &&
2218 dl_task(rq->curr) &&
2219 (rq->curr->nr_cpus_allowed < 2 ||
2220 !dl_entity_preempt(&p->dl, &rq->curr->dl))) {
2221 push_dl_tasks(rq);
2222 }
2223}
2224
2225static void set_cpus_allowed_dl(struct task_struct *p,
2226 const struct cpumask *new_mask)
2227{
2228 struct root_domain *src_rd;
2229 struct rq *rq;
2230
2231 BUG_ON(!dl_task(p));
2232
2233 rq = task_rq(p);
2234 src_rd = rq->rd;
2235
2236
2237
2238
2239
2240
2241 if (!cpumask_intersects(src_rd->span, new_mask)) {
2242 struct dl_bw *src_dl_b;
2243
2244 src_dl_b = dl_bw_of(cpu_of(rq));
2245
2246
2247
2248
2249
2250 raw_spin_lock(&src_dl_b->lock);
2251 __dl_sub(src_dl_b, p->dl.dl_bw, dl_bw_cpus(task_cpu(p)));
2252 raw_spin_unlock(&src_dl_b->lock);
2253 }
2254
2255 set_cpus_allowed_common(p, new_mask);
2256}
2257
2258
2259static void rq_online_dl(struct rq *rq)
2260{
2261 if (rq->dl.overloaded)
2262 dl_set_overload(rq);
2263
2264 cpudl_set_freecpu(&rq->rd->cpudl, rq->cpu);
2265 if (rq->dl.dl_nr_running > 0)
2266 cpudl_set(&rq->rd->cpudl, rq->cpu, rq->dl.earliest_dl.curr);
2267}
2268
2269
2270static void rq_offline_dl(struct rq *rq)
2271{
2272 if (rq->dl.overloaded)
2273 dl_clear_overload(rq);
2274
2275 cpudl_clear(&rq->rd->cpudl, rq->cpu);
2276 cpudl_clear_freecpu(&rq->rd->cpudl, rq->cpu);
2277}
2278
2279void __init init_sched_dl_class(void)
2280{
2281 unsigned int i;
2282
2283 for_each_possible_cpu(i)
2284 zalloc_cpumask_var_node(&per_cpu(local_cpu_mask_dl, i),
2285 GFP_KERNEL, cpu_to_node(i));
2286}
2287
2288#endif
2289
2290static void switched_from_dl(struct rq *rq, struct task_struct *p)
2291{
2292
2293
2294
2295
2296
2297
2298
2299
2300 if (task_on_rq_queued(p) && p->dl.dl_runtime)
2301 task_non_contending(p);
2302
2303 if (!task_on_rq_queued(p)) {
2304
2305
2306
2307
2308
2309
2310 if (p->dl.dl_non_contending)
2311 sub_running_bw(&p->dl, &rq->dl);
2312 sub_rq_bw(&p->dl, &rq->dl);
2313 }
2314
2315
2316
2317
2318
2319
2320 if (p->dl.dl_non_contending)
2321 p->dl.dl_non_contending = 0;
2322
2323
2324
2325
2326
2327
2328 if (!task_on_rq_queued(p) || rq->dl.dl_nr_running)
2329 return;
2330
2331 deadline_queue_pull_task(rq);
2332}
2333
2334
2335
2336
2337
2338static void switched_to_dl(struct rq *rq, struct task_struct *p)
2339{
2340 if (hrtimer_try_to_cancel(&p->dl.inactive_timer) == 1)
2341 put_task_struct(p);
2342
2343
2344 if (!task_on_rq_queued(p)) {
2345 add_rq_bw(&p->dl, &rq->dl);
2346
2347 return;
2348 }
2349
2350 if (rq->curr != p) {
2351#ifdef CONFIG_SMP
2352 if (p->nr_cpus_allowed > 1 && rq->dl.overloaded)
2353 deadline_queue_push_tasks(rq);
2354#endif
2355 if (dl_task(rq->curr))
2356 check_preempt_curr_dl(rq, p, 0);
2357 else
2358 resched_curr(rq);
2359 }
2360}
2361
2362
2363
2364
2365
2366static void prio_changed_dl(struct rq *rq, struct task_struct *p,
2367 int oldprio)
2368{
2369 if (task_on_rq_queued(p) || rq->curr == p) {
2370#ifdef CONFIG_SMP
2371
2372
2373
2374
2375
2376
2377 if (!rq->dl.overloaded)
2378 deadline_queue_pull_task(rq);
2379
2380
2381
2382
2383
2384
2385 if (dl_time_before(rq->dl.earliest_dl.curr, p->dl.deadline))
2386 resched_curr(rq);
2387#else
2388
2389
2390
2391
2392
2393 resched_curr(rq);
2394#endif
2395 }
2396}
2397
2398const struct sched_class dl_sched_class = {
2399 .next = &rt_sched_class,
2400 .enqueue_task = enqueue_task_dl,
2401 .dequeue_task = dequeue_task_dl,
2402 .yield_task = yield_task_dl,
2403
2404 .check_preempt_curr = check_preempt_curr_dl,
2405
2406 .pick_next_task = pick_next_task_dl,
2407 .put_prev_task = put_prev_task_dl,
2408
2409#ifdef CONFIG_SMP
2410 .select_task_rq = select_task_rq_dl,
2411 .migrate_task_rq = migrate_task_rq_dl,
2412 .set_cpus_allowed = set_cpus_allowed_dl,
2413 .rq_online = rq_online_dl,
2414 .rq_offline = rq_offline_dl,
2415 .task_woken = task_woken_dl,
2416#endif
2417
2418 .set_curr_task = set_curr_task_dl,
2419 .task_tick = task_tick_dl,
2420 .task_fork = task_fork_dl,
2421
2422 .prio_changed = prio_changed_dl,
2423 .switched_from = switched_from_dl,
2424 .switched_to = switched_to_dl,
2425
2426 .update_curr = update_curr_dl,
2427};
2428
2429int sched_dl_global_validate(void)
2430{
2431 u64 runtime = global_rt_runtime();
2432 u64 period = global_rt_period();
2433 u64 new_bw = to_ratio(period, runtime);
2434 struct dl_bw *dl_b;
2435 int cpu, ret = 0;
2436 unsigned long flags;
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447 for_each_possible_cpu(cpu) {
2448 rcu_read_lock_sched();
2449 dl_b = dl_bw_of(cpu);
2450
2451 raw_spin_lock_irqsave(&dl_b->lock, flags);
2452 if (new_bw < dl_b->total_bw)
2453 ret = -EBUSY;
2454 raw_spin_unlock_irqrestore(&dl_b->lock, flags);
2455
2456 rcu_read_unlock_sched();
2457
2458 if (ret)
2459 break;
2460 }
2461
2462 return ret;
2463}
2464
2465void init_dl_rq_bw_ratio(struct dl_rq *dl_rq)
2466{
2467 if (global_rt_runtime() == RUNTIME_INF) {
2468 dl_rq->bw_ratio = 1 << RATIO_SHIFT;
2469 dl_rq->extra_bw = 1 << BW_SHIFT;
2470 } else {
2471 dl_rq->bw_ratio = to_ratio(global_rt_runtime(),
2472 global_rt_period()) >> (BW_SHIFT - RATIO_SHIFT);
2473 dl_rq->extra_bw = to_ratio(global_rt_period(),
2474 global_rt_runtime());
2475 }
2476}
2477
2478void sched_dl_do_global(void)
2479{
2480 u64 new_bw = -1;
2481 struct dl_bw *dl_b;
2482 int cpu;
2483 unsigned long flags;
2484
2485 def_dl_bandwidth.dl_period = global_rt_period();
2486 def_dl_bandwidth.dl_runtime = global_rt_runtime();
2487
2488 if (global_rt_runtime() != RUNTIME_INF)
2489 new_bw = to_ratio(global_rt_period(), global_rt_runtime());
2490
2491
2492
2493
2494 for_each_possible_cpu(cpu) {
2495 rcu_read_lock_sched();
2496 dl_b = dl_bw_of(cpu);
2497
2498 raw_spin_lock_irqsave(&dl_b->lock, flags);
2499 dl_b->bw = new_bw;
2500 raw_spin_unlock_irqrestore(&dl_b->lock, flags);
2501
2502 rcu_read_unlock_sched();
2503 init_dl_rq_bw_ratio(&cpu_rq(cpu)->dl);
2504 }
2505}
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515int sched_dl_overflow(struct task_struct *p, int policy,
2516 const struct sched_attr *attr)
2517{
2518 struct dl_bw *dl_b = dl_bw_of(task_cpu(p));
2519 u64 period = attr->sched_period ?: attr->sched_deadline;
2520 u64 runtime = attr->sched_runtime;
2521 u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0;
2522 int cpus, err = -1;
2523
2524 if (attr->sched_flags & SCHED_FLAG_SUGOV)
2525 return 0;
2526
2527
2528 if (new_bw == p->dl.dl_bw && task_has_dl_policy(p))
2529 return 0;
2530
2531
2532
2533
2534
2535
2536 raw_spin_lock(&dl_b->lock);
2537 cpus = dl_bw_cpus(task_cpu(p));
2538 if (dl_policy(policy) && !task_has_dl_policy(p) &&
2539 !__dl_overflow(dl_b, cpus, 0, new_bw)) {
2540 if (hrtimer_active(&p->dl.inactive_timer))
2541 __dl_sub(dl_b, p->dl.dl_bw, cpus);
2542 __dl_add(dl_b, new_bw, cpus);
2543 err = 0;
2544 } else if (dl_policy(policy) && task_has_dl_policy(p) &&
2545 !__dl_overflow(dl_b, cpus, p->dl.dl_bw, new_bw)) {
2546
2547
2548
2549
2550
2551
2552
2553 __dl_sub(dl_b, p->dl.dl_bw, cpus);
2554 __dl_add(dl_b, new_bw, cpus);
2555 dl_change_utilization(p, new_bw);
2556 err = 0;
2557 } else if (!dl_policy(policy) && task_has_dl_policy(p)) {
2558
2559
2560
2561
2562
2563 err = 0;
2564 }
2565 raw_spin_unlock(&dl_b->lock);
2566
2567 return err;
2568}
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578void __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
2579{
2580 struct sched_dl_entity *dl_se = &p->dl;
2581
2582 dl_se->dl_runtime = attr->sched_runtime;
2583 dl_se->dl_deadline = attr->sched_deadline;
2584 dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
2585 dl_se->flags = attr->sched_flags;
2586 dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime);
2587 dl_se->dl_density = to_ratio(dl_se->dl_deadline, dl_se->dl_runtime);
2588}
2589
2590void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
2591{
2592 struct sched_dl_entity *dl_se = &p->dl;
2593
2594 attr->sched_priority = p->rt_priority;
2595 attr->sched_runtime = dl_se->dl_runtime;
2596 attr->sched_deadline = dl_se->dl_deadline;
2597 attr->sched_period = dl_se->dl_period;
2598 attr->sched_flags = dl_se->flags;
2599}
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611bool __checkparam_dl(const struct sched_attr *attr)
2612{
2613
2614 if (attr->sched_flags & SCHED_FLAG_SUGOV)
2615 return true;
2616
2617
2618 if (attr->sched_deadline == 0)
2619 return false;
2620
2621
2622
2623
2624
2625 if (attr->sched_runtime < (1ULL << DL_SCALE))
2626 return false;
2627
2628
2629
2630
2631
2632 if (attr->sched_deadline & (1ULL << 63) ||
2633 attr->sched_period & (1ULL << 63))
2634 return false;
2635
2636
2637 if ((attr->sched_period != 0 &&
2638 attr->sched_period < attr->sched_deadline) ||
2639 attr->sched_deadline < attr->sched_runtime)
2640 return false;
2641
2642 return true;
2643}
2644
2645
2646
2647
2648void __dl_clear_params(struct task_struct *p)
2649{
2650 struct sched_dl_entity *dl_se = &p->dl;
2651
2652 dl_se->dl_runtime = 0;
2653 dl_se->dl_deadline = 0;
2654 dl_se->dl_period = 0;
2655 dl_se->flags = 0;
2656 dl_se->dl_bw = 0;
2657 dl_se->dl_density = 0;
2658
2659 dl_se->dl_throttled = 0;
2660 dl_se->dl_yielded = 0;
2661 dl_se->dl_non_contending = 0;
2662 dl_se->dl_overrun = 0;
2663}
2664
2665bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
2666{
2667 struct sched_dl_entity *dl_se = &p->dl;
2668
2669 if (dl_se->dl_runtime != attr->sched_runtime ||
2670 dl_se->dl_deadline != attr->sched_deadline ||
2671 dl_se->dl_period != attr->sched_period ||
2672 dl_se->flags != attr->sched_flags)
2673 return true;
2674
2675 return false;
2676}
2677
2678#ifdef CONFIG_SMP
2679int dl_task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed)
2680{
2681 unsigned int dest_cpu;
2682 struct dl_bw *dl_b;
2683 bool overflow;
2684 int cpus, ret;
2685 unsigned long flags;
2686
2687 dest_cpu = cpumask_any_and(cpu_active_mask, cs_cpus_allowed);
2688
2689 rcu_read_lock_sched();
2690 dl_b = dl_bw_of(dest_cpu);
2691 raw_spin_lock_irqsave(&dl_b->lock, flags);
2692 cpus = dl_bw_cpus(dest_cpu);
2693 overflow = __dl_overflow(dl_b, cpus, 0, p->dl.dl_bw);
2694 if (overflow) {
2695 ret = -EBUSY;
2696 } else {
2697
2698
2699
2700
2701
2702
2703 __dl_add(dl_b, p->dl.dl_bw, cpus);
2704 ret = 0;
2705 }
2706 raw_spin_unlock_irqrestore(&dl_b->lock, flags);
2707 rcu_read_unlock_sched();
2708
2709 return ret;
2710}
2711
2712int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur,
2713 const struct cpumask *trial)
2714{
2715 int ret = 1, trial_cpus;
2716 struct dl_bw *cur_dl_b;
2717 unsigned long flags;
2718
2719 rcu_read_lock_sched();
2720 cur_dl_b = dl_bw_of(cpumask_any(cur));
2721 trial_cpus = cpumask_weight(trial);
2722
2723 raw_spin_lock_irqsave(&cur_dl_b->lock, flags);
2724 if (cur_dl_b->bw != -1 &&
2725 cur_dl_b->bw * trial_cpus < cur_dl_b->total_bw)
2726 ret = 0;
2727 raw_spin_unlock_irqrestore(&cur_dl_b->lock, flags);
2728 rcu_read_unlock_sched();
2729
2730 return ret;
2731}
2732
2733bool dl_cpu_busy(unsigned int cpu)
2734{
2735 unsigned long flags;
2736 struct dl_bw *dl_b;
2737 bool overflow;
2738 int cpus;
2739
2740 rcu_read_lock_sched();
2741 dl_b = dl_bw_of(cpu);
2742 raw_spin_lock_irqsave(&dl_b->lock, flags);
2743 cpus = dl_bw_cpus(cpu);
2744 overflow = __dl_overflow(dl_b, cpus, 0, 0);
2745 raw_spin_unlock_irqrestore(&dl_b->lock, flags);
2746 rcu_read_unlock_sched();
2747
2748 return overflow;
2749}
2750#endif
2751
2752#ifdef CONFIG_SCHED_DEBUG
2753void print_dl_stats(struct seq_file *m, int cpu)
2754{
2755 print_dl_rq(m, cpu, &cpu_rq(cpu)->dl);
2756}
2757#endif
2758