All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Cc: Li Zhong <zhong@linux.vnet.ibm.com>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Paul Mackerras <paulus@samba.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	PowerPC email list <linuxppc-dev@lists.ozlabs.org>
Subject: Re: [PATCH] cpuidle: (POWER) Replace pseries_notify_cpuidle_add call with a elegant notifier to fix lockdep problem in start_secondary
Date: Mon, 21 May 2012 10:47:01 +1000	[thread overview]
Message-ID: <1337561221.2458.1.camel@pasglop> (raw)
In-Reply-To: <4FB64E9A.3060100@linux.vnet.ibm.com>

On Fri, 2012-05-18 at 18:58 +0530, Deepthi Dharwar wrote:
> The following patch is to remove the pseries_notify_add_cpu() call
> and replace it by a hot plug notifier.
> This would prevent cpuidle resources being
> released and allocated each time cpu comes online on pseries.
> The earlier design was causing a lockdep problem
> in start_secondary as reported on this thread
>         -https://lkml.org/lkml/2012/5/17/2
> 
> This applies on 3.4-rc7
> 
> Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
> ---

Any reason why you don't do cpuidle_disable_device() when the
CPU is going offline and cpuidle_enable_device() when it's coming
back ?

I'm applying the patch for now since it fixes a real problem but
if the above makes sense, please send a followup fix.

Cheers,
Ben.

>  arch/powerpc/include/asm/processor.h            |    2 --
>  arch/powerpc/platforms/pseries/processor_idle.c |   25
> +++++++++++++++++------
>  arch/powerpc/platforms/pseries/smp.c            |    1 -
>  3 files changed, 19 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/processor.h
> b/arch/powerpc/include/asm/processor.h
> index 8e2d037..c6bc22b 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -390,10 +390,8 @@ void cpu_idle_wait(void);
> 
>  #ifdef CONFIG_PSERIES_IDLE
>  extern void update_smt_snooze_delay(int snooze);
> -extern int pseries_notify_cpuidle_add_cpu(int cpu);
>  #else
>  static inline void update_smt_snooze_delay(int snooze) {}
> -static inline int pseries_notify_cpuidle_add_cpu(int cpu) { return 0; }
>  #endif
> 
>  extern void flush_instruction_cache(void);
> diff --git a/arch/powerpc/platforms/pseries/processor_idle.c
> b/arch/powerpc/platforms/pseries/processor_idle.c
> index 41a34bc..d1a7dc0 100644
> --- a/arch/powerpc/platforms/pseries/processor_idle.c
> +++ b/arch/powerpc/platforms/pseries/processor_idle.c
> @@ -11,6 +11,7 @@
>  #include <linux/moduleparam.h>
>  #include <linux/cpuidle.h>
>  #include <linux/cpu.h>
> +#include <linux/notifier.h>
> 
>  #include <asm/paca.h>
>  #include <asm/reg.h>
> @@ -186,17 +187,28 @@ static struct cpuidle_state
> shared_states[MAX_IDLE_STATE_COUNT] = {
>  		.enter = &shared_cede_loop },
>  };
> 
> -int pseries_notify_cpuidle_add_cpu(int cpu)
> +static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
> +			unsigned long action, void *hcpu)
>  {
> +	int hotcpu = (unsigned long)hcpu;
>  	struct cpuidle_device *dev =
> -			per_cpu_ptr(pseries_cpuidle_devices, cpu);
> -	if (dev && cpuidle_get_driver()) {
> -		cpuidle_disable_device(dev);
> -		cpuidle_enable_device(dev);
> +			per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
> +
> +	switch (action & 0xf) {
> +	case CPU_ONLINE:
> +		if (dev && cpuidle_get_driver()) {
> +			cpuidle_disable_device(dev);
> +			cpuidle_enable_device(dev);
> +		}
> +		break;
>  	}
> -	return 0;
> +	return NOTIFY_OK;
>  }
> 
> +static struct notifier_block setup_hotplug_notifier = {
> +	.notifier_call = pseries_cpuidle_add_cpu_notifier,
> +};
> +
>  /*
>   * pseries_cpuidle_driver_init()
>   */
> @@ -321,6 +333,7 @@ static int __init pseries_processor_idle_init(void)
>  		return retval;
>  	}
> 
> +	register_cpu_notifier(&setup_hotplug_notifier);
>  	printk(KERN_DEBUG "pseries_idle_driver registered\n");
> 
>  	return 0;
> diff --git a/arch/powerpc/platforms/pseries/smp.c
> b/arch/powerpc/platforms/pseries/smp.c
> index e16bb8d..71706bc 100644
> --- a/arch/powerpc/platforms/pseries/smp.c
> +++ b/arch/powerpc/platforms/pseries/smp.c
> @@ -147,7 +147,6 @@ static void __devinit smp_xics_setup_cpu(int cpu)
>  	set_cpu_current_state(cpu, CPU_STATE_ONLINE);
>  	set_default_offline_state(cpu);
>  #endif
> -	pseries_notify_cpuidle_add_cpu(cpu);
>  }
> 
>  static int __devinit smp_pSeries_kick_cpu(int nr)



WARNING: multiple messages have this Message-ID (diff)
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Cc: PowerPC email list <linuxppc-dev@lists.ozlabs.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Paul Mackerras <paulus@samba.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Li Zhong <zhong@linux.vnet.ibm.com>
Subject: Re: [PATCH] cpuidle: (POWER) Replace pseries_notify_cpuidle_add call with a elegant notifier to fix lockdep problem in start_secondary
Date: Mon, 21 May 2012 10:47:01 +1000	[thread overview]
Message-ID: <1337561221.2458.1.camel@pasglop> (raw)
In-Reply-To: <4FB64E9A.3060100@linux.vnet.ibm.com>

