[Skiboot] [PATCH] Ensure we run pollers in cpu_wait_job()
Stewart Smith
stewart at linux.vnet.ibm.com
Wed Oct 7 10:48:42 AEDT 2015
In root causing a bug on AST BMC Alistair found that pollers weren't
being run for around 3800ms.
This was due to a wonderful accident that's probably about a year or more
old where:
In cpu_wait_job we have:
unsigned long ticks = usecs_to_tb(5);
...
time_wait(ticks);
While in time_wait(), deciding on if to run pollers:
unsigned long period = msecs_to_tb(5);
...
if (remaining >= period) {
Obviously, this means we never run pollers. Not ideal.
This patch ensures we run pollers every 5ms in cpu_wait_job() as well
as displaying how long we waited for a job if that wait was >1second.
Reported-by: Alistair Popple <alistair at popple.id.au>
Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
---
core/cpu.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/core/cpu.c b/core/cpu.c
index 8b0f861..d905ebe 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -129,17 +129,26 @@ bool cpu_poll_job(struct cpu_job *job)
void cpu_wait_job(struct cpu_job *job, bool free_it)
{
unsigned long ticks = usecs_to_tb(5);
+ unsigned long period = msecs_to_tb(5);
+ unsigned long time_waited = 0;
if (!job)
return;
while(!job->complete) {
time_wait(ticks);
+ time_waited+=ticks;
+ if (time_waited % period == 0)
+ opal_run_pollers();
lwsync();
}
lwsync();
smt_medium();
+ if (time_waited > msecs_to_tb(1000))
+ prlog(PR_DEBUG, "cpu_wait_job(%s) for %d\n",
+ job->name, tb_to_msecs(time_waited));
+
if (free_it)
free(job);
}
--
2.1.4
More information about the Skiboot
mailing list