Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4560e7c3 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

s390/vtime: correct idle time calculation



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.

Cc: stable@vger.kernel.org # 3.6+
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 7ab64a85
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -920,7 +920,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);
@@ -938,7 +938,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);
}
+1 −1
Original line number Diff line number Diff line
@@ -191,7 +191,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;
}