| @@ -1159,8 +1159,6 @@ static inline void update_curr_task(struct task_struct *p, s64 delta_exec) · 1158 unmodified lines |
| 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) · 70 unmodified lines |
| 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) · 4223 unmodified lines |
| 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) · 4 unmodified lines |
| 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) · 10 unmodified lines |
| 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) · 16 unmodified lines |
| 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) · 383 unmodified lines |
| 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) · 26 unmodified lines |
| 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) · 17 unmodified lines |
| 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) · 16 unmodified lines |
| 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) · 19 unmodified lines |
| 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) · 29 unmodified lines |
| 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) · 11 unmodified lines |
| 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) · 11 unmodified lines |
| 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) · 847 unmodified lines |
| 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) · 7 unmodified lines |
| 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) · 20 unmodified lines |
| 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) · 16 unmodified lines |
| 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) · 17 unmodified lines |
| 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,6 +7126,7 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) · 56 unmodified lines |
| 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 | |
| @@ -7097,6 +7134,8 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) · 1 unmodified line |
| 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) · 11 unmodified lines |
| 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) · 32 unmodified lines |
| 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 · 1622 unmodified lines |
| 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 | |