linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
@ 2019-08-28 18:56 Joao Martins
  2019-08-28 23:39 ` Rafael J. Wysocki
  2019-08-29 11:56 ` Marcelo Tosatti
  0 siblings, 2 replies; 6+ messages in thread
From: Joao Martins @ 2019-08-28 18:56 UTC (permalink / raw)
  To: kvm
  Cc: Joao Martins, Marcelo Tosatti, linux-kernel, Paolo Bonzini,
	Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, linux-pm,
	Boris Ostrovsky

When cpus != maxcpus cpuidle-haltpoll will fail to register all vcpus
past the online ones and thus fail to register the idle driver.
This is because cpuidle_add_sysfs() will return with -ENODEV as a
consequence from get_cpu_device() return no device for a non-existing
CPU.

Instead switch to cpuidle_register_driver() and manually register each
of the present cpus through cpuhp_setup_state() and future ones that
get onlined. This mimics similar logic as intel_idle.

Fixes: fa86ee90eb11 ("add cpuidle-haltpoll driver")
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
 arch/x86/include/asm/cpuidle_haltpoll.h |  4 +-
 arch/x86/kernel/kvm.c                   | 18 +++----
 drivers/cpuidle/cpuidle-haltpoll.c      | 65 +++++++++++++++++++++++--
 include/linux/cpuidle_haltpoll.h        |  4 +-
 4 files changed, 70 insertions(+), 21 deletions(-)

diff --git a/arch/x86/include/asm/cpuidle_haltpoll.h b/arch/x86/include/asm/cpuidle_haltpoll.h
index ff8607d81526..c8b39c6716ff 100644
--- a/arch/x86/include/asm/cpuidle_haltpoll.h
+++ b/arch/x86/include/asm/cpuidle_haltpoll.h
@@ -2,7 +2,7 @@
 #ifndef _ARCH_HALTPOLL_H
 #define _ARCH_HALTPOLL_H
 
-void arch_haltpoll_enable(void);
-void arch_haltpoll_disable(void);
+void arch_haltpoll_enable(unsigned int cpu);
+void arch_haltpoll_disable(unsigned int cpu);
 
 #endif
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 8d150e3732d9..a9b6c4e2446d 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -880,32 +880,26 @@ static void kvm_enable_host_haltpoll(void *i)
 	wrmsrl(MSR_KVM_POLL_CONTROL, 1);
 }
 
-void arch_haltpoll_enable(void)
+void arch_haltpoll_enable(unsigned int cpu)
 {
 	if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL)) {
-		printk(KERN_ERR "kvm: host does not support poll control\n");
-		printk(KERN_ERR "kvm: host upgrade recommended\n");
+		pr_err_once("kvm: host does not support poll control\n");
+		pr_err_once("kvm: host upgrade recommended\n");
 		return;
 	}
 
-	preempt_disable();
 	/* Enable guest halt poll disables host halt poll */
-	kvm_disable_host_haltpoll(NULL);
-	smp_call_function(kvm_disable_host_haltpoll, NULL, 1);
-	preempt_enable();
+	smp_call_function_single(cpu, kvm_disable_host_haltpoll, NULL, 1);
 }
 EXPORT_SYMBOL_GPL(arch_haltpoll_enable);
 
-void arch_haltpoll_disable(void)
+void arch_haltpoll_disable(unsigned int cpu)
 {
 	if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL))
 		return;
 
-	preempt_disable();
 	/* Enable guest halt poll disables host halt poll */
-	kvm_enable_host_haltpoll(NULL);
-	smp_call_function(kvm_enable_host_haltpoll, NULL, 1);
-	preempt_enable();
+	smp_call_function_single(cpu, kvm_enable_host_haltpoll, NULL, 1);
 }
 EXPORT_SYMBOL_GPL(arch_haltpoll_disable);
 #endif
diff --git a/drivers/cpuidle/cpuidle-haltpoll.c b/drivers/cpuidle/cpuidle-haltpoll.c
index 9ac093dcbb01..0d1853a7185e 100644
--- a/drivers/cpuidle/cpuidle-haltpoll.c
+++ b/drivers/cpuidle/cpuidle-haltpoll.c
@@ -11,12 +11,15 @@
  */
 
 #include <linux/init.h>
