2009-12-14 08:11:01

by Hidetoshi Seto

[permalink] [raw]
Subject: [PATCH] acpi: fix for lapic_timer_propagate_broadcast()

I got following warning on ia64 box:
In function 'acpi_processor_power_verify':
642: warning: passing argument 2 of 'smp_call_function_single' from
incompatible pointer type

This smp_call_function_single() was introduced by a commit
f833bab87fca5c3ce13778421b1365845843b976:

> @@ -162,8 +162,9 @@
> pr->power.timer_broadcast_on_state = state;
> }
>
> -static void lapic_timer_propagate_broadcast(struct acpi_processor *pr)
> +static void lapic_timer_propagate_broadcast(void *arg)
> {
> + struct acpi_processor *pr = (struct acpi_processor *) arg;
> unsigned long reason;
>
> reason = pr->power.timer_broadcast_on_state < INT_MAX ?
> @@ -635,7 +636,8 @@
> working++;
> }
>
> - lapic_timer_propagate_broadcast(pr);
> + smp_call_function_single(pr->id, lapic_timer_propagate_broadcast,
> + pr, 1);
>
> return (working);
> }

The problem is that the lapic_timer_propagate_broadcast() has 2 versions:
One is real code that modified in the above commit, and the other is NOP
code that used when !ARCH_APICTIMER_STOPS_ON_C3:

static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) { }

So I got warning because of !ARCH_APICTIMER_STOPS_ON_C3.

We really want to do nothing here on !ARCH_APICTIMER_STOPS_ON_C3, so
modify lapic_timer_propagate_broadcast() of real version to use
smp_call_function_single() in it.

Signed-off-by: Hidetoshi Seto <[email protected]>
Cc: Suresh Siddha <[email protected]>
Cc: Len Brown <[email protected]>
---
drivers/acpi/processor_idle.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index bbd066e..d1676b1 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -164,7 +164,7 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr,
pr->power.timer_broadcast_on_state = state;
}

-static void lapic_timer_propagate_broadcast(void *arg)
+static void __lapic_timer_propagate_broadcast(void *arg)
{
struct acpi_processor *pr = (struct acpi_processor *) arg;
unsigned long reason;
@@ -175,6 +175,12 @@ static void lapic_timer_propagate_broadcast(void *arg)
clockevents_notify(reason, &pr->id);
}

+static void lapic_timer_propagate_broadcast(struct acpi_processor *pr)
+{
+ smp_call_function_single(pr->id, __lapic_timer_propagate_broadcast,
+ (void *)pr, 1);
+}
+
/* Power(C) State timer broadcast control */
static void lapic_timer_state_broadcast(struct acpi_processor *pr,
struct acpi_processor_cx *cx,
@@ -638,8 +644,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
working++;
}

- smp_call_function_single(pr->id, lapic_timer_propagate_broadcast,
- pr, 1);
+ lapic_timer_propagate_broadcast(pr);

return (working);
}
--
1.6.5.6


2009-12-14 18:38:47

by Suresh Siddha

[permalink] [raw]
Subject: Re: [PATCH] acpi: fix for lapic_timer_propagate_broadcast()

On Mon, 2009-12-14 at 00:10 -0800, Hidetoshi Seto wrote:
> I got following warning on ia64 box:
> In function 'acpi_processor_power_verify':
> 642: warning: passing argument 2 of 'smp_call_function_single' from
> incompatible pointer type
>
> This smp_call_function_single() was introduced by a commit
> f833bab87fca5c3ce13778421b1365845843b976:
>
> > @@ -162,8 +162,9 @@
> > pr->power.timer_broadcast_on_state = state;
> > }
> >
> > -static void lapic_timer_propagate_broadcast(struct acpi_processor *pr)
> > +static void lapic_timer_propagate_broadcast(void *arg)
> > {
> > + struct acpi_processor *pr = (struct acpi_processor *) arg;
> > unsigned long reason;
> >
> > reason = pr->power.timer_broadcast_on_state < INT_MAX ?
> > @@ -635,7 +636,8 @@
> > working++;
> > }
> >
> > - lapic_timer_propagate_broadcast(pr);
> > + smp_call_function_single(pr->id, lapic_timer_propagate_broadcast,
> > + pr, 1);
> >
> > return (working);
> > }
>
> The problem is that the lapic_timer_propagate_broadcast() has 2 versions:
> One is real code that modified in the above commit, and the other is NOP
> code that used when !ARCH_APICTIMER_STOPS_ON_C3:
>
> static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) { }
>
> So I got warning because of !ARCH_APICTIMER_STOPS_ON_C3.
>
> We really want to do nothing here on !ARCH_APICTIMER_STOPS_ON_C3, so
> modify lapic_timer_propagate_broadcast() of real version to use
> smp_call_function_single() in it.
>
> Signed-off-by: Hidetoshi Seto <[email protected]>

Acked-by: Suresh Siddha <[email protected]>

Len, please push this in to your tree.

thanks,
suresh

2009-12-16 09:14:19

by Len Brown

[permalink] [raw]
Subject: Re: [PATCH] acpi: fix for lapic_timer_propagate_broadcast()


> Acked-by: Suresh Siddha <[email protected]>

applied

thanks,
Len Brown, Intel Open Source Technology Center