We should not (re)set slice protection in the sched_change pattern which calls put_prev_task() / set_next_task().
Unified · Split
| @@ -5445,7 +5445,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) · 5444 unmodified lines | |||
| 5445 | } | 5445 | } |
| 5446 | 5446 | ||
| 5447 | static void | 5447 | static void |
| 5448 | set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | 5448 | set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, bool first) |
| 5449 | { | 5449 | { |
| 5450 | clear_buddies(cfs_rq, se); | 5450 | clear_buddies(cfs_rq, se); |
| 5451 | 5451 | ||
| @@ -5460,7 +5460,8 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) · 8 unmodified lines | |||
| 5460 | __dequeue_entity(cfs_rq, se); | 5460 | __dequeue_entity(cfs_rq, se); |
| 5461 | update_load_avg(cfs_rq, se, UPDATE_TG); | 5461 | update_load_avg(cfs_rq, se, UPDATE_TG); |
| 5462 | 5462 | ||
| 5463 | set_protect_slice(cfs_rq, se); | 5463 | if (first) |
| 5464 | set_protect_slice(cfs_rq, se); | ||
| 5464 | } | 5465 | } |
| 5465 | 5466 | ||
| 5466 | update_stats_curr_start(cfs_rq, se); | 5467 | update_stats_curr_start(cfs_rq, se); |
| @@ -8978,13 +8979,13 @@ again: · 3511 unmodified lines | |||
| 8978 | pse = parent_entity(pse); | 8979 | pse = parent_entity(pse); |
| 8979 | } | 8980 | } |
| 8980 | if (se_depth >= pse_depth) { | 8981 | if (se_depth >= pse_depth) { |
| 8981 | set_next_entity(cfs_rq_of(se), se); | 8982 | set_next_entity(cfs_rq_of(se), se, true); |
| 8982 | se = parent_entity(se); | 8983 | se = parent_entity(se); |
| 8983 | } | 8984 | } |
| 8984 | } | 8985 | } |
| 8985 | 8986 | ||
| 8986 | put_prev_entity(cfs_rq, pse); | 8987 | put_prev_entity(cfs_rq, pse); |
| 8987 | set_next_entity(cfs_rq, se); | 8988 | set_next_entity(cfs_rq, se, true); |
| 8988 | 8989 | ||
| 8989 | __set_next_task_fair(rq, p, true); | 8990 | __set_next_task_fair(rq, p, true); |
| 8990 | } | 8991 | } |
| @@ -13598,7 +13599,7 @@ static void set_next_task_fair(struct rq *rq, struct task_struct *p, bool first) · 4607 unmodified lines | |||
| 13598 | for_each_sched_entity(se) { | 13599 | for_each_sched_entity(se) { |
| 13599 | struct cfs_rq *cfs_rq = cfs_rq_of(se); | 13600 | struct cfs_rq *cfs_rq = cfs_rq_of(se); |
| 13600 | 13601 | ||
| 13601 | set_next_entity(cfs_rq, se); | 13602 | set_next_entity(cfs_rq, se, first); |
| 13602 | /* ensure bandwidth has been allocated on our new cfs_rq */ | 13603 | /* ensure bandwidth has been allocated on our new cfs_rq */ |
| 13603 | account_cfs_rq_runtime(cfs_rq, 0); | 13604 | account_cfs_rq_runtime(cfs_rq, 0); |
| 13604 | } | 13605 | } |