diff options
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r-- | kernel/irq/manage.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 7c85d69188ef..5597c157442a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -38,6 +38,46 @@ void synchronize_irq(unsigned int irq) | |||
38 | } | 38 | } |
39 | EXPORT_SYMBOL(synchronize_irq); | 39 | EXPORT_SYMBOL(synchronize_irq); |
40 | 40 | ||
41 | /** | ||
42 | * irq_can_set_affinity - Check if the affinity of a given irq can be set | ||
43 | * @irq: Interrupt to check | ||
44 | * | ||
45 | */ | ||
46 | int irq_can_set_affinity(unsigned int irq) | ||
47 | { | ||
48 | struct irq_desc *desc = irq_desc + irq; | ||
49 | |||
50 | if (CHECK_IRQ_PER_CPU(desc->status) || !desc->chip || | ||
51 | !desc->chip->set_affinity) | ||
52 | return 0; | ||
53 | |||
54 | return 1; | ||
55 | } | ||
56 | |||
57 | /** | ||
58 | * irq_set_affinity - Set the irq affinity of a given irq | ||
59 | * @irq: Interrupt to set affinity | ||
60 | * @cpumask: cpumask | ||
61 | * | ||
62 | */ | ||
63 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | ||
64 | { | ||
65 | struct irq_desc *desc = irq_desc + irq; | ||
66 | |||
67 | if (!desc->chip->set_affinity) | ||
68 | return -EINVAL; | ||
69 | |||
70 | set_balance_irq_affinity(irq, cpumask); | ||
71 | |||
72 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
73 | set_pending_irq(irq, cpumask); | ||
74 | #else | ||
75 | desc->affinity = cpumask; | ||
76 | desc->chip->set_affinity(irq, cpumask); | ||
77 | #endif | ||
78 | return 0; | ||
79 | } | ||
80 | |||
41 | #endif | 81 | #endif |
42 | 82 | ||
43 | /** | 83 | /** |
@@ -281,6 +321,10 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
281 | if (new->flags & IRQF_PERCPU) | 321 | if (new->flags & IRQF_PERCPU) |
282 | desc->status |= IRQ_PER_CPU; | 322 | desc->status |= IRQ_PER_CPU; |
283 | #endif | 323 | #endif |
324 | /* Exclude IRQ from balancing */ | ||
325 | if (new->flags & IRQF_NOBALANCING) | ||
326 | desc->status |= IRQ_NO_BALANCING; | ||
327 | |||
284 | if (!shared) { | 328 | if (!shared) { |
285 | irq_chip_set_defaults(desc->chip); | 329 | irq_chip_set_defaults(desc->chip); |
286 | 330 | ||
@@ -461,7 +505,7 @@ int request_irq(unsigned int irq, irq_handler_t handler, | |||
461 | /* | 505 | /* |
462 | * Lockdep wants atomic interrupt handlers: | 506 | * Lockdep wants atomic interrupt handlers: |
463 | */ | 507 | */ |
464 | irqflags |= SA_INTERRUPT; | 508 | irqflags |= IRQF_DISABLED; |
465 | #endif | 509 | #endif |
466 | /* | 510 | /* |
467 | * Sanity-check: shared interrupts must pass in a real dev-ID, | 511 | * Sanity-check: shared interrupts must pass in a real dev-ID, |