+#include <linux/cpu.h>
 #include <linux/cpuidle.h>
 #include <linux/module.h>
 #include <linux/sched/idle.h>
 #include <linux/kvm_para.h>
 #include <linux/cpuidle_haltpoll.h>
 
+static struct cpuidle_device __percpu *haltpoll_cpuidle_devices;
+
 static int default_enter_idle(struct cpuidle_device *dev,
 			      struct cpuidle_driver *drv, int index)
 {
@@ -46,6 +49,48 @@ static struct cpuidle_driver haltpoll_driver = {
 	.state_count = 2,
 };
 
+static int haltpoll_cpu_online(unsigned int cpu)
+{
+	struct cpuidle_device *dev;
+
+	dev = per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
+	if (!dev->registered) {
+		dev->cpu = cpu;
+		if (cpuidle_register_device(dev)) {
+			pr_notice("cpuidle_register_device %d failed!\n", cpu);
+			return -EIO;
+		}
+		arch_haltpoll_enable(cpu);
+	}
+
+	return 0;
+}
+
+static void haltpoll_uninit(void)
+{
+	unsigned int cpu;
+
+	cpus_read_lock();
+
+	for_each_online_cpu(cpu) {
+		struct cpuidle_device *dev =
+			per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
+
+		if (!dev->registered)
+			continue;
+
+		arch_haltpoll_disable(cpu);
+		cpuidle_unregister_device(dev);
+	}
+
+	cpuidle_unregister(&haltpoll_driver);
+
+	free_percpu(haltpoll_cpuidle_devices);
+	haltpoll_cpuidle_devices = NULL;
+
+	cpus_read_unlock();
+}
+
 static int __init haltpoll_init(void)
 {
 	int ret;
@@ -56,17 +101,27 @@ static int __init haltpoll_init(void)
 	if (!kvm_para_available())
 		return 0;
 
-	ret = cpuidle_register(&haltpoll_driver, NULL);
-	if (ret == 0)
-		arch_haltpoll_enable();
+	ret = cpuidle_register_driver(drv);
+	if (ret < 0)
+		return ret;
+
+	haltpoll_cpuidle_devices = alloc_percpu(struct cpuidle_device);
+	if (haltpoll_cpuidle_devices == NULL) {
+		cpuidle_unregister_driver(drv);
+		return -ENOMEM;
+	}
+
+	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/haltpoll:online",
+				haltpoll_cpu_online, NULL);
+	if (ret < 0)
+		haltpoll_uninit();
 
 	return ret;
 }
 
 static void __exit haltpoll_exit(void)
 {
-	arch_haltpoll_disable();
-	cpuidle_unregister(&haltpoll_driver);
+	haltpoll_uninit();
 }
 
 module_init(haltpoll_init);
diff --git a/include/linux/cpuidle_haltpoll.h b/include/linux/cpuidle_haltpoll.h
index fe5954c2409e..d50c1e0411a2 100644
--- a/include/linux/cpuidle_haltpoll.h
+++ b/include/linux/cpuidle_haltpoll.h
@@ -5,11 +5,11 @@
 #ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL
 #include <asm/cpuidle_haltpoll.h>
 #else
-static inline void arch_haltpoll_enable(void)
+static inline void arch_haltpoll_enable(unsigned int cpu)
 {
 }
 
-static inline void arch_haltpoll_disable(void)
+static inline void arch_haltpoll_disable(unsigned int cpu)
 {
 }
 #endif
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
  2019-08-28 18:56 [PATCH v1] cpuidle-haltpoll: vcpu hotplug support Joao Martins
@ 2019-08-28 23:39 ` Rafael J. Wysocki
  2019-08-29 11:56 ` Marcelo Tosatti
  1 sibling, 0 replies; 6+ messages in thread
From: Rafael J. Wysocki @ 2019-08-28 23:39 UTC (permalink / raw)
  To: Joao Martins, Paolo Bonzini
  Cc: kvm-devel, Marcelo Tosatti, Linux Kernel Mailing List,
	Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, Linux PM,
	Boris Ostrovsky

