[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 <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b463fc6073
commit
950f4427c2
|
@ -482,8 +482,8 @@ static void do_irq_balance(void)
|
||||||
package_index = CPU_TO_PACKAGEINDEX(i);
|
package_index = CPU_TO_PACKAGEINDEX(i);
|
||||||
for (j = 0; j < NR_IRQS; j++) {
|
for (j = 0; j < NR_IRQS; j++) {
|
||||||
unsigned long value_now, delta;
|
unsigned long value_now, delta;
|
||||||
/* Is this an active IRQ? */
|
/* Is this an active IRQ or balancing disabled ? */
|
||||||
if (!irq_desc[j].action)
|
if (!irq_desc[j].action || irq_balancing_disabled(j))
|
||||||
continue;
|
continue;
|
||||||
if ( package_index == i )
|
if ( package_index == i )
|
||||||
IRQ_DELTA(package_index,j) = 0;
|
IRQ_DELTA(package_index,j) = 0;
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
* IRQF_SHARED - allow sharing the irq among several devices
|
* IRQF_SHARED - allow sharing the irq among several devices
|
||||||
* IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
|
* IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
|
||||||
* IRQF_TIMER - Flag to mark this interrupt as timer interrupt
|
* 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_DISABLED 0x00000020
|
||||||
#define IRQF_SAMPLE_RANDOM 0x00000040
|
#define IRQF_SAMPLE_RANDOM 0x00000040
|
||||||
|
@ -49,6 +51,7 @@
|
||||||
#define IRQF_PROBE_SHARED 0x00000100
|
#define IRQF_PROBE_SHARED 0x00000100
|
||||||
#define IRQF_TIMER 0x00000200
|
#define IRQF_TIMER 0x00000200
|
||||||
#define IRQF_PERCPU 0x00000400
|
#define IRQF_PERCPU 0x00000400
|
||||||
|
#define IRQF_NOBALANCING 0x00000800
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Migration helpers. Scheduled for removal in 1/2007
|
* Migration helpers. Scheduled for removal in 1/2007
|
||||||
|
|
|
@ -31,7 +31,7 @@ typedef void fastcall (*irq_flow_handler_t)(unsigned int irq,
|
||||||
/*
|
/*
|
||||||
* IRQ line status.
|
* 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
|
* IRQ types
|
||||||
*/
|
*/
|
||||||
|
@ -45,28 +45,31 @@ typedef void fastcall (*irq_flow_handler_t)(unsigned int irq,
|
||||||
#define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */
|
#define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */
|
||||||
|
|
||||||
/* Internal flags */
|
/* Internal flags */
|
||||||
#define IRQ_INPROGRESS 0x00010000 /* IRQ handler active - do not enter! */
|
#define IRQ_INPROGRESS 0x00000100 /* IRQ handler active - do not enter! */
|
||||||
#define IRQ_DISABLED 0x00020000 /* IRQ disabled - do not enter! */
|
#define IRQ_DISABLED 0x00000200 /* IRQ disabled - do not enter! */
|
||||||
#define IRQ_PENDING 0x00040000 /* IRQ pending - replay on enable */
|
#define IRQ_PENDING 0x00000400 /* IRQ pending - replay on enable */
|
||||||
#define IRQ_REPLAY 0x00080000 /* IRQ has been replayed but not acked yet */
|
#define IRQ_REPLAY 0x00000800 /* IRQ has been replayed but not acked yet */
|
||||||
#define IRQ_AUTODETECT 0x00100000 /* IRQ is being autodetected */
|
#define IRQ_AUTODETECT 0x00001000 /* IRQ is being autodetected */
|
||||||
#define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */
|
#define IRQ_WAITING 0x00002000 /* IRQ not yet seen - for autodetection */
|
||||||
#define IRQ_LEVEL 0x00400000 /* IRQ level triggered */
|
#define IRQ_LEVEL 0x00004000 /* IRQ level triggered */
|
||||||
#define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */
|
#define IRQ_MASKED 0x00008000 /* IRQ masked - shouldn't be seen again */
|
||||||
#define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */
|
#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
|
#ifdef CONFIG_IRQ_PER_CPU
|
||||||
# define CHECK_IRQ_PER_CPU(var) ((var) & 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
|
#else
|
||||||
# define CHECK_IRQ_PER_CPU(var) 0
|
# define CHECK_IRQ_PER_CPU(var) 0
|
||||||
|
# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING
|
||||||
#endif
|
#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 proc_dir_entry;
|
||||||
struct msi_desc;
|
struct msi_desc;
|
||||||
|
|
||||||
|
@ -261,6 +264,11 @@ static inline int select_smp_affinity(unsigned int irq)
|
||||||
|
|
||||||
extern int no_irq_affinity;
|
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: */
|
/* Handle irq action chains: */
|
||||||
extern int handle_IRQ_event(unsigned int irq, struct irqaction *action);
|
extern int handle_IRQ_event(unsigned int irq, struct irqaction *action);
|
||||||
|
|
||||||
|
|
|
@ -281,6 +281,10 @@ int setup_irq(unsigned int irq, struct irqaction *new)
|
||||||
if (new->flags & IRQF_PERCPU)
|
if (new->flags & IRQF_PERCPU)
|
||||||
desc->status |= IRQ_PER_CPU;
|
desc->status |= IRQ_PER_CPU;
|
||||||
#endif
|
#endif
|
||||||
|
/* Exclude IRQ from balancing */
|
||||||
|
if (new->flags & IRQF_NOBALANCING)
|
||||||
|
desc->status |= IRQ_NO_BALANCING;
|
||||||
|
|
||||||
if (!shared) {
|
if (!shared) {
|
||||||
irq_chip_set_defaults(desc->chip);
|
irq_chip_set_defaults(desc->chip);
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
|
||||||
cpumask_t new_value, tmp;
|
cpumask_t new_value, tmp;
|
||||||
|
|
||||||
if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
|
if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
|
||||||
CHECK_IRQ_PER_CPU(irq_desc[irq].status))
|
irq_balancing_disabled(irq))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
err = cpumask_parse_user(buffer, count, new_value);
|
err = cpumask_parse_user(buffer, count, new_value);
|
||||||
|
|
Loading…
Reference in New Issue