diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 28 | ||||
-rw-r--r-- | arch/x86/kernel/irq.c | 13 |
2 files changed, 27 insertions, 14 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 6ad4658de705..b4b21db9f4ad 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -2312,7 +2312,7 @@ int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
2312 | int err; | 2312 | int err; |
2313 | 2313 | ||
2314 | if (!config_enabled(CONFIG_SMP)) | 2314 | if (!config_enabled(CONFIG_SMP)) |
2315 | return -1; | 2315 | return -EPERM; |
2316 | 2316 | ||
2317 | if (!cpumask_intersects(mask, cpu_online_mask)) | 2317 | if (!cpumask_intersects(mask, cpu_online_mask)) |
2318 | return -EINVAL; | 2318 | return -EINVAL; |
@@ -2343,7 +2343,7 @@ int native_ioapic_set_affinity(struct irq_data *data, | |||
2343 | int ret; | 2343 | int ret; |
2344 | 2344 | ||
2345 | if (!config_enabled(CONFIG_SMP)) | 2345 | if (!config_enabled(CONFIG_SMP)) |
2346 | return -1; | 2346 | return -EPERM; |
2347 | 2347 | ||
2348 | raw_spin_lock_irqsave(&ioapic_lock, flags); | 2348 | raw_spin_lock_irqsave(&ioapic_lock, flags); |
2349 | ret = __ioapic_set_affinity(data, mask, &dest); | 2349 | ret = __ioapic_set_affinity(data, mask, &dest); |
@@ -3075,9 +3075,11 @@ msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) | |||
3075 | struct irq_cfg *cfg = data->chip_data; | 3075 | struct irq_cfg *cfg = data->chip_data; |
3076 | struct msi_msg msg; | 3076 | struct msi_msg msg; |
3077 | unsigned int dest; | 3077 | unsigned int dest; |
3078 | int ret; | ||
3078 | 3079 | ||
3079 | if (__ioapic_set_affinity(data, mask, &dest)) | 3080 | ret = __ioapic_set_affinity(data, mask, &dest); |
3080 | return -1; | 3081 | if (ret) |
3082 | return ret; | ||
3081 | 3083 | ||
3082 | __get_cached_msi_msg(data->msi_desc, &msg); | 3084 | __get_cached_msi_msg(data->msi_desc, &msg); |
3083 | 3085 | ||
@@ -3177,9 +3179,11 @@ dmar_msi_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
3177 | struct irq_cfg *cfg = data->chip_data; | 3179 | struct irq_cfg *cfg = data->chip_data; |
3178 | unsigned int dest, irq = data->irq; | 3180 | unsigned int dest, irq = data->irq; |
3179 | struct msi_msg msg; | 3181 | struct msi_msg msg; |
3182 | int ret; | ||
3180 | 3183 | ||
3181 | if (__ioapic_set_affinity(data, mask, &dest)) | 3184 | ret = __ioapic_set_affinity(data, mask, &dest); |
3182 | return -1; | 3185 | if (ret) |
3186 | return ret; | ||
3183 | 3187 | ||
3184 | dmar_msi_read(irq, &msg); | 3188 | dmar_msi_read(irq, &msg); |
3185 | 3189 | ||
@@ -3226,9 +3230,11 @@ static int hpet_msi_set_affinity(struct irq_data *data, | |||
3226 | struct irq_cfg *cfg = data->chip_data; | 3230 | struct irq_cfg *cfg = data->chip_data; |
3227 | struct msi_msg msg; | 3231 | struct msi_msg msg; |
3228 | unsigned int dest; | 3232 | unsigned int dest; |
3233 | int ret; | ||
3229 | 3234 | ||
3230 | if (__ioapic_set_affinity(data, mask, &dest)) | 3235 | ret = __ioapic_set_affinity(data, mask, &dest); |
3231 | return -1; | 3236 | if (ret) |
3237 | return ret; | ||
3232 | 3238 | ||
3233 | hpet_msi_read(data->handler_data, &msg); | 3239 | hpet_msi_read(data->handler_data, &msg); |
3234 | 3240 | ||
@@ -3295,9 +3301,11 @@ ht_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) | |||
3295 | { | 3301 | { |
3296 | struct irq_cfg *cfg = data->chip_data; | 3302 | struct irq_cfg *cfg = data->chip_data; |
3297 | unsigned int dest; | 3303 | unsigned int dest; |
3304 | int ret; | ||
3298 | 3305 | ||
3299 | if (__ioapic_set_affinity(data, mask, &dest)) | 3306 | ret = __ioapic_set_affinity(data, mask, &dest); |
3300 | return -1; | 3307 | if (ret) |
3308 | return ret; | ||
3301 | 3309 | ||
3302 | target_ht_irq(data->irq, dest, cfg->vector); | 3310 | target_ht_irq(data->irq, dest, cfg->vector); |
3303 | return IRQ_SET_MASK_OK_NOCOPY; | 3311 | return IRQ_SET_MASK_OK_NOCOPY; |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 283a76a9cc40..49bbb57da7f5 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -357,6 +357,7 @@ void fixup_irqs(void) | |||
357 | struct irq_desc *desc; | 357 | struct irq_desc *desc; |
358 | struct irq_data *data; | 358 | struct irq_data *data; |
359 | struct irq_chip *chip; | 359 | struct irq_chip *chip; |
360 | int ret; | ||
360 | 361 | ||
361 | for_each_irq_desc(irq, desc) { | 362 | for_each_irq_desc(irq, desc) { |
362 | int break_affinity = 0; | 363 | int break_affinity = 0; |
@@ -395,10 +396,14 @@ void fixup_irqs(void) | |||
395 | if (!irqd_can_move_in_process_context(data) && chip->irq_mask) | 396 | if (!irqd_can_move_in_process_context(data) && chip->irq_mask) |
396 | chip->irq_mask(data); | 397 | chip->irq_mask(data); |
397 | 398 | ||
398 | if (chip->irq_set_affinity) | 399 | if (chip->irq_set_affinity) { |
399 | chip->irq_set_affinity(data, affinity, true); | 400 | ret = chip->irq_set_affinity(data, affinity, true); |
400 | else if (!(warned++)) | 401 | if (ret == -ENOSPC) |
401 | set_affinity = 0; | 402 | pr_crit("IRQ %d set affinity failed because there are no available vectors. The device assigned to this IRQ is unstable.\n", irq); |
403 | } else { | ||
404 | if (!(warned++)) | ||
405 | set_affinity = 0; | ||
406 | } | ||
402 | 407 | ||
403 | /* | 408 | /* |
404 | * We unmask if the irq was not marked masked by the | 409 | * We unmask if the irq was not marked masked by the |