Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=950f4427c2ddc921164088a20f01304cf231437c
Commit:     950f4427c2ddc921164088a20f01304cf231437c
Parent:     b463fc60730bea6cdd73fec6edc6ec4658d47d37
Author:     Thomas Gleixner <[EMAIL PROTECTED]>
AuthorDate: Fri Feb 16 01:27:24 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri Feb 16 08:13:56 2007 -0800

    [PATCH] Add irq flag to disable balancing for an interrupt
    
    Add a flag so we can prevent the irq balancing of an interrupt.  Move the
    bits, so we have room for more :)
    
    Necessary for the ability to setup clocksources more flexible (e.g.  use the
    different HPET channels per CPU)
    
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Cc: john stultz <[EMAIL PROTECTED]>
    Cc: Roman Zippel <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 arch/i386/kernel/io_apic.c |    4 ++--
 include/linux/interrupt.h  |    3 +++
 include/linux/irq.h        |   42 +++++++++++++++++++++++++-----------------
 kernel/irq/manage.c        |    4 ++++
 kernel/irq/proc.c          |    2 +-
 5 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index e30cced..c76be11 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -482,8 +482,8 @@ static void do_irq_balance(void)
                package_index = CPU_TO_PACKAGEINDEX(i);
                for (j = 0; j < NR_IRQS; j++) {
                        unsigned long value_now, delta;
-                       /* Is this an active IRQ? */
-                       if (!irq_desc[j].action)
+                       /* Is this an active IRQ or balancing disabled ? */
+                       if (!irq_desc[j].action || irq_balancing_disabled(j))
                                continue;
                        if ( package_index == i )
                                IRQ_DELTA(package_index,j) = 0;
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index 5a8ba0b..690113d 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -42,6 +42,8 @@
  * IRQF_SHARED - allow sharing the irq among several devices
  * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to 
occur
  * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
+ * IRQF_PERCPU - Interrupt is per cpu
+ * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
  */
 #define IRQF_DISABLED          0x00000020
 #define IRQF_SAMPLE_RANDOM     0x00000040
@@ -49,6 +51,7 @@
 #define IRQF_PROBE_SHARED      0x00000100
 #define IRQF_TIMER             0x00000200
 #define IRQF_PERCPU            0x00000400
+#define IRQF_NOBALANCING       0x00000800
 
 /*
  * Migration helpers. Scheduled for removal in 1/2007
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 5504b67..8930fb0 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -31,7 +31,7 @@ typedef       void fastcall (*irq_flow_handler_t)(unsigned 
int irq,
 /*
  * IRQ line status.
  *
- * Bits 0-16 are reserved for the IRQF_* bits in linux/interrupt.h
+ * Bits 0-7 are reserved for the IRQF_* bits in linux/interrupt.h
  *
  * IRQ types
  */
@@ -45,28 +45,31 @@ typedef     void fastcall (*irq_flow_handler_t)(unsigned 
int irq,
 #define IRQ_TYPE_PROBE         0x00000010      /* Probing in progress */
 
 /* Internal flags */
-#define IRQ_INPROGRESS         0x00010000      /* IRQ handler active - do not 
enter! */
-#define IRQ_DISABLED           0x00020000      /* IRQ disabled - do not enter! 
*/
-#define IRQ_PENDING            0x00040000      /* IRQ pending - replay on 
enable */
-#define IRQ_REPLAY             0x00080000      /* IRQ has been replayed but 
not acked yet */
-#define IRQ_AUTODETECT         0x00100000      /* IRQ is being autodetected */
-#define IRQ_WAITING            0x00200000      /* IRQ not yet seen - for 
autodetection */
-#define IRQ_LEVEL              0x00400000      /* IRQ level triggered */
-#define IRQ_MASKED             0x00800000      /* IRQ masked - shouldn't be 
seen again */
-#define IRQ_PER_CPU            0x01000000      /* IRQ is per CPU */
+#define IRQ_INPROGRESS         0x00000100      /* IRQ handler active - do not 
enter! */
+#define IRQ_DISABLED           0x00000200      /* IRQ disabled - do not enter! 
*/
+#define IRQ_PENDING            0x00000400      /* IRQ pending - replay on 
enable */
+#define IRQ_REPLAY             0x00000800      /* IRQ has been replayed but 
not acked yet */
+#define IRQ_AUTODETECT         0x00001000      /* IRQ is being autodetected */
+#define IRQ_WAITING            0x00002000      /* IRQ not yet seen - for 
autodetection */
+#define IRQ_LEVEL              0x00004000      /* IRQ level triggered */
+#define IRQ_MASKED             0x00008000      /* IRQ masked - shouldn't be 
seen again */
+#define IRQ_PER_CPU            0x00010000      /* IRQ is per CPU */
+#define IRQ_NOPROBE            0x00020000      /* IRQ is not valid for probing 
*/
+#define IRQ_NOREQUEST          0x00040000      /* IRQ cannot be requested */
+#define IRQ_NOAUTOEN           0x00080000      /* IRQ will not be enabled on 
request irq */
+#define IRQ_DELAYED_DISABLE    0x00100000      /* IRQ disable (masking) 
happens delayed. */
+#define IRQ_WAKEUP             0x00200000      /* IRQ triggers system wakeup */
+#define IRQ_MOVE_PENDING       0x00400000      /* need to re-target IRQ 
destination */
+#define IRQ_NO_BALANCING       0x00800000      /* IRQ is excluded from 
balancing */
+
 #ifdef CONFIG_IRQ_PER_CPU
 # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
+# define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
 #else
 # define CHECK_IRQ_PER_CPU(var) 0
+# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING
 #endif
 
-#define IRQ_NOPROBE            0x02000000      /* IRQ is not valid for probing 
*/
-#define IRQ_NOREQUEST          0x04000000      /* IRQ cannot be requested */
-#define IRQ_NOAUTOEN           0x08000000      /* IRQ will not be enabled on 
request irq */
-#define IRQ_DELAYED_DISABLE    0x10000000      /* IRQ disable (masking) 
happens delayed. */
-#define IRQ_WAKEUP             0x20000000      /* IRQ triggers system wakeup */
-#define IRQ_MOVE_PENDING       0x40000000      /* need to re-target IRQ 
destination */
-
 struct proc_dir_entry;
 struct msi_desc;
 
@@ -261,6 +264,11 @@ static inline int select_smp_affinity(unsigned int irq)
 
 extern int no_irq_affinity;
 
+static inline int irq_balancing_disabled(unsigned int irq)
+{
+       return irq_desc[irq].status & IRQ_NO_BALANCING_MASK;
+}
+
 /* Handle irq action chains: */
 extern int handle_IRQ_event(unsigned int irq, struct irqaction *action);
 
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index acc5d9f..cd790ad 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -281,6 +281,10 @@ int setup_irq(unsigned int irq, struct irqaction *new)
        if (new->flags & IRQF_PERCPU)
                desc->status |= IRQ_PER_CPU;
 #endif
+       /* Exclude IRQ from balancing */
+       if (new->flags & IRQF_NOBALANCING)
+               desc->status |= IRQ_NO_BALANCING;
+
        if (!shared) {
                irq_chip_set_defaults(desc->chip);
 
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
index 6d3be06..bb44bc9 100644
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -55,7 +55,7 @@ static int irq_affinity_write_proc(struct file *file, const 
char __user *buffer,
        cpumask_t new_value, tmp;
 
        if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
-                               CHECK_IRQ_PER_CPU(irq_desc[irq].status))
+           irq_balancing_disabled(irq))
                return -EIO;
 
        err = cpumask_parse_user(buffer, count, new_value);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to