From 009f71a58b735faf8a5f3b975bc6be70e5e37ebd Mon Sep 17 00:00:00 2001 From: John Keller Date: Thu, 10 May 2007 22:42:44 -0700 Subject: [PATCH] --- yaml --- r: 56045 b: refs/heads/master c: 25d61578daae697c4a0eb817f42a868af9824f82 h: refs/heads/master i: 56043: 6c59f4bf0b98f3423eb9ec52f581a983ee111207 v: v3 --- [refs] | 2 +- trunk/arch/ia64/kernel/irq.c | 11 +++++++++++ trunk/include/asm-ia64/irq.h | 6 ++++++ trunk/kernel/irq/proc.c | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 85788b72315d..d6f0fd4045b9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3e3d32770204ea24cf71919a90d9ccfc2bd407dd +refs/heads/master: 25d61578daae697c4a0eb817f42a868af9824f82 diff --git a/trunk/arch/ia64/kernel/irq.c b/trunk/arch/ia64/kernel/irq.c index ce49c85c928f..b4c239685d2e 100644 --- a/trunk/arch/ia64/kernel/irq.c +++ b/trunk/arch/ia64/kernel/irq.c @@ -104,6 +104,17 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir) irq_redir[irq] = (char) (redir & 0xff); } } + +bool is_affinity_mask_valid(cpumask_t cpumask) +{ + if (ia64_platform_is("sn2")) { + /* Only allow one CPU to be specified in the smp_affinity mask */ + if (cpus_weight(cpumask) != 1) + return false; + } + return true; +} + #endif /* CONFIG_SMP */ #ifdef CONFIG_HOTPLUG_CPU diff --git a/trunk/include/asm-ia64/irq.h b/trunk/include/asm-ia64/irq.h index 79479e2c6966..67221615e317 100644 --- a/trunk/include/asm-ia64/irq.h +++ b/trunk/include/asm-ia64/irq.h @@ -11,6 +11,9 @@ * 02/29/00 D.Mosberger moved most things into hw_irq.h */ +#include +#include + #define NR_IRQS 256 #define NR_IRQ_VECTORS NR_IRQS @@ -29,5 +32,8 @@ extern void disable_irq (unsigned int); extern void disable_irq_nosync (unsigned int); extern void enable_irq (unsigned int); extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); +bool is_affinity_mask_valid(cpumask_t cpumask); + +#define is_affinity_mask_valid is_affinity_mask_valid #endif /* _ASM_IA64_IRQ_H */ diff --git a/trunk/kernel/irq/proc.c b/trunk/kernel/irq/proc.c index ddde0ef9ccdc..b4f1674fca79 100644 --- a/trunk/kernel/irq/proc.c +++ b/trunk/kernel/irq/proc.c @@ -27,6 +27,10 @@ static int irq_affinity_read_proc(char *page, char **start, off_t off, return len; } +#ifndef is_affinity_mask_valid +#define is_affinity_mask_valid(val) 1 +#endif + int no_irq_affinity; static int irq_affinity_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data) @@ -42,6 +46,9 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer, if (err) return err; + if (!is_affinity_mask_valid(new_value)) + return -EINVAL; + /* * Do not allow disabling IRQs completely - it's a too easy * way to make the system unusable accidentally :-) At least