summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index f6492a1755fc..1b6839ecdf1d 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1517,19 +1517,20 @@ unsigned long sched_get_busy(int cpu)
int sched_set_window(u64 window_start, unsigned int window_size)
{
int cpu;
- u64 ws;
- u64 now = get_jiffies_64();
+ u64 wallclock, ws, now;
int delta;
unsigned long flags;
- u64 wallclock;
struct task_struct *g, *p;
- if (sched_use_pelt)
- return -EINVAL;
+ if (sched_use_pelt ||
+ (window_size * TICK_NSEC < MIN_SCHED_RAVG_WINDOW))
+ return -EINVAL;
- delta = window_start - now; /* how many jiffies ahead */
+ local_irq_save(flags);
- if (delta > 0) {
+ now = get_jiffies_64();
+ if (time_after64(window_start, now)) {
+ delta = window_start - now; /* how many jiffies ahead */
delta /= window_size; /* # of windows to roll back */
delta += 1;
window_start -= (delta * window_size);
@@ -1541,8 +1542,6 @@ int sched_set_window(u64 window_start, unsigned int window_size)
BUG_ON(sched_clock() < ws);
- local_irq_save(flags);
-
for_each_online_cpu(cpu) {
struct rq *rq = cpu_rq(cpu);
raw_spin_lock(&rq->lock);