Hi Tony

attached is a patch to fix the smp_affinity write. This was fixed earlier, 
but got undone in the GENERIC_HARDIRQ merges. 

-- 
Cheers,
Ashok Raj



---
fix_smp_affinity_info - Make GENERIC_HARDIRQ work for IPF and CPU Hotplug

Signed-off-by: Ashok Raj <[EMAIL PROTECTED]>

Made GENERIC_HARDIRQ mechanism work for IPF and CPU hotplug. When write to 
/proc/irq is handled it is not appropriate to perform set_rte immediatly, 
since there is a race when the interrupt is asserted while the re-program is 
happening. Hence such programming is only safe when we do the re-program at 
the time of servicing an interrupt. This got broken when GENERIC_HARDIRQ got 
introduced for IPF.

- Removed unnecessary static definition left over from tonys tree.
- added CONFIG_PENDING_IRQ so default /proc/irq write handler can do the 
  right thing.

TBD: We currently dont handle redirectable hint either in the display, or when
we handle writes to /proc/irq/XX/smp_affinity. We need an arch specific way 
to account for the presence of "r" hint when we handle the proc write.
---

 linux-ia64-release-2.6.11-araj/arch/ia64/Kconfig      |    4 ++++
 linux-ia64-release-2.6.11-araj/arch/ia64/kernel/irq.c |    1 -
 linux-ia64-release-2.6.11-araj/kernel/irq/proc.c      |   18 ++++++++++++++++--
 3 files changed, 20 insertions(+), 3 deletions(-)

diff -puN arch/ia64/kernel/irq.c~fix_smp_affinity arch/ia64/kernel/irq.c
--- linux-ia64-release-2.6.11/arch/ia64/kernel/irq.c~fix_smp_affinity   
2005-01-27 15:22:14.895758210 -0800
+++ linux-ia64-release-2.6.11-araj/arch/ia64/kernel/irq.c       2005-01-27 
15:26:54.195559476 -0800
@@ -97,7 +97,6 @@ skip:
 cpumask_t __cacheline_aligned pending_irq_cpumask[NR_IRQS];
 static unsigned long pending_irq_redir[BITS_TO_LONGS(NR_IRQS)];
 
-static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
 static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };
 
 void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
diff -puN kernel/irq/proc.c~fix_smp_affinity kernel/irq/proc.c
--- linux-ia64-release-2.6.11/kernel/irq/proc.c~fix_smp_affinity        
2005-01-27 15:22:14.899664460 -0800
+++ linux-ia64-release-2.6.11-araj/kernel/irq/proc.c    2005-01-27 
15:22:14.913336335 -0800
@@ -21,6 +21,21 @@ static struct proc_dir_entry *smp_affini
 
 cpumask_t irq_affinity[NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
 
+#ifndef CONFIG_PENDING_IRQ
+#define proc_set_irq_affinity(irq, new_value)  \
+{                                                                              
                \
+       irq_affinity[irq] = new_value;                          \
+       irq_desc[irq].handler->set_affinity(irq, new_value);    \
+}
+#else
+extern cpumask_t pending_irq_cpumask[];
+
+#define proc_set_irq_affinity(irq, new_value)  \
+{      \
+       pending_irq_cpumask[irq] = new_value;   \
+}
+#endif
+
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
                                  int count, int *eof, void *data)
 {
@@ -55,8 +70,7 @@ static int irq_affinity_write_proc(struc
        if (cpus_empty(tmp))
                return -EINVAL;
 
-       irq_affinity[irq] = new_value;
-       irq_desc[irq].handler->set_affinity(irq, new_value);
+       proc_set_irq_affinity(irq, new_value);
 
        return full_count;
 }
diff -puN arch/ia64/Kconfig~fix_smp_affinity arch/ia64/Kconfig
--- linux-ia64-release-2.6.11/arch/ia64/Kconfig~fix_smp_affinity        
2005-01-27 15:22:14.904547273 -0800
+++ linux-ia64-release-2.6.11-araj/arch/ia64/Kconfig    2005-01-27 
15:22:14.914312897 -0800
@@ -416,6 +416,10 @@ config GENERIC_IRQ_PROBE
        bool
        default y
 
+config PENDING_IRQ
+       bool
+       default y
+
 source "arch/ia64/hp/sim/Kconfig"
 
 source "arch/ia64/oprofile/Kconfig"
_
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to