forked from Minki/linux
cpuidle: pseries: Fix CEDE latency conversion from tb to us
Commitd947fb4c96
("cpuidle: pseries: Fixup exit latency for CEDE(0)") sets the exit latency of CEDE(0) based on the latency values of the Extended CEDE states advertised by the platform. The values advertised by the platform are in timebase ticks. However the cpuidle framework requires the latency values in microseconds. If the tb-ticks value advertised by the platform correspond to a value smaller than 1us, during the conversion from tb-ticks to microseconds, in the current code, the result becomes zero. This is incorrect as it puts a CEDE state on par with the snooze state. This patch fixes this by rounding up the result obtained while converting the latency value from tb-ticks to microseconds. It also prints a warning in case we discover an extended-cede state with wakeup latency to be 0. In such a case, ensure that CEDE(0) has a non-zero wakeup latency. Fixes:d947fb4c96
("cpuidle: pseries: Fixup exit latency for CEDE(0)") Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/1599125247-28488-1-git-send-email-ego@linux.vnet.ibm.com
This commit is contained in:
parent
437ef802e0
commit
1d3ee7df00
@ -361,7 +361,10 @@ static void __init fixup_cede0_latency(void)
|
||||
for (i = 0; i < nr_xcede_records; i++) {
|
||||
struct xcede_latency_record *record = &payload->records[i];
|
||||
u64 latency_tb = be64_to_cpu(record->latency_ticks);
|
||||
u64 latency_us = tb_to_ns(latency_tb) / NSEC_PER_USEC;
|
||||
u64 latency_us = DIV_ROUND_UP_ULL(tb_to_ns(latency_tb), NSEC_PER_USEC);
|
||||
|
||||
if (latency_us == 0)
|
||||
pr_warn("cpuidle: xcede record %d has an unrealistic latency of 0us.\n", i);
|
||||
|
||||
if (latency_us < min_latency_us)
|
||||
min_latency_us = latency_us;
|
||||
@ -378,10 +381,14 @@ static void __init fixup_cede0_latency(void)
|
||||
* Perform the fix-up.
|
||||
*/
|
||||
if (min_latency_us < dedicated_states[1].exit_latency) {
|
||||
u64 cede0_latency = min_latency_us - 1;
|
||||
/*
|
||||
* We set a minimum of 1us wakeup latency for cede0 to
|
||||
* distinguish it from snooze
|
||||
*/
|
||||
u64 cede0_latency = 1;
|
||||
|
||||
if (cede0_latency <= 0)
|
||||
cede0_latency = min_latency_us;
|
||||
if (min_latency_us > cede0_latency)
|
||||
cede0_latency = min_latency_us - 1;
|
||||
|
||||
dedicated_states[1].exit_latency = cede0_latency;
|
||||
dedicated_states[1].target_residency = 10 * (cede0_latency);
|
||||
|
Loading…
Reference in New Issue
Block a user