diff options
| author | Jiang Liu <liuj97@gmail.com> | 2012-03-30 11:11:34 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2012-05-24 16:36:40 -0400 |
| commit | 818b0f3bfb236ae66cac3ff38e86b9e47f24b7aa (patch) | |
| tree | 711e4396d69f1127cd723b00ad348c47bd433a2b | |
| parent | 23812b9d9e497580d38c62ebdc6f308733b0a32a (diff) | |
genirq: Introduce irq_do_set_affinity() to reduce duplicated code
All invocations of chip->irq_set_affinity() are doing the same return
value checks. Let them all use a common function.
[ tglx: removed the silly likely while at it ]
Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Cc: Jiang Liu <liuj97@gmail.com>
Cc: Keping Chen <chenkeping@huawei.com>
Link: http://lkml.kernel.org/r/1333120296-13563-3-git-send-email-jiang.liu@huawei.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | kernel/irq/internals.h | 3 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 39 | ||||
| -rw-r--r-- | kernel/irq/migration.c | 13 |
3 files changed, 27 insertions, 28 deletions
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 8e5c56b3b7d9..001fa5bab490 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -101,6 +101,9 @@ extern int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask); | |||
| 101 | 101 | ||
| 102 | extern void irq_set_thread_affinity(struct irq_desc *desc); | 102 | extern void irq_set_thread_affinity(struct irq_desc *desc); |
| 103 | 103 | ||
| 104 | extern int irq_do_set_affinity(struct irq_data *data, | ||
| 105 | const struct cpumask *dest, bool force); | ||
| 106 | |||
| 104 | /* Inline functions for support of irq chips on slow busses */ | 107 | /* Inline functions for support of irq chips on slow busses */ |
| 105 | static inline void chip_bus_lock(struct irq_desc *desc) | 108 | static inline void chip_bus_lock(struct irq_desc *desc) |
| 106 | { | 109 | { |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index bb32326afe87..a1b903380bcf 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -139,6 +139,25 @@ static inline void | |||
| 139 | irq_get_pending(struct cpumask *mask, struct irq_desc *desc) { } | 139 | irq_get_pending(struct cpumask *mask, struct irq_desc *desc) { } |
| 140 | #endif | 140 | #endif |
| 141 | 141 | ||
| 142 | int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | ||
| 143 | bool force) | ||
| 144 | { | ||
| 145 | struct irq_desc *desc = irq_data_to_desc(data); | ||
| 146 | struct irq_chip *chip = irq_data_get_irq_chip(data); | ||
| 147 | int ret; | ||
| 148 | |||
| 149 | ret = chip->irq_set_affinity(data, mask, false); | ||
| 150 | switch (ret) { | ||
| 151 | case IRQ_SET_MASK_OK: | ||
| 152 | cpumask_copy(data->affinity, mask); | ||
| 153 | case IRQ_SET_MASK_OK_NOCOPY: | ||
| 154 | irq_set_thread_affinity(desc); | ||
| 155 | ret = 0; | ||
| 156 | } | ||
| 157 | |||
| 158 | return ret; | ||
| 159 | } | ||
| 160 | |||
| 142 | int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | 161 | int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) |
| 143 | { | 162 | { |
| 144 | struct irq_chip *chip = irq_data_get_irq_chip(data); | 163 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
| @@ -149,14 +168,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | |||
| 149 | return -EINVAL; | 168 | return -EINVAL; |
| 150 | 169 | ||
| 151 | if (irq_can_move_pcntxt(data)) { | 170 | if (irq_can_move_pcntxt(data)) { |
| 152 | ret = chip->irq_set_affinity(data, mask, false); | 171 | ret = irq_do_set_affinity(data, mask, false); |
| 153 | switch (ret) { | ||
| 154 | case IRQ_SET_MASK_OK: | ||
| 155 | cpumask_copy(data->affinity, mask); | ||
| 156 | case IRQ_SET_MASK_OK_NOCOPY: | ||
| 157 | irq_set_thread_affinity(desc); | ||
| 158 | ret = 0; | ||
| 159 | } | ||
| 160 | } else { | 172 | } else { |
| 161 | irqd_set_move_pending(data); | 173 | irqd_set_move_pending(data); |
| 162 | irq_copy_pending(desc, mask); | 174 | irq_copy_pending(desc, mask); |
| @@ -280,9 +292,8 @@ EXPORT_SYMBOL_GPL(irq_set_affinity_notifier); | |||
| 280 | static int | 292 | static int |
| 281 | setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) | 293 | setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) |
| 282 | { | 294 | { |
| 283 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
| 284 | struct cpumask *set = irq_default_affinity; | 295 | struct cpumask *set = irq_default_affinity; |
| 285 | int ret, node = desc->irq_data.node; | 296 | int node = desc->irq_data.node; |
| 286 | 297 | ||
| 287 | /* Excludes PER_CPU and NO_BALANCE interrupts */ | 298 | /* Excludes PER_CPU and NO_BALANCE interrupts */ |
| 288 | if (!irq_can_set_affinity(irq)) | 299 | if (!irq_can_set_affinity(irq)) |
| @@ -308,13 +319,7 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) | |||
| 308 | if (cpumask_intersects(mask, nodemask)) | 319 | if (cpumask_intersects(mask, nodemask)) |
| 309 | cpumask_and(mask, mask, nodemask); | 320 | cpumask_and(mask, mask, nodemask); |
| 310 | } | 321 | } |
| 311 | ret = chip->irq_set_affinity(&desc->irq_data, mask, false); | 322 | irq_do_set_affinity(&desc->irq_data, mask, false); |
| 312 | switch (ret) { | ||
| 313 | case IRQ_SET_MASK_OK: | ||
| 314 | cpumask_copy(desc->irq_data.affinity, mask); | ||
| 315 | case IRQ_SET_MASK_OK_NOCOPY: | ||
| 316 | irq_set_thread_affinity(desc); | ||
| 317 | } | ||
| 318 | return 0; | 323 | return 0; |
| 319 | } | 324 | } |
| 320 | #else | 325 | #else |
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index c3c89751b327..ca3f4aaff707 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
| @@ -42,17 +42,8 @@ void irq_move_masked_irq(struct irq_data *idata) | |||
| 42 | * For correct operation this depends on the caller | 42 | * For correct operation this depends on the caller |
| 43 | * masking the irqs. | 43 | * masking the irqs. |
| 44 | */ | 44 | */ |
| 45 | if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) | 45 | if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) |
| 46 | < nr_cpu_ids)) { | 46 | irq_do_set_affinity(&desc->irq_data, desc->pending_mask, false); |
| 47 | int ret = chip->irq_set_affinity(&desc->irq_data, | ||
| 48 | desc->pending_mask, false); | ||
| 49 | switch (ret) { | ||
| 50 | case IRQ_SET_MASK_OK: | ||
| 51 | cpumask_copy(desc->irq_data.affinity, desc->pending_mask); | ||
| 52 | case IRQ_SET_MASK_OK_NOCOPY: | ||
| 53 | irq_set_thread_affinity(desc); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | 47 | ||
| 57 | cpumask_clear(desc->pending_mask); | 48 | cpumask_clear(desc->pending_mask); |
| 58 | } | 49 | } |