On Wed, Aug 28, 2019 at 8:58 PM Joao Martins <joao.m.martins@oracle.com> wrote:
>
> When cpus != maxcpus cpuidle-haltpoll will fail to register all vcpus
> past the online ones and thus fail to register the idle driver.
> This is because cpuidle_add_sysfs() will return with -ENODEV as a
> consequence from get_cpu_device() return no device for a non-existing
> CPU.
>
> Instead switch to cpuidle_register_driver() and manually register each
> of the present cpus through cpuhp_setup_state() and future ones that
> get onlined. This mimics similar logic as intel_idle.
>
> Fixes: fa86ee90eb11 ("add cpuidle-haltpoll driver")
> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>

Paolo, what do you think?

> ---
>  arch/x86/include/asm/cpuidle_haltpoll.h |  4 +-
>  arch/x86/kernel/kvm.c                   | 18 +++----
>  drivers/cpuidle/cpuidle-haltpoll.c      | 65 +++++++++++++++++++++++--
>  include/linux/cpuidle_haltpoll.h        |  4 +-
>  4 files changed, 70 insertions(+), 21 deletions(-)
>
> diff --git a/arch/x86/include/asm/cpuidle_haltpoll.h b/arch/x86/include/asm/cpuidle_haltpoll.h
> index ff8607d81526..c8b39c6716ff 100644
> --- a/arch/x86/include/asm/cpuidle_haltpoll.h
> +++ b/arch/x86/include/asm/cpuidle_haltpoll.h
> @@ -2,7 +2,7 @@
>  #ifndef _ARCH_HALTPOLL_H
>  #define _ARCH_HALTPOLL_H
>
> -void arch_haltpoll_enable(void);
> -void arch_haltpoll_disable(void);
> +void arch_haltpoll_enable(unsigned int cpu);
> +void arch_haltpoll_disable(unsigned int cpu);
>
>  #endif
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 8d150e3732d9..a9b6c4e2446d 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -880,32 +880,26 @@ static void kvm_enable_host_haltpoll(void *i)
>         wrmsrl(MSR_KVM_POLL_CONTROL, 1);
>  }
>
> -void arch_haltpoll_enable(void)
> +void arch_haltpoll_enable(unsigned int cpu)
>  {
>         if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL)) {
> -               printk(KERN_ERR "kvm: host does not support poll control\n");
> -               printk(KERN_ERR "kvm: host upgrade recommended\n");
> +               pr_err_once("kvm: host does not support poll control\n");
> +               pr_err_once("kvm: host upgrade recommended\n");
>                 return;
>         }
>
> -       preempt_disable();
>         /* Enable guest halt poll disables host halt poll */
> -       kvm_disable_host_haltpoll(NULL);
> -       smp_call_function(kvm_disable_host_haltpoll, NULL, 1);
> -       preempt_enable();
> +       smp_call_function_single(cpu, kvm_disable_host_haltpoll, NULL, 1);
>  }
>  EXPORT_SYMBOL_GPL(arch_haltpoll_enable);
>
> -void arch_haltpoll_disable(void)
> +void arch_haltpoll_disable(unsigned int cpu)
>  {
>         if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL))
>                 return;
>
> -       preempt_disable();
>         /* Enable guest halt poll disables host halt poll */
> -       kvm_enable_host_haltpoll(NULL);
> -       smp_call_function(kvm_enable_host_haltpoll, NULL, 1);
> -       preempt_enable();
> +       smp_call_function_single(cpu, kvm_enable_host_haltpoll, NULL, 1);
>  }
>  EXPORT_SYMBOL_GPL(arch_haltpoll_disable);
>  #endif
> diff --git a/drivers/cpuidle/cpuidle-haltpoll.c b/drivers/cpuidle/cpuidle-haltpoll.c
> index 9ac093dcbb01..0d1853a7185e 100644
> --- a/drivers/cpuidle/cpuidle-haltpoll.c
> +++ b/drivers/cpuidle/cpuidle-haltpoll.c
> @@ -11,12 +11,15 @@
>   */
>
>  #include <linux/init.h>
> +#include <linux/cpu.h>
>  #include <linux/cpuidle.h>
>  #include <linux/module.h>
>  #include <linux/sched/idle.h>
>  #include <linux/kvm_para.h>
>  #include <linux/cpuidle_haltpoll.h>
>
> +static struct cpuidle_device __percpu *haltpoll_cpuidle_devices;
> +
>  static int default_enter_idle(struct cpuidle_device *dev,
>                               struct cpuidle_driver *drv, int index)
>  {
> @@ -46,6 +49,48 @@ static struct cpuidle_driver haltpoll_driver = {
>         .state_count = 2,
>  };
>
> +static int haltpoll_cpu_online(unsigned int cpu)
> +{
> +       struct cpuidle_device *dev;
> +
> +       dev = per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
> +       if (!dev->registered) {
> +               dev->cpu = cpu;
> +               if (cpuidle_register_device(dev)) {
> +                       pr_notice("cpuidle_register_device %d failed!\n", cpu);
> +                       return -EIO;
> +               }
> +               arch_haltpoll_enable(cpu);
> +       }
> +
> +       return 0;
> +}
> +
> +static void haltpoll_uninit(void)
> +{
> +       unsigned int cpu;
> +
> +       cpus_read_lock();
> +
> +       for_each_online_cpu(cpu) {
> +               struct cpuidle_device *dev =
> +                       per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
> +
> +               if (!dev->registered)
> +                       continue;
> +
> +               arch_haltpoll_disable(cpu);
> +               cpuidle_unregister_device(dev);
> +       }
> +
> +       cpuidle_unregister(&haltpoll_driver);
> +
> +       free_percpu(haltpoll_cpuidle_devices);
> +       haltpoll_cpuidle_devices = NULL;
> +
> +       cpus_read_unlock();
> +}
> +
>  static int __init haltpoll_init(void)
>  {
>         int ret;
> @@ -56,17 +101,27 @@ static int __init haltpoll_init(void)
>         if (!kvm_para_available())
>                 return 0;
>
> -       ret = cpuidle_register(&haltpoll_driver, NULL);
> -       if (ret == 0)
> -               arch_haltpoll_enable();
> +       ret = cpuidle_register_driver(drv);
> +       if (ret < 0)
> +               return ret;
> +
> +       haltpoll_cpuidle_devices = alloc_percpu(struct cpuidle_device);
> +       if (haltpoll_cpuidle_devices == NULL) {
> +               cpuidle_unregister_driver(drv);
> +               return -ENOMEM;
> +       }
> +
> +       ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/haltpoll:online",
> +                               haltpoll_cpu_online, NULL);
> +       if (ret < 0)
> +               haltpoll_uninit();
>
>         return ret;
>  }
>
>  static void __exit haltpoll_exit(void)
>  {
> -       arch_haltpoll_disable();
> -       cpuidle_unregister(&haltpoll_driver);
> +       haltpoll_uninit();
>  }
>
>  module_init(haltpoll_init);
> diff --git a/include/linux/cpuidle_haltpoll.h b/include/linux/cpuidle_haltpoll.h
> index fe5954c2409e..d50c1e0411a2 100644
> --- a/include/linux/cpuidle_haltpoll.h
> +++ b/include/linux/cpuidle_haltpoll.h
> @@ -5,11 +5,11 @@
>  #ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL
>  #include <asm/cpuidle_haltpoll.h>
>  #else
> -static inline void arch_haltpoll_enable(void)
> +static inline void arch_haltpoll_enable(unsigned int cpu)
>  {
>  }
>
> -static inline void arch_haltpoll_disable(void)
> +static inline void arch_haltpoll_disable(unsigned int cpu)
>  {
>  }
>  #endif
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
  2019-08-28 18:56 [PATCH v1] cpuidle-haltpoll: vcpu hotplug support Joao Martins
  2019-08-28 23:39 ` Rafael J. Wysocki
@ 2019-08-29 11:56 ` Marcelo Tosatti
  2019-08-29 13:50   ` Joao Martins
  1 sibling, 1 reply; 6+ messages in thread
From: Marcelo Tosatti @ 2019-08-29 11:56 UTC (permalink / raw)
  To: Joao Martins
  Cc: kvm, linux-kernel, Paolo Bonzini, Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, linux-pm,
	Boris Ostrovsky

Hi Joao,

On Wed, Aug 28, 2019 at 07:56:50PM +0100, Joao Martins wrote:
> When cpus != maxcpus cpuidle-haltpoll will fail to register all vcpus
> past the online ones and thus fail to register the idle driver.
> This is because cpuidle_add_sysfs() will return with -ENODEV as a
> consequence from get_cpu_device() return no device for a non-existing
> CPU.
> 
> Instead switch to cpuidle_register_driver() and manually register each
> of the present cpus through cpuhp_setup_state() and future ones that
> get onlined. This mimics similar logic as intel_idle.
> 
> Fixes: fa86ee90eb11 ("add cpuidle-haltpoll driver")
> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> ---
>  arch/x86/include/asm/cpuidle_haltpoll.h |  4 +-
>  arch/x86/kernel/kvm.c                   | 18 +++----
>  drivers/cpuidle/cpuidle-haltpoll.c      | 65 +++++++++++++++++++++++--
>  include/linux/cpuidle_haltpoll.h        |  4 +-
>  4 files changed, 70 insertions(+), 21 deletions(-)
> 
> diff --git a/arch/x86/include/asm/cpuidle_haltpoll.h b/arch/x86/include/asm/cpuidle_haltpoll.h
> index ff8607d81526..c8b39c6716ff 100644
> --- a/arch/x86/include/asm/cpuidle_haltpoll.h
> +++ b/arch/x86/include/asm/cpuidle_haltpoll.h
> @@ -2,7 +2,7 @@
>  #ifndef _ARCH_HALTPOLL_H
>  #define _ARCH_HALTPOLL_H
>  
> -void arch_haltpoll_enable(void);
> -void arch_haltpoll_disable(void);
> +void arch_haltpoll_enable(unsigned int cpu);
> +void arch_haltpoll_disable(unsigned int cpu);
>  
>  #endif
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 8d150e3732d9..a9b6c4e2446d 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -880,32 +880,26 @@ static void kvm_enable_host_haltpoll(void *i)
>  	wrmsrl(MSR_KVM_POLL_CONTROL, 1);
>  }
>  
> -void arch_haltpoll_enable(void)
> +void arch_haltpoll_enable(unsigned int cpu)
>  {
>  	if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL)) {
> -		printk(KERN_ERR "kvm: host does not support poll control\n");
> -		printk(KERN_ERR "kvm: host upgrade recommended\n");
> +		pr_err_once("kvm: host does not support poll control\n");
> +		pr_err_once("kvm: host upgrade recommended\n");
>  		return;
>  	}
>  
> -	preempt_disable();
>  	/* Enable guest halt poll disables host halt poll */
> -	kvm_disable_host_haltpoll(NULL);
> -	smp_call_function(kvm_disable_host_haltpoll, NULL, 1);
> -	preempt_enable();
> +	smp_call_function_single(cpu, kvm_disable_host_haltpoll, NULL, 1);
>  }
>  EXPORT_SYMBOL_GPL(arch_haltpoll_enable);
>  
> -void arch_haltpoll_disable(void)
> +void arch_haltpoll_disable(unsigned int cpu)
>  {
>  	if (!kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL))
>  		return;
>  
> -	preempt_disable();
>  	/* Enable guest halt poll disables host halt poll */
> -	kvm_enable_host_haltpoll(NULL);
> -	smp_call_function(kvm_enable_host_haltpoll, NULL, 1);
> -	preempt_enable();
> +	smp_call_function_single(cpu, kvm_enable_host_haltpoll, NULL, 1);
>  }
>  EXPORT_SYMBOL_GPL(arch_haltpoll_disable);
>  #endif
> diff --git a/drivers/cpuidle/cpuidle-haltpoll.c b/drivers/cpuidle/cpuidle-haltpoll.c
> index 9ac093dcbb01..0d1853a7185e 100644
> --- a/drivers/cpuidle/cpuidle-haltpoll.c
> +++ b/drivers/cpuidle/cpuidle-haltpoll.c
> @@ -11,12 +11,15 @@
>   */
>  
>  #include <linux/init.h>
> +#include <linux/cpu.h>
>  #include <linux/cpuidle.h>
>  #include <linux/module.h>
>  #include <linux/sched/idle.h>
>  #include <linux/kvm_para.h>
>  #include <linux/cpuidle_haltpoll.h>
>  
> +static struct cpuidle_device __percpu *haltpoll_cpuidle_devices;
> +
>  static int default_enter_idle(struct cpuidle_device *dev,
>  			      struct cpuidle_driver *drv, int index)
>  {
> @@ -46,6 +49,48 @@ static struct cpuidle_driver haltpoll_driver = {
>  	.state_count = 2,
>  };
>  
> +static int haltpoll_cpu_online(unsigned int cpu)
> +{
> +	struct cpuidle_device *dev;
> +
> +	dev = per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
> +	if (!dev->registered) {
> +		dev->cpu = cpu;
> +		if (cpuidle_register_device(dev)) {
> +			pr_notice("cpuidle_register_device %d failed!\n", cpu);
> +			return -EIO;
> +		}
> +		arch_haltpoll_enable(cpu);
> +	}
> +
> +	return 0;
> +}
> +
> +static void haltpoll_uninit(void)
> +{
> +	unsigned int cpu;
> +
> +	cpus_read_lock();
> +
> +	for_each_online_cpu(cpu) {
> +		struct cpuidle_device *dev =
> +			per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
> +
> +		if (!dev->registered)
> +			continue;
> +
> +		arch_haltpoll_disable(cpu);
> +		cpuidle_unregister_device(dev);
> +	}

1)

> +
> +	cpuidle_unregister(&haltpoll_driver);

cpuidle_unregister_driver.

> +	free_percpu(haltpoll_cpuidle_devices);
> +	haltpoll_cpuidle_devices = NULL;
> +
> +	cpus_read_unlock();

Any reason you can't cpus_read_unlock() at 1) ?

Looks good otherwise.

Thanks!


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
  2019-08-29 11:56 ` Marcelo Tosatti
