mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-03 17:51:57 +09:00
s390/vtime: correct idle time calculation
commit 4560e7c331 upstream.
Use the ACCESS_ONCE macro for both accesses to idle->sequence in the
loops to calculate the idle time. If only one access uses the macro,
the compiler is free to cache the value for the second access which
can cause endless loops.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f3170c7a91
commit
d4f2a840c7
@@ -933,7 +933,7 @@ static ssize_t show_idle_count(struct device *dev,
|
||||
idle_count = ACCESS_ONCE(idle->idle_count);
|
||||
if (ACCESS_ONCE(idle->clock_idle_enter))
|
||||
idle_count++;
|
||||
} while ((sequence & 1) || (idle->sequence != sequence));
|
||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||
return sprintf(buf, "%llu\n", idle_count);
|
||||
}
|
||||
static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL);
|
||||
@@ -951,7 +951,7 @@ static ssize_t show_idle_time(struct device *dev,
|
||||
idle_time = ACCESS_ONCE(idle->idle_time);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||
} while ((sequence & 1) || (idle->sequence != sequence));
|
||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||
idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0;
|
||||
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ cputime64_t s390_get_idle_time(int cpu)
|
||||
sequence = ACCESS_ONCE(idle->sequence);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||
} while ((sequence & 1) || (idle->sequence != sequence));
|
||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||
return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user