Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1619496 > unrolled thread

[PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate

Started byChen Yu <yu.c.chen@intel.com>
First post2017-04-09 16:00 +0200
Last post2017-04-14 22:40 +0200
Articles 4 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate Chen Yu <yu.c.chen@intel.com> - 2017-04-09 16:00 +0200
    Re: [PATCH] x86/irq: Do not check available vectors if current CPU  has no irq to migrate Prarit Bhargava <prarit@redhat.com> - 2017-04-10 13:30 +0200
      Re: [PATCH] x86/irq: Do not check available vectors if current CPU  has no irq to migrate Chen Yu <yu.c.chen@intel.com> - 2017-04-10 18:00 +0200
        Re: [PATCH] x86/irq: Do not check available vectors if current CPU  has no irq to migrate Thomas Gleixner <tglx@linutronix.de> - 2017-04-14 22:40 +0200

#1619496 — [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate

FromChen Yu <yu.c.chen@intel.com>
Date2017-04-09 16:00 +0200
Subject[PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
Message-ID<tulxL-3uX-1@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1619827 — Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate

FromPrarit Bhargava <prarit@redhat.com>
Date2017-04-10 13:30 +0200
SubjectRe: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
Message-ID<tuFGa-8rl-21@gated-at.bofh.it>
In reply to#1619496

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) {
> 

[toc] | [prev] | [next] | [standalone]


#1620145 — Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate

FromChen Yu <yu.c.chen@intel.com>
Date2017-04-10 18:00 +0200
SubjectRe: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
Message-ID<tuJTw-2D4-103@gated-at.bofh.it>
In reply to#1619827
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) {
> > 

[toc] | [prev] | [next] | [standalone]


#1623904 — Re: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate

FromThomas Gleixner <tglx@linutronix.de>
Date2017-04-14 22:40 +0200
SubjectRe: [PATCH] x86/irq: Do not check available vectors if current CPU has no irq to migrate
Message-ID<twgaC-5Ia-17@gated-at.bofh.it>
In reply to#1620145
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;
+			}
 		}
 	}
 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web