@ 2019-08-29 13:50   ` Joao Martins
  2019-08-29 14:24     ` Joao Martins
  0 siblings, 1 reply; 6+ messages in thread
From: Joao Martins @ 2019-08-29 13:50 UTC (permalink / raw)
  To: Marcelo Tosatti
  Cc: kvm, linux-kernel, Paolo Bonzini, Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, linux-pm,
	Boris Ostrovsky

On 8/29/19 12:56 PM, Marcelo Tosatti wrote:
> Hi Joao,
> 
> On Wed, Aug 28, 2019 at 07:56:50PM +0100, Joao Martins wrote:
>> +static void haltpoll_uninit(void)
>> +{
>> +	unsigned int cpu;
>> +
>> +	cpus_read_lock();
>> +
>> +	for_each_online_cpu(cpu) {
>> +		struct cpuidle_device *dev =
>> +			per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
>> +
>> +		if (!dev->registered)
>> +			continue;
>> +
>> +		arch_haltpoll_disable(cpu);
>> +		cpuidle_unregister_device(dev);
>> +	}
> 
> 1)
> 
>> +
>> +	cpuidle_unregister(&haltpoll_driver);
> 
> cpuidle_unregister_driver.

Will fix -- this was an oversight.

> 
>> +	free_percpu(haltpoll_cpuidle_devices);
>> +	haltpoll_cpuidle_devices = NULL;
>> +
>> +	cpus_read_unlock();
> 
> Any reason you can't cpus_read_unlock() at 1) ?
> 
No, let me adjust that too.

