2009-04-13 00:08:26

by Rusty Russell

[permalink] [raw]
Subject: [PATCH 1/7] use smp_call_function_single() in arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c

From: Andrew Morton <[email protected]>

Impact: fix sysbench(oltp)+mysql 10% regression with 2.6.30-rc1

Mike says:
It's kondemand, do_dbs_timer() is queueing work 9-14 times/sec/cpu.

Tested-by: Mike Galbraith <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Venkatesh Pallipadi <[email protected]>
Cc: Len Brown <[email protected]>
Cc: Zhao Yakui <[email protected]>
Cc: Dave Jones <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Rusty Russell <[email protected]> (use rdmsr_on_cpu)
---
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -153,7 +153,8 @@ struct drv_cmd {
u32 val;
};

-static long do_drv_read(void *_cmd)
+/* Called via smp_call_function_single(), on the target CPU */
+static void do_drv_read(void *_cmd)
{
struct drv_cmd *cmd = _cmd;
u32 h;
@@ -170,10 +171,10 @@ static long do_drv_read(void *_cmd)
default:
break;
}
- return 0;
}

-static long do_drv_write(void *_cmd)
+/* Called via smp_call_function_single(), on the target CPU */
+static void do_drv_write(void *_cmd)
{
struct drv_cmd *cmd = _cmd;
u32 lo, hi;
@@ -192,23 +193,21 @@ static long do_drv_write(void *_cmd)
default:
break;
}
- return 0;
}

static void drv_read(struct drv_cmd *cmd)
{
cmd->val = 0;

- work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd);
+ smp_call_function_single(cpumask_any(cmd->mask), do_drv_read, cmd, 1);
}

static void drv_write(struct drv_cmd *cmd)
{
- unsigned int i;
+ unsigned int cpu;

- for_each_cpu(i, cmd->mask) {
- work_on_cpu(i, do_drv_write, cmd);
- }
+ for_each_cpu(cpu, cmd->mask)
+ smp_call_function_single(cpu, do_drv_write, cmd, 1);
}

static u32 get_cur_val(const struct cpumask *mask)
@@ -253,14 +252,13 @@ struct perf_pair {
};


-static long read_measured_perf_ctrs(void *_cur)
+/* Called via smp_call_function_single(), on the target CPU */
+static void read_measured_perf_ctrs(void *_cur)
{
struct perf_pair *cur = _cur;

rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
-
- return 0;
}

/*
@@ -283,7 +281,7 @@ static unsigned int get_measured_perf(st
unsigned int perf_percent;
unsigned int retval;

- if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin))
+ if (!smp_call_function_single(cpu, read_measured_perf_ctrs, &readin, 1))
return 0;

cur.aperf.whole = readin.aperf.whole -


2009-04-13 00:19:25

by Dave Jones

[permalink] [raw]
Subject: Re: [PATCH 1/7] use smp_call_function_single() in arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c

On Mon, Apr 13, 2009 at 09:30:02AM +0930, Rusty Russell wrote:
> From: Andrew Morton <[email protected]>
>
> Impact: fix sysbench(oltp)+mysql 10% regression with 2.6.30-rc1
>

This, and the other cpufreq related patches in this series look sound to me.
Given the other non-cpufreq bits in the series, do you want to just
have these go through Andrew and onto Linus?

Dave

2009-04-13 03:41:54

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH 1/7] use smp_call_function_single() in arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c


* Dave Jones <[email protected]> wrote:

> On Mon, Apr 13, 2009 at 09:30:02AM +0930, Rusty Russell wrote:
> > From: Andrew Morton <[email protected]>
> >
> > Impact: fix sysbench(oltp)+mysql 10% regression with 2.6.30-rc1
> >
>
> This, and the other cpufreq related patches in this series look
> sound to me. Given the other non-cpufreq bits in the series, do
> you want to just have these go through Andrew and onto Linus?

the other x86 bits look good to me too. It would be best to do this
via -mm because the regression was introduced from there too so the
'lets do a revert and these patches in the next cycle' versus 'lets
do these fixes right now' decision should be driven from there too.

Thanks,

Ingo

2009-04-14 09:06:01

by Rusty Russell

[permalink] [raw]
Subject: Re: [PATCH 1/7] use smp_call_function_single() in arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c

On Mon, 13 Apr 2009 09:46:57 am Dave Jones wrote:
> On Mon, Apr 13, 2009 at 09:30:02AM +0930, Rusty Russell wrote:
> > From: Andrew Morton <[email protected]>
> >
> > Impact: fix sysbench(oltp)+mysql 10% regression with 2.6.30-rc1
> >
>
> This, and the other cpufreq related patches in this series look sound to me.
> Given the other non-cpufreq bits in the series, do you want to just
> have these go through Andrew and onto Linus?

Sure, that's certainly easiest for me. I'd assumed Ingo would snarf them,
but as he's suggested -mm, Andrew?

Thanks!
Rusty.

2009-04-14 11:07:28

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH 1/7] use smp_call_function_single() in arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c


* Rusty Russell <[email protected]> wrote:

> On Mon, 13 Apr 2009 09:46:57 am Dave Jones wrote:
> > On Mon, Apr 13, 2009 at 09:30:02AM +0930, Rusty Russell wrote:
> > > From: Andrew Morton <[email protected]>
> > >
> > > Impact: fix sysbench(oltp)+mysql 10% regression with 2.6.30-rc1
> > >
> >
> > This, and the other cpufreq related patches in this series look
> > sound to me. Given the other non-cpufreq bits in the series, do
> > you want to just have these go through Andrew and onto Linus?
>
> Sure, that's certainly easiest for me. I'd assumed Ingo would
> snarf them, but as he's suggested -mm, Andrew?

I tend to let the snarfing be done by the tree which introduced a
regression to begin with ;-)

Ingo