On Fri, 2012-05-18 at 18:58 +0530, Deepthi Dharwar wrote:
> The following patch is to remove the pseries_notify_add_cpu() call
> and replace it by a hot plug notifier.
> This would prevent cpuidle resources being
> released and allocated each time cpu comes online on pseries.
> The earlier design was causing a lockdep problem
> in start_secondary as reported on this thread
>         -https://lkml.org/lkml/2012/5/17/2
> 
> This applies on 3.4-rc7
> 
> Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
> ---

Any reason why you don't do cpuidle_disable_device() when the
CPU is going offline and cpuidle_enable_device() when it's coming
back ?

I'm applying the patch for now since it fixes a real problem but
if the above makes sense, please send a followup fix.

Cheers,
Ben.

>  arch/powerpc/include/asm/processor.h            |    2 --
>  arch/powerpc/platforms/pseries/processor_idle.c |   25
> +++++++++++++++++------
>  arch/powerpc/platforms/pseries/smp.c            |    1 -
>  3 files changed, 19 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/processor.h
> b/arch/powerpc/include/asm/processor.h
> index 8e2d037..c6bc22b 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -390,10 +390,8 @@ void cpu_idle_wait(void);
> 
>  #ifdef CONFIG_PSERIES_IDLE
>  extern void update_smt_snooze_delay(int snooze);
> -extern int pseries_notify_cpuidle_add_cpu(int cpu);
>  #else
>  static inline void update_smt_snooze_delay(int snooze) {}
> -static inline int pseries_notify_cpuidle_add_cpu(int cpu) { return 0; }
>  #endif
> 
>  extern void flush_instruction_cache(void);
> diff --git a/arch/powerpc/platforms/pseries/processor_idle.c
> b/arch/powerpc/platforms/pseries/processor_idle.c
> index 41a34bc..d1a7dc0 100644
> --- a/arch/powerpc/platforms/pseries/processor_idle.c
> +++ b/arch/powerpc/platforms/pseries/processor_idle.c
> @@ -11,6 +11,7 @@
>  #include <linux/moduleparam.h>
>  #include <linux/cpuidle.h>
>  #include <linux/cpu.h>
> +#include <linux/notifier.h>
> 
>  #include <asm/paca.h>
>  #include <asm/reg.h>
> @@ -186,17 +187,28 @@ static struct cpuidle_state
> shared_states[MAX_IDLE_STATE_COUNT] = {
>  		.enter = &shared_cede_loop },
>  };
> 
> -int pseries_notify_cpuidle_add_cpu(int cpu)
> +static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
> +			unsigned long action, void *hcpu)
>  {
> +	int hotcpu = (unsigned long)hcpu;
>  	struct cpuidle_device *dev =
> -			per_cpu_ptr(pseries_cpuidle_devices, cpu);
> -	if (dev && cpuidle_get_driver()) {
> -		cpuidle_disable_device(dev);
> -		cpuidle_enable_device(dev);
> +			per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
> +
> +	switch (action & 0xf) {
> +	case CPU_ONLINE:
> +		if (dev && cpuidle_get_driver()) {
> +			cpuidle_disable_device(dev);
> +			cpuidle_enable_device(dev);
> +		}
> +		break;
>  	}
> -	return 0;
> +	return NOTIFY_OK;
>  }
> 
> +static struct notifier_block setup_hotplug_notifier = {
> +	.notifier_call = pseries_cpuidle_add_cpu_notifier,
> +};
> +
>  /*
>   * pseries_cpuidle_driver_init()
>   */
> @@ -321,6 +333,7 @@ static int __init pseries_processor_idle_init(void)
>  		return retval;
>  	}
> 
> +	register_cpu_notifier(&setup_hotplug_notifier);
>  	printk(KERN_DEBUG "pseries_idle_driver registered\n");
> 
>  	return 0;
> diff --git a/arch/powerpc/platforms/pseries/smp.c
> b/arch/powerpc/platforms/pseries/smp.c
> index e16bb8d..71706bc 100644
> --- a/arch/powerpc/platforms/pseries/smp.c
> +++ b/arch/powerpc/platforms/pseries/smp.c
> @@ -147,7 +147,6 @@ static void __devinit smp_xics_setup_cpu(int cpu)
>  	set_cpu_current_state(cpu, CPU_STATE_ONLINE);
>  	set_default_offline_state(cpu);
>  #endif
> -	pseries_notify_cpuidle_add_cpu(cpu);
>  }
> 
>  static int __devinit smp_pSeries_kick_cpu(int nr)

  reply	other threads:[~2012-05-21  0:47 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18 13:28 [PATCH] cpuidle: (POWER) Replace pseries_notify_cpuidle_add call with a elegant notifier to fix lockdep problem in start_secondary Deepthi Dharwar
2012-05-21  0:47 ` Benjamin Herrenschmidt [this message]
2012-05-21  0:47   ` Benjamin Herrenschmidt
2012-05-21  0:49   ` Benjamin Herrenschmidt
2012-05-21  0:49     ` Benjamin Herrenschmidt
2012-05-21  4:34     ` [PATCH RESEND] " Deepthi Dharwar
2012-05-21  4:34       ` Deepthi Dharwar
2012-05-21  4:55   ` [PATCH] " Deepthi Dharwar
2012-05-21  4:55     ` Deepthi Dharwar

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=1337561221.2458.1.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=deepthi@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=paulus@samba.org \
    --cc=zhong@linux.vnet.ibm.com \
    /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.