> Looks good otherwise.
> 
> Thanks!
> 
Thanks for the review!

	Joao

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
  2019-08-29 13:50   ` Joao Martins
@ 2019-08-29 14:24     ` Joao Martins
  2019-08-29 14:40       ` Marcelo Tosatti
  0 siblings, 1 reply; 6+ messages in thread
From: Joao Martins @ 2019-08-29 14:24 UTC (permalink / raw)
  To: Marcelo Tosatti
  Cc: kvm, linux-kernel, Paolo Bonzini, Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, linux-pm,
	Boris Ostrovsky

On 8/29/19 2:50 PM, Joao Martins wrote:
> On 8/29/19 12:56 PM, Marcelo Tosatti wrote:
>> Hi Joao,
>>
>> On Wed, Aug 28, 2019 at 07:56:50PM +0100, Joao Martins wrote:
>>> +static void haltpoll_uninit(void)
>>> +{
>>> +	unsigned int cpu;
>>> +
>>> +	cpus_read_lock();
>>> +
>>> +	for_each_online_cpu(cpu) {
>>> +		struct cpuidle_device *dev =
>>> +			per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
>>> +
>>> +		if (!dev->registered)
>>> +			continue;
>>> +
>>> +		arch_haltpoll_disable(cpu);
>>> +		cpuidle_unregister_device(dev);
>>> +	}
>>
>> 1)
>>
>>> +
>>> +	cpuidle_unregister(&haltpoll_driver);
>>
>> cpuidle_unregister_driver.
> 
> Will fix -- this was an oversight.
> 
>>
>>> +	free_percpu(haltpoll_cpuidle_devices);
>>> +	haltpoll_cpuidle_devices = NULL;
>>> +
>>> +	cpus_read_unlock();
>>
>> Any reason you can't cpus_read_unlock() at 1) ?
>>
> No, let me adjust that too.
> 
>> Looks good otherwise.
>>

BTW, should I take this as a Acked-by, Reviewed-by, or neither? :)

	Joao

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] cpuidle-haltpoll: vcpu hotplug support
  2019-08-29 14:24     ` Joao Martins
