Skip to content

Commit

Permalink
cpuidle: pseries: Set the latency-hint before entering CEDE
Browse files Browse the repository at this point in the history
As per the PAPR, each H_CEDE call is associated with a latency-hint to
be passed in the VPA field "cede_latency_hint". The CEDE states that
we were implicitly entering so far is CEDE with latency-hint = 0.

This patch explicitly sets the latency hint corresponding to the CEDE
state that we are currently entering. While at it, we save the
previous hint, to be restored once we wakeup from CEDE. This will be
required in the future when we expose extended-cede states through the
cpuidle framework, where each of them will have a different
cede-latency hint.

Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
[mpe: Make cede_latency_hint static]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1596087177-30329-2-git-send-email-ego@linux.vnet.ibm.com
  • Loading branch information
Gautham R. Shenoy authored and Michael Ellerman committed Jul 30, 2020
1 parent dfa03ff commit 3af0ada
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/cpuidle/cpuidle-pseries.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,19 +86,27 @@ static void check_and_cede_processor(void)
}
}

#define NR_DEDICATED_STATES 2 /* snooze, CEDE */

static u8 cede_latency_hint[NR_DEDICATED_STATES];

static int dedicated_cede_loop(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
{
u8 old_latency_hint;

pseries_idle_prolog();
get_lppaca()->donate_dedicated_cpu = 1;
old_latency_hint = get_lppaca()->cede_latency_hint;
get_lppaca()->cede_latency_hint = cede_latency_hint[index];

HMT_medium();
check_and_cede_processor();

local_irq_disable();
get_lppaca()->donate_dedicated_cpu = 0;
get_lppaca()->cede_latency_hint = old_latency_hint;

pseries_idle_epilog();

Expand Down Expand Up @@ -130,7 +138,7 @@ static int shared_cede_loop(struct cpuidle_device *dev,
/*
* States for dedicated partition case.
*/
static struct cpuidle_state dedicated_states[] = {
static struct cpuidle_state dedicated_states[NR_DEDICATED_STATES] = {
{ /* Snooze */
.name = "snooze",
.desc = "snooze",
Expand Down Expand Up @@ -233,7 +241,7 @@ static int pseries_idle_probe(void)
max_idle_state = ARRAY_SIZE(shared_states);
} else {
cpuidle_state_table = dedicated_states;
max_idle_state = ARRAY_SIZE(dedicated_states);
max_idle_state = NR_DEDICATED_STATES;
}
} else
return -ENODEV;
Expand Down

0 comments on commit 3af0ada

Please sign in to comment.