Commit 3a44e838 authored by Zhang Qiao's avatar Zhang Qiao Committed by Yongqiang Liu
Browse files

sched: Reinit task's vruntime if a task sleep over 200 days

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I67BL1


CVE: NA

-------------------------------

If a task sleep for long time, it maybe cause a s64 overflow
issue at max_vruntime() and the task will be set an incorrect
vruntime, lead to the task be starve.

For fix it, we set the task's vruntime as cfs_rq->min_vruntime
when wakeup.

Signed-off-by: default avatarZhang Qiao <zhangqiao22@huawei.com>
Reviewed-by: default avatarChen Hui <judy.chenhui@huawei.com>
Reviewed-by: default avatarsongping yu <yusongping@huawei.com>
Signed-off-by: default avatarYongqiang Liu <liuyongqiang13@huawei.com>
parent 3d8caf7a
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -3949,10 +3949,14 @@ static void check_spread(struct cfs_rq *cfs_rq, struct sched_entity *se)
#endif
}

/* The threshold when the wakee's vruntime should be set cfs_rq->min_vruntime, default: 200 days */
#define WAKEUP_REINIT_THRESHOLD_NS     (200 * 24 * 3600 * NSEC_PER_SEC)

static void
place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
{
	u64 vruntime = cfs_rq->min_vruntime;
	struct rq *rq = rq_of(cfs_rq);

	/*
	 * The 'current' period is already promised to the current tasks,
@@ -3977,6 +3981,9 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
		vruntime -= thresh;
	}

	if (unlikely(!initial && (s64)(rq_clock_task(rq) - se->exec_start) > WAKEUP_REINIT_THRESHOLD_NS))
		se->vruntime = vruntime;
	else
	/* ensure we never gain time by being placed backwards. */
		se->vruntime = max_vruntime(se->vruntime, vruntime);
}