@ 2019-08-29 14:40       ` Marcelo Tosatti
  0 siblings, 0 replies; 6+ messages in thread
From: Marcelo Tosatti @ 2019-08-29 14:40 UTC (permalink / raw)
  To: Joao Martins
  Cc: kvm, linux-kernel, Paolo Bonzini, Radim Krčmář,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Rafael J. Wysocki, Daniel Lezcano, linux-pm,
	Boris Ostrovsky

On Thu, Aug 29, 2019 at 03:24:31PM +0100, Joao Martins wrote:
> On 8/29/19 2:50 PM, Joao Martins wrote:
> > On 8/29/19 12:56 PM, Marcelo Tosatti wrote:
> >> Hi Joao,
> >>
> >> On Wed, Aug 28, 2019 at 07:56:50PM +0100, Joao Martins wrote:
> >>> +static void haltpoll_uninit(void)
> >>> +{
> >>> +	unsigned int cpu;
> >>> +
> >>> +	cpus_read_lock();
> >>> +
> >>> +	for_each_online_cpu(cpu) {
> >>> +		struct cpuidle_device *dev =
> >>> +			per_cpu_ptr(haltpoll_cpuidle_devices, cpu);
> >>> +
> >>> +		if (!dev->registered)
> >>> +			continue;
> >>> +
> >>> +		arch_haltpoll_disable(cpu);
> >>> +		cpuidle_unregister_device(dev);
> >>> +	}
> >>
> >> 1)
> >>
> >>> +
> >>> +	cpuidle_unregister(&haltpoll_driver);
> >>
> >> cpuidle_unregister_driver.
> > 
> > Will fix -- this was an oversight.
> > 
> >>
> >>> +	free_percpu(haltpoll_cpuidle_devices);
> >>> +	haltpoll_cpuidle_devices = NULL;
> >>> +
> >>> +	cpus_read_unlock();
> >>
> >> Any reason you can't cpus_read_unlock() at 1) ?
> >>
> > No, let me adjust that too.
> > 
> >> Looks good otherwise.
> >>
> 
> BTW, should I take this as a Acked-by, Reviewed-by, or neither? :)
> 
> 	Joao

I'll ACK -v2 once you send it.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-08-29 14:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-28 18:56 [PATCH v1] cpuidle-haltpoll: vcpu hotplug support Joao Martins
2019-08-28 23:39 ` Rafael J. Wysocki
2019-08-29 11:56 ` Marcelo Tosatti
2019-08-29 13:50   ` Joao Martins
2019-08-29 14:24     ` Joao Martins
2019-08-29 14:40       ` Marcelo Tosatti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).