All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
@ 2017-04-09 13:53 Chen Yu
  2017-04-10 11:26 ` Prarit Bhargava
  0 siblings, 1 reply; 4+ messages in thread
From: Chen Yu @ 2017-04-09 13:53 UTC (permalink / raw)
  To: Chen Yu
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Prarit Bhargava,
	Rafael J. Wysocki, Len Brown, x86, linux-kernel

This is an optimization to bypass the free vector checking if the current
CPU has no irq to migrate. This can especially speed up the CPU offline
process when there are many CPUs in the system.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Len Brown <len.brown@intel.com>
Cc: x86@kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
---
 arch/x86/kernel/irq.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 4d8183b..b9bdc1e 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -394,6 +394,9 @@ int check_irq_vectors_for_cpu_disable(void)
 		    !cpumask_subset(&affinity_new, &online_new))
 			this_count++;
 	}
+	/* No need to check any further. */
+	if (!this_count)
+		return 0;
 
 	count = 0;
 	for_each_online_cpu(cpu) {
-- 
2.7.4

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

* Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
  2017-04-09 13:53 [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate Chen Yu
@ 2017-04-10 11:26 ` Prarit Bhargava
  2017-04-10 15:51   ` Chen Yu
  0 siblings, 1 reply; 4+ messages in thread
From: Prarit Bhargava @ 2017-04-10 11:26 UTC (permalink / raw)
  To: Chen Yu
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki,
	Len Brown, x86, linux-kernel



On 04/09/2017 09:53 AM, Chen Yu wrote:
> This is an optimization to bypass the free vector checking if the current
> CPU has no irq to migrate. This can especially speed up the CPU offline
> process when there are many CPUs in the system.

Chen, OOC how much time does this save?

P.

> 
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Prarit Bhargava <prarit@redhat.com>
> Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
> Cc: Len Brown <len.brown@intel.com>
> Cc: x86@kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Chen Yu <yu.c.chen@intel.com>
> ---
>  arch/x86/kernel/irq.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
> index 4d8183b..b9bdc1e 100644
> --- a/arch/x86/kernel/irq.c
> +++ b/arch/x86/kernel/irq.c
> @@ -394,6 +394,9 @@ int check_irq_vectors_for_cpu_disable(void)
>  		    !cpumask_subset(&affinity_new, &online_new))
>  			this_count++;
>  	}
> +	/* No need to check any further. */
> +	if (!this_count)
> +		return 0;
>  
>  	count = 0;
>  	for_each_online_cpu(cpu) {
> 

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

* Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
  2017-04-10 11:26 ` Prarit Bhargava
@ 2017-04-10 15:51   ` Chen Yu
  2017-04-14 20:36     ` Thomas Gleixner
  0 siblings, 1 reply; 4+ messages in thread
From: Chen Yu @ 2017-04-10 15:51 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki,
	Len Brown, x86, linux-kernel

Hi Prarit,
On Mon, Apr 10, 2017 at 07:26:31AM -0400, Prarit Bhargava wrote:
> 
> 
> On 04/09/2017 09:53 AM, Chen Yu wrote:
> > This is an optimization to bypass the free vector checking if the current
> > CPU has no irq to migrate. This can especially speed up the CPU offline
> > process when there are many CPUs in the system.
> 
> Chen, OOC how much time does this save?
> 
Previously I was doing some debugging on irq related issue
when check_irq_vectors_for_cpu_disable() printed a warning
on that platform, thus I incidentally look at this code and
did not measure it : )

I've just done a comparison of the function duration of
check_irq_vectors_for_cpu_disable() with/without the patch
(32 online CPUs)
before patch:
[001] d..1   264.017803: check_irq_vectors_for_cpu_disable <-native_cpu_disable
[001] d..1   264.017886: clear_local_APIC <-native_cpu_disable
after patch:
[001] d..1   862.011847: check_irq_vectors_for_cpu_disable <-native_cpu_disable
[001] d..1   862.011850: clear_local_APIC <-native_cpu_disable
About  (83 - 17) = 66 microsecond.

thanks,
Yu
> P.
> 
> > 
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Cc: "H. Peter Anvin" <hpa@zytor.com>
> > Cc: Prarit Bhargava <prarit@redhat.com>
> > Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: x86@kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > Signed-off-by: Chen Yu <yu.c.chen@intel.com>
> > ---
> >  arch/x86/kernel/irq.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
> > index 4d8183b..b9bdc1e 100644
> > --- a/arch/x86/kernel/irq.c
> > +++ b/arch/x86/kernel/irq.c
> > @@ -394,6 +394,9 @@ int check_irq_vectors_for_cpu_disable(void)
> >  		    !cpumask_subset(&affinity_new, &online_new))
> >  			this_count++;
> >  	}
> > +	/* No need to check any further. */
> > +	if (!this_count)
> > +		return 0;
> >  
> >  	count = 0;
> >  	for_each_online_cpu(cpu) {
> > 

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

* Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
  2017-04-10 15:51   ` Chen Yu
@ 2017-04-14 20:36     ` Thomas Gleixner
  0 siblings, 0 replies; 4+ messages in thread
From: Thomas Gleixner @ 2017-04-14 20:36 UTC (permalink / raw)
  To: Chen Yu
  Cc: Prarit Bhargava, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki,
	Len Brown, x86, linux-kernel

On Mon, 10 Apr 2017, Chen Yu wrote:
> I've just done a comparison of the function duration of
> check_irq_vectors_for_cpu_disable() with/without the patch
> (32 online CPUs)
> before patch:
> [001] d..1   264.017803: check_irq_vectors_for_cpu_disable <-native_cpu_disable
> [001] d..1   264.017886: clear_local_APIC <-native_cpu_disable
> after patch:
> [001] d..1   862.011847: check_irq_vectors_for_cpu_disable <-native_cpu_disable
> [001] d..1   862.011850: clear_local_APIC <-native_cpu_disable
> About  (83 - 17) = 66 microsecond.

Not really impressive if you subtract the tracer overhead. Though, if you
want to micro optimize that, then you should do it proper and also break
the for_each_cpu_loop() when the count reaches the required vectors.

Thanks,

	tglx
	
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -411,8 +411,10 @@ int check_irq_vectors_for_cpu_disable(vo
 		for (vector = FIRST_EXTERNAL_VECTOR;
 		     vector < first_system_vector; vector++) {
 			if (!test_bit(vector, used_vectors) &&
-			    IS_ERR_OR_NULL(per_cpu(vector_irq, cpu)[vector]))
-			    count++;
+			    IS_ERR_OR_NULL(per_cpu(vector_irq, cpu)[vector])) {
+				if (++count == this_count)
+					return 0;
+			}
 		}
 	}
 

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

end of thread, other threads:[~2017-04-14 20:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-09 13:53 [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate Chen Yu
2017-04-10 11:26 ` Prarit Bhargava
2017-04-10 15:51   ` Chen Yu
2017-04-14 20:36     ` Thomas Gleixner

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.