|
@@ -5564,6 +5564,7 @@ static unsigned long scale_rt_power(int cpu)
|
|
{
|
|
{
|
|
struct rq *rq = cpu_rq(cpu);
|
|
struct rq *rq = cpu_rq(cpu);
|
|
u64 total, available, age_stamp, avg;
|
|
u64 total, available, age_stamp, avg;
|
|
|
|
+ s64 delta;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Since we're reading these variables without serialization make sure
|
|
* Since we're reading these variables without serialization make sure
|
|
@@ -5572,7 +5573,11 @@ static unsigned long scale_rt_power(int cpu)
|
|
age_stamp = ACCESS_ONCE(rq->age_stamp);
|
|
age_stamp = ACCESS_ONCE(rq->age_stamp);
|
|
avg = ACCESS_ONCE(rq->rt_avg);
|
|
avg = ACCESS_ONCE(rq->rt_avg);
|
|
|
|
|
|
- total = sched_avg_period() + (rq_clock(rq) - age_stamp);
|
|
|
|
|
|
+ delta = rq_clock(rq) - age_stamp;
|
|
|
|
+ if (unlikely(delta < 0))
|
|
|
|
+ delta = 0;
|
|
|
|
+
|
|
|
|
+ total = sched_avg_period() + delta;
|
|
|
|
|
|
if (unlikely(total < avg)) {
|
|
if (unlikely(total < avg)) {
|
|
/* Ensures that power won't end up being negative */
|
|
/* Ensures that power won't end up being negative */
|