* [PATCH 1/2] irq: correct CPUMASKS_OFFSTACK typo -v2
@ 2009-04-03 22:37 Yinghai Lu
2009-04-03 22:39 ` [PATCH 2/2] irq: only update affinity in chip set_affinity() Yinghai Lu
0 siblings, 1 reply; 5+ messages in thread
From: Yinghai Lu @ 2009-04-03 22:37 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org, Rusty Russell
Impact: fix smp_affinity copying when moving irq_desc
CPUMASKS_OFFSTACK is not defined anywhere. it is a typo
and init_allocate_desc_masks called before it set affinity to all cpus...
split init_alloc_desc_masks() into all_desc_masks() and init_desc_masks()
so in the init_copy_desc_masks could use CPUMASK_OFFSTACK there.
aka copy path will not calling init_desc_masks anymore.
also could use that CPUMASK_OFFSTACK in alloc_desc_masks()
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
include/linux/irq.h | 27 ++++++++++++++++++---------
kernel/irq/handle.c | 9 ++++++---
kernel/irq/numa_migrate.c | 2 +-
3 files changed, 25 insertions(+), 13 deletions(-)
Index: linux-2.6/include/linux/irq.h
===================================================================
--- linux-2.6.orig/include/linux/irq.h
+++ linux-2.6/include/linux/irq.h
@@ -424,27 +424,25 @@ extern int set_irq_msi(unsigned int irq,
#ifdef CONFIG_SMP
/**
- * init_alloc_desc_masks - allocate cpumasks for irq_desc
+ * alloc_desc_masks - allocate cpumasks for irq_desc
* @desc: pointer to irq_desc struct
* @cpu: cpu which will be handling the cpumasks
* @boot: true if need bootmem
*
* Allocates affinity and pending_mask cpumask if required.
* Returns true if successful (or not required).
- * Side effect: affinity has all bits set, pending_mask has all bits clear.
*/
-static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
+static inline bool alloc_desc_masks(struct irq_desc *desc, int cpu,
bool boot)
{
+#ifdef CONFIG_CPUMASK_OFFSTACK
int node;
if (boot) {
alloc_bootmem_cpumask_var(&desc->affinity);
- cpumask_setall(desc->affinity);
#ifdef CONFIG_GENERIC_PENDING_IRQ
alloc_bootmem_cpumask_var(&desc->pending_mask);
- cpumask_clear(desc->pending_mask);
#endif
return true;
}
@@ -453,18 +451,25 @@ static inline bool init_alloc_desc_masks
if (!alloc_cpumask_var_node(&desc->affinity, GFP_ATOMIC, node))
return false;
- cpumask_setall(desc->affinity);
#ifdef CONFIG_GENERIC_PENDING_IRQ
if (!alloc_cpumask_var_node(&desc->pending_mask, GFP_ATOMIC, node)) {
free_cpumask_var(desc->affinity);
return false;
}
- cpumask_clear(desc->pending_mask);
+#endif
#endif
return true;
}
+static inline void init_desc_masks(struct irq_desc *desc)
+{
+ cpumask_setall(desc->affinity);
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+ cpumask_clear(desc->pending_mask);
+#endif
+}
+
/**
* init_copy_desc_masks - copy cpumasks for irq_desc
* @old_desc: pointer to old irq_desc struct
@@ -478,7 +483,7 @@ static inline bool init_alloc_desc_masks
static inline void init_copy_desc_masks(struct irq_desc *old_desc,
struct irq_desc *new_desc)
{
-#ifdef CONFIG_CPUMASKS_OFFSTACK
+#ifdef CONFIG_CPUMASK_OFFSTACK
cpumask_copy(new_desc->affinity, old_desc->affinity);
#ifdef CONFIG_GENERIC_PENDING_IRQ
@@ -499,12 +504,16 @@ static inline void free_desc_masks(struc
#else /* !CONFIG_SMP */
-static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
+static inline bool alloc_desc_masks(struct irq_desc *desc, int cpu,
bool boot)
{
return true;
}
+static inline void init_desc_masks(struct irq_desc *desc)
+{
+}
+
static inline void init_copy_desc_masks(struct irq_desc *old_desc,
struct irq_desc *new_desc)
{
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -115,10 +115,11 @@ static void init_one_irq_desc(int irq, s
printk(KERN_ERR "can not alloc kstat_irqs\n");
BUG_ON(1);
}
- if (!init_alloc_desc_masks(desc, cpu, false)) {
+ if (!alloc_desc_masks(desc, cpu, false)) {
printk(KERN_ERR "can not alloc irq_desc cpumasks\n");
BUG_ON(1);
}
+ init_desc_masks(desc);
arch_init_chip_data(desc, cpu);
}
@@ -169,7 +170,8 @@ int __init early_irq_init(void)
desc[i].irq = i;
desc[i].kstat_irqs = kstat_irqs_legacy + i * nr_cpu_ids;
lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
- init_alloc_desc_masks(&desc[i], 0, true);
+ alloc_desc_masks(&desc[i], 0, true);
+ init_desc_masks(&desc[i]);
irq_desc_ptrs[i] = desc + i;
}
@@ -256,7 +258,8 @@ int __init early_irq_init(void)
for (i = 0; i < count; i++) {
desc[i].irq = i;
- init_alloc_desc_masks(&desc[i], 0, true);
+ alloc_desc_masks(&desc[i], 0, true);
+ init_desc_masks(&desc[i]);
desc[i].kstat_irqs = kstat_irqs_all[i];
}
return arch_early_irq_init();
Index: linux-2.6/kernel/irq/numa_migrate.c
===================================================================
--- linux-2.6.orig/kernel/irq/numa_migrate.c
+++ linux-2.6/kernel/irq/numa_migrate.c
@@ -37,7 +37,7 @@ static bool init_copy_one_irq_desc(int i
struct irq_desc *desc, int cpu)
{
memcpy(desc, old_desc, sizeof(struct irq_desc));
- if (!init_alloc_desc_masks(desc, cpu, false)) {
+ if (!alloc_desc_masks(desc, cpu, false)) {
printk(KERN_ERR "irq %d: can not get new irq_desc cpumask "
"for migration.\n", irq);
return false;
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 2/2] irq: only update affinity in chip set_affinity() 2009-04-03 22:37 [PATCH 1/2] irq: correct CPUMASKS_OFFSTACK typo -v2 Yinghai Lu @ 2009-04-03 22:39 ` Yinghai Lu 2009-04-08 12:54 ` Ingo Molnar 0 siblings, 1 reply; 5+ messages in thread From: Yinghai Lu @ 2009-04-03 22:39 UTC (permalink / raw) To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton Cc: linux-kernel@vger.kernel.org, Rusty Russell, Eric W. Biederman Impact: keep affinity consistent irq_set_affinity() and move_masked_irq() try to assign affinity before calling chip set_affinity(). some archs are assigning again in set_affinity again. something like: cpumask_cpy(desc->affinity, mask); desc->chip->set_affinity(mask); in the failing path, affinity should not be touched. also set_extra_move_desc() ( called by set_affinity) will rely on the old affinity to decide if need to move irq_desc to different node when logical flat apic mode is used. So try remove those assignment, and make some missed arch to assign affinity in their set_affinity. Signed-off-by: Yinghai Lu <yinghai@kernel.org> -- arch/alpha/kernel/sys_dp264.c | 6 ++++-- arch/alpha/kernel/sys_titan.c | 3 ++- arch/arm/common/gic.c | 1 + arch/cris/arch-v32/kernel/irq.c | 1 + arch/ia64/kernel/iosapic.c | 3 +++ arch/ia64/sn/kernel/irq.c | 3 +++ arch/mips/cavium-octeon/octeon-irq.c | 6 ++++++ arch/mips/sibyte/bcm1480/irq.c | 2 ++ arch/mips/sibyte/sb1250/irq.c | 2 ++ arch/powerpc/platforms/pseries/xics.c | 5 +++++ arch/powerpc/sysdev/mpic.c | 2 ++ arch/sparc/kernel/irq_64.c | 7 +++++++ drivers/xen/events.c | 2 ++ kernel/irq/manage.c | 6 ++---- kernel/irq/migration.c | 8 +++----- 15 files changed, 45 insertions(+), 12 deletions(-) Index: linux-2.6/arch/alpha/kernel/sys_dp264.c =================================================================== --- linux-2.6.orig/arch/alpha/kernel/sys_dp264.c +++ linux-2.6/arch/alpha/kernel/sys_dp264.c @@ -178,7 +178,8 @@ cpu_set_irq_affinity(unsigned int irq, c static void dp264_set_affinity(unsigned int irq, const struct cpumask *affinity) -{ +{ + cpumask_copy(irq_desc[irq].affinity, affinity); spin_lock(&dp264_irq_lock); cpu_set_irq_affinity(irq, *affinity); tsunami_update_irq_hw(cached_irq_mask); @@ -187,7 +188,8 @@ dp264_set_affinity(unsigned int irq, con static void clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) -{ +{ + cpumask_copy(irq_desc[irq].affinity, affinity); spin_lock(&dp264_irq_lock); cpu_set_irq_affinity(irq - 16, *affinity); tsunami_update_irq_hw(cached_irq_mask); Index: linux-2.6/arch/alpha/kernel/sys_titan.c =================================================================== --- linux-2.6.orig/arch/alpha/kernel/sys_titan.c +++ linux-2.6/arch/alpha/kernel/sys_titan.c @@ -159,7 +159,8 @@ titan_cpu_set_irq_affinity(unsigned int static void titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) -{ +{ + cpumask_copy(irq_desc[irq].affinity, affinity); spin_lock(&titan_irq_lock); titan_cpu_set_irq_affinity(irq - 16, *affinity); titan_update_irq_hw(titan_cached_irq_mask); Index: linux-2.6/arch/arm/common/gic.c =================================================================== --- linux-2.6.orig/arch/arm/common/gic.c +++ linux-2.6/arch/arm/common/gic.c @@ -118,6 +118,7 @@ static void gic_set_cpu(unsigned int irq spin_lock(&irq_controller_lock); irq_desc[irq].cpu = cpu; + cpumask_copy(irq_desc[irq].affinity, mask_val); val = readl(reg) & ~(0xff << shift); val |= 1 << (cpu + shift); writel(val, reg); Index: linux-2.6/arch/cris/arch-v32/kernel/irq.c =================================================================== --- linux-2.6.orig/arch/cris/arch-v32/kernel/irq.c +++ linux-2.6/arch/cris/arch-v32/kernel/irq.c @@ -330,6 +330,7 @@ void set_affinity_crisv32_irq(unsigned i unsigned long flags; spin_lock_irqsave(&irq_lock, flags); irq_allocations[irq - FIRST_IRQ].mask = *dest; + cpumask_copy(irq_desc[j].affinity, dest); spin_unlock_irqrestore(&irq_lock, flags); } Index: linux-2.6/arch/ia64/kernel/iosapic.c =================================================================== --- linux-2.6.orig/arch/ia64/kernel/iosapic.c +++ linux-2.6/arch/ia64/kernel/iosapic.c @@ -338,6 +338,7 @@ iosapic_set_affinity(unsigned int irq, c int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; struct iosapic_rte_info *rte; struct iosapic *iosapic; + irq_desc_t *idesc = irq_desc + irq; irq &= (~IA64_IRQ_REDIRECTED); @@ -353,6 +354,8 @@ iosapic_set_affinity(unsigned int irq, c if (!iosapic_intr_info[irq].count) return; /* not an IOSAPIC interrupt */ + cpumask_copy(desc->affinity, mask); + set_irq_affinity_info(irq, dest, redir); /* dest contains both id and eid */ Index: linux-2.6/arch/ia64/sn/kernel/irq.c =================================================================== --- linux-2.6.orig/arch/ia64/sn/kernel/irq.c +++ linux-2.6/arch/ia64/sn/kernel/irq.c @@ -232,6 +232,9 @@ static void sn_set_affinity_irq(unsigned struct sn_irq_info *sn_irq_info, *sn_irq_info_safe; nasid_t nasid; int slice; + struct irq_desc *desc = irq_to_desc(irq); + + cpumask_copy(desc->affinity, mask); nasid = cpuid_to_nasid(cpumask_first(mask)); slice = cpuid_to_slice(cpumask_first(mask)); Index: linux-2.6/arch/mips/cavium-octeon/octeon-irq.c =================================================================== --- linux-2.6.orig/arch/mips/cavium-octeon/octeon-irq.c +++ linux-2.6/arch/mips/cavium-octeon/octeon-irq.c @@ -181,6 +181,9 @@ static void octeon_irq_ciu0_set_affinity { int cpu; int bit = irq - OCTEON_IRQ_WORKQ0; /* Bit 0-63 of EN0 */ + irq_desc_t *desc = irq_desc + irq; + + cpumask_copy(desc->affinity, dest); write_lock(&octeon_irq_ciu0_rwlock); for_each_online_cpu(cpu) { @@ -296,6 +299,9 @@ static void octeon_irq_ciu1_set_affinity { int cpu; int bit = irq - OCTEON_IRQ_WDOG0; /* Bit 0-63 of EN1 */ + irq_desc_t *desc = irq_desc + irq; + + cpumask_copy(desc->affinity, dest); write_lock(&octeon_irq_ciu1_rwlock); for_each_online_cpu(cpu) { Index: linux-2.6/arch/mips/sibyte/bcm1480/irq.c =================================================================== --- linux-2.6.orig/arch/mips/sibyte/bcm1480/irq.c +++ linux-2.6/arch/mips/sibyte/bcm1480/irq.c @@ -123,6 +123,8 @@ static void bcm1480_set_affinity(unsigne } i = cpumask_first(mask); + cpumask_copy(desc->affinity, mask); + /* Convert logical CPU to physical CPU */ cpu = cpu_logical_map(i); Index: linux-2.6/arch/mips/sibyte/sb1250/irq.c =================================================================== --- linux-2.6.orig/arch/mips/sibyte/sb1250/irq.c +++ linux-2.6/arch/mips/sibyte/sb1250/irq.c @@ -117,6 +117,8 @@ static void sb1250_set_affinity(unsigned return; } + cpumask_copy(desc->affinity, mask); + /* Convert logical CPU to physical CPU */ cpu = cpu_logical_map(i); Index: linux-2.6/arch/powerpc/platforms/pseries/xics.c =================================================================== --- linux-2.6.orig/arch/powerpc/platforms/pseries/xics.c +++ linux-2.6/arch/powerpc/platforms/pseries/xics.c @@ -339,6 +339,7 @@ static void xics_set_affinity(unsigned i int status; int xics_status[2]; int irq_server; + struct irq_desc *desc; irq = (unsigned int)irq_map[virq].hwirq; if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) @@ -374,6 +375,10 @@ static void xics_set_affinity(unsigned i __func__, irq, status); return; } + + desc = get_irq_desc(virq); + + cpumask_copy(desc->affinity, cpumask); } static struct irq_chip xics_pic_direct = { Index: linux-2.6/arch/powerpc/sysdev/mpic.c =================================================================== --- linux-2.6.orig/arch/powerpc/sysdev/mpic.c +++ linux-2.6/arch/powerpc/sysdev/mpic.c @@ -811,7 +811,9 @@ void mpic_set_affinity(unsigned int irq, { struct mpic *mpic = mpic_from_irq(irq); unsigned int src = mpic_irq_to_hw(irq); + struct irq_desc *desc = get_irq_desc(irq); + cpumask_copy(desc->affinity, cpumask); if (mpic->flags & MPIC_SINGLE_DEST_CPU) { int cpuid = irq_choose_cpu(irq); Index: linux-2.6/arch/sparc/kernel/irq_64.c =================================================================== --- linux-2.6.orig/arch/sparc/kernel/irq_64.c +++ linux-2.6/arch/sparc/kernel/irq_64.c @@ -321,6 +321,9 @@ static void sun4u_irq_enable(unsigned in static void sun4u_set_affinity(unsigned int virt_irq, const struct cpumask *mask) { + struct irq_desc *desc = irq_desc + virt_irq; + + cpumask_copy(desc->affinity, mask); sun4u_irq_enable(virt_irq); } @@ -382,8 +385,10 @@ static void sun4v_set_affinity(unsigned { unsigned int ino = virt_irq_table[virt_irq].dev_ino; unsigned long cpuid = irq_choose_cpu(virt_irq); + struct irq_desc *desc = irq_desc + virt_irq; int err; + cpumask_copy(desc->affinity, mask); err = sun4v_intr_settarget(ino, cpuid); if (err != HV_EOK) printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): " @@ -449,8 +454,10 @@ static void sun4v_virt_set_affinity(unsi const struct cpumask *mask) { unsigned long cpuid, dev_handle, dev_ino; + struct irq_desc *desc = irq_desc + virt_irq; int err; + cpumask_copy(desc->affinity, mask); cpuid = irq_choose_cpu(virt_irq); dev_handle = virt_irq_table[virt_irq].dev_handle; Index: linux-2.6/drivers/xen/events.c =================================================================== --- linux-2.6.orig/drivers/xen/events.c +++ linux-2.6/drivers/xen/events.c @@ -713,6 +713,8 @@ static void rebind_irq_to_cpu(unsigned i static void set_affinity_irq(unsigned irq, const struct cpumask *dest) { unsigned tcpu = cpumask_first(dest); + + cpumask_copy(irq_to_desc(irq)->affinity, mask); rebind_irq_to_cpu(irq, tcpu); } Index: linux-2.6/kernel/irq/manage.c =================================================================== --- linux-2.6.orig/kernel/irq/manage.c +++ linux-2.6/kernel/irq/manage.c @@ -109,15 +109,13 @@ int irq_set_affinity(unsigned int irq, c spin_lock_irqsave(&desc->lock, flags); #ifdef CONFIG_GENERIC_PENDING_IRQ - if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { - cpumask_copy(desc->affinity, cpumask); + if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) desc->chip->set_affinity(irq, cpumask); - } else { + else { desc->status |= IRQ_MOVE_PENDING; cpumask_copy(desc->pending_mask, cpumask); } #else - cpumask_copy(desc->affinity, cpumask); desc->chip->set_affinity(irq, cpumask); #endif irq_set_thread_affinity(desc, cpumask); Index: linux-2.6/kernel/irq/migration.c =================================================================== --- linux-2.6.orig/kernel/irq/migration.c +++ linux-2.6/kernel/irq/migration.c @@ -39,11 +39,9 @@ void move_masked_irq(int irq) * masking the irqs. */ if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) - < nr_cpu_ids)) { - cpumask_and(desc->affinity, - desc->pending_mask, cpu_online_mask); - desc->chip->set_affinity(irq, desc->affinity); - } + < nr_cpu_ids)) + desc->chip->set_affinity(irq, desc->pending_mask); + cpumask_clear(desc->pending_mask); } ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] irq: only update affinity in chip set_affinity() 2009-04-03 22:39 ` [PATCH 2/2] irq: only update affinity in chip set_affinity() Yinghai Lu @ 2009-04-08 12:54 ` Ingo Molnar 2009-04-08 15:54 ` Yinghai Lu 0 siblings, 1 reply; 5+ messages in thread From: Ingo Molnar @ 2009-04-08 12:54 UTC (permalink / raw) To: Yinghai Lu Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton, linux-kernel@vger.kernel.org, Rusty Russell, Eric W. Biederman * Yinghai Lu <yinghai@kernel.org> wrote: > Impact: keep affinity consistent > > irq_set_affinity() and move_masked_irq() try to assign affinity > before calling chip set_affinity(). some archs are assigning again > in set_affinity again. > > something like: > cpumask_cpy(desc->affinity, mask); > desc->chip->set_affinity(mask); > > in the failing path, affinity should not be touched. > > also set_extra_move_desc() ( called by set_affinity) will rely on > the old affinity to decide if need to move irq_desc to different > node when logical flat apic mode is used. > > So try remove those assignment, and make some missed arch to > assign affinity in their set_affinity. > > Signed-off-by: Yinghai Lu <yinghai@kernel.org> > > -- > arch/alpha/kernel/sys_dp264.c | 6 ++++-- > arch/alpha/kernel/sys_titan.c | 3 ++- > arch/arm/common/gic.c | 1 + > arch/cris/arch-v32/kernel/irq.c | 1 + > arch/ia64/kernel/iosapic.c | 3 +++ > arch/ia64/sn/kernel/irq.c | 3 +++ > arch/mips/cavium-octeon/octeon-irq.c | 6 ++++++ > arch/mips/sibyte/bcm1480/irq.c | 2 ++ > arch/mips/sibyte/sb1250/irq.c | 2 ++ > arch/powerpc/platforms/pseries/xics.c | 5 +++++ > arch/powerpc/sysdev/mpic.c | 2 ++ > arch/sparc/kernel/irq_64.c | 7 +++++++ > drivers/xen/events.c | 2 ++ > kernel/irq/manage.c | 6 ++---- > kernel/irq/migration.c | 8 +++----- > 15 files changed, 45 insertions(+), 12 deletions(-) Hm, this spreads a lot of instances of identical lines: cpumask_copy(irq_desc[irq].affinity, mask_val); all around architectures. How is that an improvement? Ingo ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] irq: only update affinity in chip set_affinity() 2009-04-08 12:54 ` Ingo Molnar @ 2009-04-08 15:54 ` Yinghai Lu 2009-04-08 15:59 ` Ingo Molnar 0 siblings, 1 reply; 5+ messages in thread From: Yinghai Lu @ 2009-04-08 15:54 UTC (permalink / raw) To: Ingo Molnar Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton, linux-kernel@vger.kernel.org, Rusty Russell, Eric W. Biederman On Wed, Apr 8, 2009 at 5:54 AM, Ingo Molnar <mingo@elte.hu> wrote: > > * Yinghai Lu <yinghai@kernel.org> wrote: > >> Impact: keep affinity consistent >> >> irq_set_affinity() and move_masked_irq() try to assign affinity >> before calling chip set_affinity(). some archs are assigning again >> in set_affinity again. >> >> something like: >> cpumask_cpy(desc->affinity, mask); >> desc->chip->set_affinity(mask); >> >> in the failing path, affinity should not be touched. >> >> also set_extra_move_desc() ( called by set_affinity) will rely on >> the old affinity to decide if need to move irq_desc to different >> node when logical flat apic mode is used. >> >> So try remove those assignment, and make some missed arch to >> assign affinity in their set_affinity. >> >> Signed-off-by: Yinghai Lu <yinghai@kernel.org> >> >> -- >> arch/alpha/kernel/sys_dp264.c | 6 ++++-- >> arch/alpha/kernel/sys_titan.c | 3 ++- >> arch/arm/common/gic.c | 1 + >> arch/cris/arch-v32/kernel/irq.c | 1 + >> arch/ia64/kernel/iosapic.c | 3 +++ >> arch/ia64/sn/kernel/irq.c | 3 +++ >> arch/mips/cavium-octeon/octeon-irq.c | 6 ++++++ >> arch/mips/sibyte/bcm1480/irq.c | 2 ++ >> arch/mips/sibyte/sb1250/irq.c | 2 ++ >> arch/powerpc/platforms/pseries/xics.c | 5 +++++ >> arch/powerpc/sysdev/mpic.c | 2 ++ >> arch/sparc/kernel/irq_64.c | 7 +++++++ >> drivers/xen/events.c | 2 ++ >> kernel/irq/manage.c | 6 ++---- >> kernel/irq/migration.c | 8 +++----- >> 15 files changed, 45 insertions(+), 12 deletions(-) > > Hm, this spreads a lot of instances of identical lines: > > cpumask_copy(irq_desc[irq].affinity, mask_val); > > all around architectures. How is that an improvement? > in failing path in set_affinity, for example it can not get vector in specified cpu, then affinity should not be changed. YH ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] irq: only update affinity in chip set_affinity() 2009-04-08 15:54 ` Yinghai Lu @ 2009-04-08 15:59 ` Ingo Molnar 0 siblings, 0 replies; 5+ messages in thread From: Ingo Molnar @ 2009-04-08 15:59 UTC (permalink / raw) To: Yinghai Lu Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton, linux-kernel@vger.kernel.org, Rusty Russell, Eric W. Biederman * Yinghai Lu <yhlu.kernel@gmail.com> wrote: > On Wed, Apr 8, 2009 at 5:54 AM, Ingo Molnar <mingo@elte.hu> wrote: > > > > * Yinghai Lu <yinghai@kernel.org> wrote: > > > >> Impact: keep affinity consistent > >> > >> irq_set_affinity() and move_masked_irq() try to assign affinity > >> before calling chip set_affinity(). some archs are assigning again > >> in set_affinity again. > >> > >> something like: > >> cpumask_cpy(desc->affinity, mask); > >> desc->chip->set_affinity(mask); > >> > >> in the failing path, affinity should not be touched. > >> > >> also set_extra_move_desc() ( called by set_affinity) will rely on > >> the old affinity to decide if need to move irq_desc to different > >> node when logical flat apic mode is used. > >> > >> So try remove those assignment, and make some missed arch to > >> assign affinity in their set_affinity. > >> > >> Signed-off-by: Yinghai Lu <yinghai@kernel.org> > >> > >> -- > >> arch/alpha/kernel/sys_dp264.c | 6 ++++-- > >> arch/alpha/kernel/sys_titan.c | 3 ++- > >> arch/arm/common/gic.c | 1 + > >> arch/cris/arch-v32/kernel/irq.c | 1 + > >> arch/ia64/kernel/iosapic.c | 3 +++ > >> arch/ia64/sn/kernel/irq.c | 3 +++ > >> arch/mips/cavium-octeon/octeon-irq.c | 6 ++++++ > >> arch/mips/sibyte/bcm1480/irq.c | 2 ++ > >> arch/mips/sibyte/sb1250/irq.c | 2 ++ > >> arch/powerpc/platforms/pseries/xics.c | 5 +++++ > >> arch/powerpc/sysdev/mpic.c | 2 ++ > >> arch/sparc/kernel/irq_64.c | 7 +++++++ > >> drivers/xen/events.c | 2 ++ > >> kernel/irq/manage.c | 6 ++---- > >> kernel/irq/migration.c | 8 +++----- > >> 15 files changed, 45 insertions(+), 12 deletions(-) > > > > Hm, this spreads a lot of instances of identical lines: > > > > cpumask_copy(irq_desc[irq].affinity, mask_val); > > > > all around architectures. How is that an improvement? > > > > in failing path in set_affinity, for example it can not get vector > in specified cpu, then affinity should not be changed. isnt the right solution then to propagate the failure code back to the generic code? Preferably via a new callback, and the patches only touching the core code plus maybe x86, so that other architectures can be converted/fixed more gradually. Ingo ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-04-08 15:59 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-04-03 22:37 [PATCH 1/2] irq: correct CPUMASKS_OFFSTACK typo -v2 Yinghai Lu 2009-04-03 22:39 ` [PATCH 2/2] irq: only update affinity in chip set_affinity() Yinghai Lu 2009-04-08 12:54 ` Ingo Molnar 2009-04-08 15:54 ` Yinghai Lu 2009-04-08 15:59 ` Ingo Molnar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox