@@ -1159,8 +1159,6 @@ static inline void update_curr_task(struct task_struct *p, s64 delta_exec)
1159
1159
trace_sched_stat_runtime (p , delta_exec );
1160
1160
account_group_exec_runtime (p , delta_exec );
1161
1161
cgroup_account_cputime (p , delta_exec );
1162
- if (p -> dl_server )
1163
- dl_server_update (p -> dl_server , delta_exec );
1164
1162
}
1165
1163
1166
1164
static inline bool did_preempt_short (struct cfs_rq * cfs_rq , struct sched_entity * curr )
@@ -1237,11 +1235,16 @@ static void update_curr(struct cfs_rq *cfs_rq)
1237
1235
update_curr_task (p , delta_exec );
1238
1236
1239
1237
/*
1240
- * Any fair task that runs outside of fair_server should
1241
- * account against fair_server such that it can account for
1242
- * this time and possibly avoid running this period.
1238
+ * If the fair_server is active, we need to account for the
1239
+ * fair_server time whether or not the task is running on
1240
+ * behalf of fair_server or not:
1241
+ * - If the task is running on behalf of fair_server, we need
1242
+ * to limit its time based on the assigned runtime.
1243
+ * - Fair task that runs outside of fair_server should account
1244
+ * against fair_server such that it can account for this time
1245
+ * and possibly avoid running this period.
1243
1246
*/
1244
- if (p -> dl_server != & rq -> fair_server )
1247
+ if (dl_server_active ( & rq -> fair_server ) )
1245
1248
dl_server_update (& rq -> fair_server , delta_exec );
1246
1249
}
1247
1250
@@ -5471,9 +5474,33 @@ static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
5471
5474
5472
5475
static __always_inline void return_cfs_rq_runtime (struct cfs_rq * cfs_rq );
5473
5476
5474
- static inline void finish_delayed_dequeue_entity (struct sched_entity * se )
5477
+ static void set_delayed (struct sched_entity * se )
5478
+ {
5479
+ se -> sched_delayed = 1 ;
5480
+ for_each_sched_entity (se ) {
5481
+ struct cfs_rq * cfs_rq = cfs_rq_of (se );
5482
+
5483
+ cfs_rq -> h_nr_delayed ++ ;
5484
+ if (cfs_rq_throttled (cfs_rq ))
5485
+ break ;
5486
+ }
5487
+ }
5488
+
5489
+ static void clear_delayed (struct sched_entity * se )
5475
5490
{
5476
5491
se -> sched_delayed = 0 ;
5492
+ for_each_sched_entity (se ) {
5493
+ struct cfs_rq * cfs_rq = cfs_rq_of (se );
5494
+
5495
+ cfs_rq -> h_nr_delayed -- ;
5496
+ if (cfs_rq_throttled (cfs_rq ))
5497
+ break ;
5498
+ }
5499
+ }
5500
+
5501
+ static inline void finish_delayed_dequeue_entity (struct sched_entity * se )
5502
+ {
5503
+ clear_delayed (se );
5477
5504
if (sched_feat (DELAY_ZERO ) && se -> vlag > 0 )
5478
5505
se -> vlag = 0 ;
5479
5506
}
@@ -5484,6 +5511,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
5484
5511
bool sleep = flags & DEQUEUE_SLEEP ;
5485
5512
5486
5513
update_curr (cfs_rq );
5514
+ clear_buddies (cfs_rq , se );
5487
5515
5488
5516
if (flags & DEQUEUE_DELAYED ) {
5489
5517
SCHED_WARN_ON (!se -> sched_delayed );
@@ -5500,10 +5528,8 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
5500
5528
5501
5529
if (sched_feat (DELAY_DEQUEUE ) && delay &&
5502
5530
!entity_eligible (cfs_rq , se )) {
5503
- if (cfs_rq -> next == se )
5504
- cfs_rq -> next = NULL ;
5505
5531
update_load_avg (cfs_rq , se , 0 );
5506
- se -> sched_delayed = 1 ;
5532
+ set_delayed ( se ) ;
5507
5533
return false;
5508
5534
}
5509
5535
}
@@ -5526,8 +5552,6 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
5526
5552
5527
5553
update_stats_dequeue_fair (cfs_rq , se , flags );
5528
5554
5529
- clear_buddies (cfs_rq , se );
5530
-
5531
5555
update_entity_lag (cfs_rq , se );
5532
5556
if (sched_feat (PLACE_REL_DEADLINE ) && !sleep ) {
5533
5557
se -> deadline -= se -> vruntime ;
@@ -5917,7 +5941,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq)
5917
5941
struct rq * rq = rq_of (cfs_rq );
5918
5942
struct cfs_bandwidth * cfs_b = tg_cfs_bandwidth (cfs_rq -> tg );
5919
5943
struct sched_entity * se ;
5920
- long task_delta , idle_task_delta , dequeue = 1 ;
5944
+ long task_delta , idle_task_delta , delayed_delta , dequeue = 1 ;
5921
5945
long rq_h_nr_running = rq -> cfs .h_nr_running ;
5922
5946
5923
5947
raw_spin_lock (& cfs_b -> lock );
@@ -5950,6 +5974,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq)
5950
5974
5951
5975
task_delta = cfs_rq -> h_nr_running ;
5952
5976
idle_task_delta = cfs_rq -> idle_h_nr_running ;
5977
+ delayed_delta = cfs_rq -> h_nr_delayed ;
5953
5978
for_each_sched_entity (se ) {
5954
5979
struct cfs_rq * qcfs_rq = cfs_rq_of (se );
5955
5980
int flags ;
@@ -5973,6 +5998,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq)
5973
5998
5974
5999
qcfs_rq -> h_nr_running -= task_delta ;
5975
6000
qcfs_rq -> idle_h_nr_running -= idle_task_delta ;
6001
+ qcfs_rq -> h_nr_delayed -= delayed_delta ;
5976
6002
5977
6003
if (qcfs_rq -> load .weight ) {
5978
6004
/* Avoid re-evaluating load for this entity: */
@@ -5995,6 +6021,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq)
5995
6021
5996
6022
qcfs_rq -> h_nr_running -= task_delta ;
5997
6023
qcfs_rq -> idle_h_nr_running -= idle_task_delta ;
6024
+ qcfs_rq -> h_nr_delayed -= delayed_delta ;
5998
6025
}
5999
6026
6000
6027
/* At this point se is NULL and we are at root level*/
@@ -6020,7 +6047,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
6020
6047
struct rq * rq = rq_of (cfs_rq );
6021
6048
struct cfs_bandwidth * cfs_b = tg_cfs_bandwidth (cfs_rq -> tg );
6022
6049
struct sched_entity * se ;
6023
- long task_delta , idle_task_delta ;
6050
+ long task_delta , idle_task_delta , delayed_delta ;
6024
6051
long rq_h_nr_running = rq -> cfs .h_nr_running ;
6025
6052
6026
6053
se = cfs_rq -> tg -> se [cpu_of (rq )];
@@ -6056,6 +6083,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
6056
6083
6057
6084
task_delta = cfs_rq -> h_nr_running ;
6058
6085
idle_task_delta = cfs_rq -> idle_h_nr_running ;
6086
+ delayed_delta = cfs_rq -> h_nr_delayed ;
6059
6087
for_each_sched_entity (se ) {
6060
6088
struct cfs_rq * qcfs_rq = cfs_rq_of (se );
6061
6089
@@ -6073,6 +6101,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
6073
6101
6074
6102
qcfs_rq -> h_nr_running += task_delta ;
6075
6103
qcfs_rq -> idle_h_nr_running += idle_task_delta ;
6104
+ qcfs_rq -> h_nr_delayed += delayed_delta ;
6076
6105
6077
6106
/* end evaluation on encountering a throttled cfs_rq */
6078
6107
if (cfs_rq_throttled (qcfs_rq ))
@@ -6090,6 +6119,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
6090
6119
6091
6120
qcfs_rq -> h_nr_running += task_delta ;
6092
6121
qcfs_rq -> idle_h_nr_running += idle_task_delta ;
6122
+ qcfs_rq -> h_nr_delayed += delayed_delta ;
6093
6123
6094
6124
/* end evaluation on encountering a throttled cfs_rq */
6095
6125
if (cfs_rq_throttled (qcfs_rq ))
@@ -6943,7 +6973,7 @@ requeue_delayed_entity(struct sched_entity *se)
6943
6973
}
6944
6974
6945
6975
update_load_avg (cfs_rq , se , 0 );
6946
- se -> sched_delayed = 0 ;
6976
+ clear_delayed ( se ) ;
6947
6977
}
6948
6978
6949
6979
/*
@@ -6957,6 +6987,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
6957
6987
struct cfs_rq * cfs_rq ;
6958
6988
struct sched_entity * se = & p -> se ;
6959
6989
int idle_h_nr_running = task_has_idle_policy (p );
6990
+ int h_nr_delayed = 0 ;
6960
6991
int task_new = !(flags & ENQUEUE_WAKEUP );
6961
6992
int rq_h_nr_running = rq -> cfs .h_nr_running ;
6962
6993
u64 slice = 0 ;
@@ -6983,6 +7014,9 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
6983
7014
if (p -> in_iowait )
6984
7015
cpufreq_update_util (rq , SCHED_CPUFREQ_IOWAIT );
6985
7016
7017
+ if (task_new )
7018
+ h_nr_delayed = !!se -> sched_delayed ;
7019
+
6986
7020
for_each_sched_entity (se ) {
6987
7021
if (se -> on_rq ) {
6988
7022
if (se -> sched_delayed )
@@ -7005,6 +7039,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
7005
7039
7006
7040
cfs_rq -> h_nr_running ++ ;
7007
7041
cfs_rq -> idle_h_nr_running += idle_h_nr_running ;
7042
+ cfs_rq -> h_nr_delayed += h_nr_delayed ;
7008
7043
7009
7044
if (cfs_rq_is_idle (cfs_rq ))
7010
7045
idle_h_nr_running = 1 ;
@@ -7028,6 +7063,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
7028
7063
7029
7064
cfs_rq -> h_nr_running ++ ;
7030
7065
cfs_rq -> idle_h_nr_running += idle_h_nr_running ;
7066
+ cfs_rq -> h_nr_delayed += h_nr_delayed ;
7031
7067
7032
7068
if (cfs_rq_is_idle (cfs_rq ))
7033
7069
idle_h_nr_running = 1 ;
@@ -7090,13 +7126,16 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags)
7090
7126
struct task_struct * p = NULL ;
7091
7127
int idle_h_nr_running = 0 ;
7092
7128
int h_nr_running = 0 ;
7129
+ int h_nr_delayed = 0 ;
7093
7130
struct cfs_rq * cfs_rq ;
7094
7131
u64 slice = 0 ;
7095
7132
7096
7133
if (entity_is_task (se )) {
7097
7134
p = task_of (se );
7098
7135
h_nr_running = 1 ;
7099
7136
idle_h_nr_running = task_has_idle_policy (p );
7137
+ if (!task_sleep && !task_delayed )
7138
+ h_nr_delayed = !!se -> sched_delayed ;
7100
7139
} else {
7101
7140
cfs_rq = group_cfs_rq (se );
7102
7141
slice = cfs_rq_min_slice (cfs_rq );
@@ -7114,6 +7153,7 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags)
7114
7153
7115
7154
cfs_rq -> h_nr_running -= h_nr_running ;
7116
7155
cfs_rq -> idle_h_nr_running -= idle_h_nr_running ;
7156
+ cfs_rq -> h_nr_delayed -= h_nr_delayed ;
7117
7157
7118
7158
if (cfs_rq_is_idle (cfs_rq ))
7119
7159
idle_h_nr_running = h_nr_running ;
@@ -7152,6 +7192,7 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags)
7152
7192
7153
7193
cfs_rq -> h_nr_running -= h_nr_running ;
7154
7194
cfs_rq -> idle_h_nr_running -= idle_h_nr_running ;
7195
+ cfs_rq -> h_nr_delayed -= h_nr_delayed ;
7155
7196
7156
7197
if (cfs_rq_is_idle (cfs_rq ))
7157
7198
idle_h_nr_running = h_nr_running ;
@@ -8780,7 +8821,7 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int
8780
8821
if (unlikely (throttled_hierarchy (cfs_rq_of (pse ))))
8781
8822
return ;
8782
8823
8783
- if (sched_feat (NEXT_BUDDY ) && !(wake_flags & WF_FORK )) {
8824
+ if (sched_feat (NEXT_BUDDY ) && !(wake_flags & WF_FORK ) && ! pse -> sched_delayed ) {
8784
8825
set_next_buddy (pse );
8785
8826
}
8786
8827
0 commit comments