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 | 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 | 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 | 5460 | __dequeue_entity(cfs_rq, se); |
| 5461 | 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 | 5467 | update_stats_curr_start(cfs_rq, se); |
| @@ -8978,13 +8979,13 @@ again: · 3511 unmodified lines | ||
| 8978 | 8979 | pse = parent_entity(pse); |
| 8979 | 8980 | } |
| 8980 | 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 | 8983 | se = parent_entity(se); |
| 8983 | 8984 | } |
| 8984 | 8985 | } |
| 8985 | 8986 | |
| 8986 | 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 | 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 | 13599 | for_each_sched_entity(se) { |
| 13599 | 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 | 13603 | /* ensure bandwidth has been allocated on our new cfs_rq */ |
| 13603 | 13604 | account_cfs_rq_runtime(cfs_rq, 0); |
| 13604 | 13605 | } |