2012-08-14 06:55:21

by Liu, Chuansheng

[permalink] [raw]
Subject: [PATCH] x86/fixup_irq: using the cpu_online_mask instead of cpu_all_mask

From: liu chuansheng <[email protected]>
Subject: [PATCH] x86/fixup_irq: using the cpu_online_mask instead of cpu_all_mask

When one CPU is going down, and this CPU is the last one in irq affinity,
current code is setting cpu_all_mask as the new affinity for that irq.

But for some system the firmware maybe send the interrupt to each CPU
in irq affinity averagely, and cpu_all_mask include all CPUs.

Here replacing cpu_all_mask with cpu_online_mask, it is more reasonable
and fittable.

Signed-off-by: liu chuansheng <[email protected]>
---
arch/x86/kernel/irq.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 7ad683d..d44f782 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -270,7 +270,7 @@ void fixup_irqs(void)

if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
break_affinity = 1;
- affinity = cpu_all_mask;
+ affinity = cpu_online_mask;
}

chip = irq_data_get_irq_chip(data);
--
1.7.0.4


2012-08-20 05:24:05

by Yanmin Zhang

[permalink] [raw]
Subject: Re: [PATCH] x86/fixup_irq: using the cpu_online_mask instead of cpu_all_mask

On Tue, 2012-08-14 at 06:55 +0000, Liu, Chuansheng wrote:
> From: liu chuansheng <[email protected]>
> Subject: [PATCH] x86/fixup_irq: using the cpu_online_mask instead of cpu_all_mask
>
> When one CPU is going down, and this CPU is the last one in irq affinity,
> current code is setting cpu_all_mask as the new affinity for that irq.
>
> But for some system the firmware maybe send the interrupt to each CPU
> in irq affinity averagely, and cpu_all_mask include all CPUs.
>
> Here replacing cpu_all_mask with cpu_online_mask, it is more reasonable
> and fittable.
It's a good finding. The issue exists on Medfield Android mobile.


>
> Signed-off-by: liu chuansheng <[email protected]>
> ---
> arch/x86/kernel/irq.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
> index 7ad683d..d44f782 100644
> --- a/arch/x86/kernel/irq.c
> +++ b/arch/x86/kernel/irq.c
> @@ -270,7 +270,7 @@ void fixup_irqs(void)
>
> if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
> break_affinity = 1;
> - affinity = cpu_all_mask;
> + affinity = cpu_online_mask;
> }
>
> chip = irq_data_get_irq_chip(data);

2012-08-22 09:03:54

by Liu, Chuansheng

[permalink] [raw]
Subject: [tip:x86/urgent] x86/fixup_irq: Use cpu_online_mask instead of cpu_all_mask

Commit-ID: 2530cd4f448935c74eeb49f29559589928e4b2f0
Gitweb: http://git.kernel.org/tip/2530cd4f448935c74eeb49f29559589928e4b2f0
Author: Liu, Chuansheng <[email protected]>
AuthorDate: Tue, 14 Aug 2012 06:55:01 +0000
Committer: Ingo Molnar <[email protected]>
CommitDate: Wed, 22 Aug 2012 10:36:08 +0200

x86/fixup_irq: Use cpu_online_mask instead of cpu_all_mask

When one CPU is going down and this CPU is the last one in irq
affinity, current code is setting cpu_all_mask as the new
affinity for that irq.

But for some systems (such as in Medfield Android mobile) the
firmware sends the interrupt to each CPU in the irq affinity
mask, averaged, and cpu_all_mask includes all potential CPUs,
i.e. offline ones as well.

So replace cpu_all_mask with cpu_online_mask.

Signed-off-by: liu chuansheng <[email protected]>
Acked-by: Yanmin Zhang <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>
Link: http://lkml.kernel.org/r/27240C0AC20F114CBF8149A2696CBE4A137286@SHSMSX101.ccr.corp.intel.com
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/kernel/irq.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 7ad683d..d44f782 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -270,7 +270,7 @@ void fixup_irqs(void)

if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
break_affinity = 1;
- affinity = cpu_all_mask;
+ affinity = cpu_online_mask;
}

chip = irq_data_get_irq_chip(data);