diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-12-16 06:24:38 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-16 06:24:38 -0500 |
| commit | c3895b01e80d120e8d19435f7cb1fa4c60c4e269 (patch) | |
| tree | 426f36e999289eeb7a41f6f4ca8ff45bfc2372aa /kernel/irq/manage.c | |
| parent | 3c68b4a8071fb11d905570d9b0e23034adc6c2bb (diff) | |
| parent | 968ea6d80e395cf11a51143cfa1b9a14ada676df (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-ingo into cpus4096
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 801addda3c43..10ad2f87ed9a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -79,7 +79,7 @@ int irq_can_set_affinity(unsigned int irq) | |||
| 79 | * @cpumask: cpumask | 79 | * @cpumask: cpumask |
| 80 | * | 80 | * |
| 81 | */ | 81 | */ |
| 82 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | 82 | int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) |
| 83 | { | 83 | { |
| 84 | struct irq_desc *desc = irq_to_desc(irq); | 84 | struct irq_desc *desc = irq_to_desc(irq); |
| 85 | unsigned long flags; | 85 | unsigned long flags; |
| @@ -91,14 +91,14 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | |||
| 91 | 91 | ||
| 92 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 92 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 93 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { | 93 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { |
| 94 | desc->affinity = cpumask; | 94 | cpumask_copy(&desc->affinity, cpumask); |
| 95 | desc->chip->set_affinity(irq, cpumask); | 95 | desc->chip->set_affinity(irq, cpumask); |
| 96 | } else { | 96 | } else { |
| 97 | desc->status |= IRQ_MOVE_PENDING; | 97 | desc->status |= IRQ_MOVE_PENDING; |
| 98 | desc->pending_mask = cpumask; | 98 | cpumask_copy(&desc->pending_mask, cpumask); |
| 99 | } | 99 | } |
| 100 | #else | 100 | #else |
| 101 | desc->affinity = cpumask; | 101 | cpumask_copy(&desc->affinity, cpumask); |
| 102 | desc->chip->set_affinity(irq, cpumask); | 102 | desc->chip->set_affinity(irq, cpumask); |
| 103 | #endif | 103 | #endif |
| 104 | desc->status |= IRQ_AFFINITY_SET; | 104 | desc->status |= IRQ_AFFINITY_SET; |
| @@ -112,26 +112,24 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | |||
| 112 | */ | 112 | */ |
| 113 | int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc) | 113 | int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc) |
| 114 | { | 114 | { |
| 115 | cpumask_t mask; | ||
| 116 | |||
| 117 | if (!irq_can_set_affinity(irq)) | 115 | if (!irq_can_set_affinity(irq)) |
| 118 | return 0; | 116 | return 0; |
| 119 | 117 | ||
| 120 | cpus_and(mask, cpu_online_map, irq_default_affinity); | ||
| 121 | |||
| 122 | /* | 118 | /* |
| 123 | * Preserve an userspace affinity setup, but make sure that | 119 | * Preserve an userspace affinity setup, but make sure that |
| 124 | * one of the targets is online. | 120 | * one of the targets is online. |
| 125 | */ | 121 | */ |
| 126 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { | 122 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { |
| 127 | if (cpus_intersects(desc->affinity, cpu_online_map)) | 123 | if (cpumask_any_and(&desc->affinity, cpu_online_mask) |
| 128 | mask = desc->affinity; | 124 | < nr_cpu_ids) |
| 125 | goto set_affinity; | ||
| 129 | else | 126 | else |
| 130 | desc->status &= ~IRQ_AFFINITY_SET; | 127 | desc->status &= ~IRQ_AFFINITY_SET; |
| 131 | } | 128 | } |
| 132 | 129 | ||
| 133 | desc->affinity = mask; | 130 | cpumask_and(&desc->affinity, cpu_online_mask, &irq_default_affinity); |
| 134 | desc->chip->set_affinity(irq, mask); | 131 | set_affinity: |
| 132 | desc->chip->set_affinity(irq, &desc->affinity); | ||
| 135 | 133 | ||
| 136 | return 0; | 134 | return 0; |
| 137 | } | 135 | } |
