From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: lenb@kernel.org, linux-pm@vger.kernel.org, patches@linaro.org,
linaro-kernel@lists.linaro.org, Len Brown <len.brown@intel.com>
Subject: Re: [PATCH 2/2] x86: cpuidle: remove broadcast timer initialization
Date: Mon, 02 Sep 2013 16:02:20 +0200 [thread overview]
Message-ID: <52249A6C.4030205@linaro.org> (raw)
In-Reply-To: <4496036.lOTuXedAKS@vostro.rjw.lan>
On 08/20/2013 04:11 PM, Rafael J. Wysocki wrote:
> On Tuesday, July 30, 2013 03:54:28 PM Daniel Lezcano wrote:
>> Commit 89878baa73f0f1c679355006bd8632e5d78f96c2 introduced the flag
>> CPUIDLE_FLAG_TIMER_STOP where we specify a specific idle state stops the local
>> timer.
>>
>> Commit a06df062a189a8d5588babb8bf0bb78672497798 introduced the initialization
>> of the timer broadcast framework depending of the flag presence.
>>
>> We have now a way to set a flag for a specific state to tell if the local timer
>> will be down in deep idle state or not and we have cpu hotplug support to setup
>> the broadcast timer.
>
> So this depends on [1/2], right?
Yes, that's correct.
>> Remove the timer broadcast initialization from init and at the cpu hotplug
>> time.
>>
>> Remove the timer broadcast activation in the idle loop.
>>
>> Remove the bitmap LAPIC_TIMER_ALWAYS_RELIABLE.
>>
>> Set the CPUIDLE_FLAG_TIMER_STOP on the states when they are greater than C1 and
>> the cpu has not X86_FEATURE_ARAT.
>>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>
> I generally like the changes made by this patch, but I wonder how much it
> has been tested?
Well it has been tested on my laptop which is an i5-3317.
With lapic_tsc_reliable_states 0xffffffff
> The subject is slightly misleading too, because it's about the intel_idle
> driver. Please put intel_idle in the subject.
Ok, sure.
>> ---
>> drivers/idle/intel_idle.c | 41 ++++-------------------------------------
>> 1 file changed, 4 insertions(+), 37 deletions(-)
>>
>> diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
>> index fa6964d..a975868 100644
>> --- a/drivers/idle/intel_idle.c
>> +++ b/drivers/idle/intel_idle.c
>> @@ -55,7 +55,6 @@
>>
>> #include <linux/kernel.h>
>> #include <linux/cpuidle.h>
>> -#include <linux/clockchips.h>
>> #include <trace/events/power.h>
>> #include <linux/sched.h>
>> #include <linux/notifier.h>
>> @@ -77,10 +76,6 @@ static int max_cstate = CPUIDLE_STATE_MAX - 1;
>>
>> static unsigned int mwait_substates;
>>
>> -#define LAPIC_TIMER_ALWAYS_RELIABLE 0xFFFFFFFF
>> -/* Reliable LAPIC Timer States, bit 1 for C1 etc. */
>> -static unsigned int lapic_timer_reliable_states = (1 << 1); /* Default to only C1 */
>> -
>> struct idle_cpu {
>> struct cpuidle_state *state_table;
>>
>> @@ -356,9 +351,6 @@ static int intel_idle(struct cpuidle_device *dev,
>> if (state->flags & CPUIDLE_FLAG_TLB_FLUSHED)
>> leave_mm(cpu);
>>
>> - if (!(lapic_timer_reliable_states & (1 << (cstate))))
>> - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
>> -
>> if (!need_resched()) {
>>
>> __monitor((void *)¤t_thread_info()->flags, 0, 0);
>> @@ -367,23 +359,9 @@ static int intel_idle(struct cpuidle_device *dev,
>> __mwait(eax, ecx);
>> }
>>
>> - if (!(lapic_timer_reliable_states & (1 << (cstate))))
>> - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
>> -
>> return index;
>> }
>>
>> -static void __setup_broadcast_timer(void *arg)
>> -{
>> - unsigned long reason = (unsigned long)arg;
>> - int cpu = smp_processor_id();
>> -
>> - reason = reason ?
>> - CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;
>> -
>> - clockevents_notify(reason, &cpu);
>> -}
>> -
>> static int cpu_hotplug_notify(struct notifier_block *n,
>> unsigned long action, void *hcpu)
>> {
>> @@ -393,10 +371,6 @@ static int cpu_hotplug_notify(struct notifier_block *n,
>> switch (action & 0xf) {
>> case CPU_ONLINE:
>>
>> - if (lapic_timer_reliable_states != LAPIC_TIMER_ALWAYS_RELIABLE)
>> - smp_call_function_single(hotcpu, __setup_broadcast_timer,
>> - (void *)true, 1);
>> -
>> /*
>> * Some systems can hotplug a cpu at runtime after
>> * the kernel has booted, we have to initialize the
>> @@ -524,16 +498,9 @@ static int intel_idle_probe(void)
>> icpu = (const struct idle_cpu *)id->driver_data;
>> cpuidle_state_table = icpu->state_table;
>>
>> - if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
>> - lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE;
>> - else
>> - on_each_cpu(__setup_broadcast_timer, (void *)true, 1);
>> -
>> pr_debug(PREFIX "v" INTEL_IDLE_VERSION
>> " model 0x%X\n", boot_cpu_data.x86_model);
>>
>> - pr_debug(PREFIX "lapic_timer_reliable_states 0x%x\n",
>> - lapic_timer_reliable_states);
>> return 0;
>> }
>>
>> @@ -594,6 +561,10 @@ static int intel_idle_cpuidle_driver_init(void)
>> mark_tsc_unstable("TSC halts in idle"
>> " states deeper than C2");
>>
>> + if (cstate > 1 && !boot_cpu_has(X86_FEATURE_ARAT))
>> + cpuidle_state_table[cstate].flags |=
>> + CPUIDLE_FLAG_TIMER_STOP;
>> +
>> drv->states[drv->state_count] = /* structure copy */
>> cpuidle_state_table[cstate];
>>
>> @@ -705,10 +676,6 @@ static void __exit intel_idle_exit(void)
>> {
>> intel_idle_cpuidle_devices_uninit();
>> cpuidle_unregister_driver(&intel_idle_driver);
>> -
>> -
>> - if (lapic_timer_reliable_states != LAPIC_TIMER_ALWAYS_RELIABLE)
>> - on_each_cpu(__setup_broadcast_timer, (void *)false, 1);
>> unregister_cpu_notifier(&cpu_hotplug_notifier);
>>
>> return;
>>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
next prev parent reply other threads:[~2013-09-02 14:02 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-30 13:54 [PATCH 1/2] cpuidle: add hotplug support to initialize the timer broadcast Daniel Lezcano
2013-07-30 13:54 ` [PATCH 2/2] x86: cpuidle: remove broadcast timer initialization Daniel Lezcano
2013-08-20 14:11 ` Rafael J. Wysocki
2013-09-02 14:02 ` Daniel Lezcano [this message]
2013-08-06 8:36 ` [PATCH 1/2] cpuidle: add hotplug support to initialize the timer broadcast Daniel Lezcano
2013-08-06 14:10 ` Rafael J. Wysocki
2013-08-06 14:11 ` Daniel Lezcano
2013-08-20 14:07 ` Rafael J. Wysocki
2013-09-02 13:29 ` Daniel Lezcano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52249A6C.4030205@linaro.org \
--to=daniel.lezcano@linaro.org \
--cc=len.brown@intel.com \
--cc=lenb@kernel.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-pm@vger.kernel.org \
--cc=patches@linaro.org \
--cc=rjw@sisk.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.