diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
commit | 0cb7bf61b1e9f05027de58c80f9b46a714d24e35 (patch) | |
tree | 41fb55cf62d07b425122f9a8b96412c0d8eb99c5 /kernel/irq | |
parent | aa877175e7a9982233ed8f10cb4bfddd78d82741 (diff) | |
parent | 3eab887a55424fc2c27553b7bfe32330df83f7b8 (diff) |
Merge branch 'linus' into smp/hotplug
Apply upstream changes to avoid conflicts with pending patches.
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/affinity.c | 2 | ||||
-rw-r--r-- | kernel/irq/chip.c | 11 | ||||
-rw-r--r-- | kernel/irq/manage.c | 8 | ||||
-rw-r--r-- | kernel/irq/msi.c | 11 |
4 files changed, 30 insertions, 2 deletions
diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c index f68959341c0f..32f6cfcff212 100644 --- a/kernel/irq/affinity.c +++ b/kernel/irq/affinity.c | |||
@@ -39,6 +39,7 @@ struct cpumask *irq_create_affinity_mask(unsigned int *nr_vecs) | |||
39 | return NULL; | 39 | return NULL; |
40 | } | 40 | } |
41 | 41 | ||
42 | get_online_cpus(); | ||
42 | if (max_vecs >= num_online_cpus()) { | 43 | if (max_vecs >= num_online_cpus()) { |
43 | cpumask_copy(affinity_mask, cpu_online_mask); | 44 | cpumask_copy(affinity_mask, cpu_online_mask); |
44 | *nr_vecs = num_online_cpus(); | 45 | *nr_vecs = num_online_cpus(); |
@@ -56,6 +57,7 @@ struct cpumask *irq_create_affinity_mask(unsigned int *nr_vecs) | |||
56 | } | 57 | } |
57 | *nr_vecs = vecs; | 58 | *nr_vecs = vecs; |
58 | } | 59 | } |
60 | put_online_cpus(); | ||
59 | 61 | ||
60 | return affinity_mask; | 62 | return affinity_mask; |
61 | } | 63 | } |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index b4c1bc7c9ca2..637389088b3f 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -820,6 +820,17 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, | |||
820 | desc->name = name; | 820 | desc->name = name; |
821 | 821 | ||
822 | if (handle != handle_bad_irq && is_chained) { | 822 | if (handle != handle_bad_irq && is_chained) { |
823 | /* | ||
824 | * We're about to start this interrupt immediately, | ||
825 | * hence the need to set the trigger configuration. | ||
826 | * But the .set_type callback may have overridden the | ||
827 | * flow handler, ignoring that we're dealing with a | ||
828 | * chained interrupt. Reset it immediately because we | ||
829 | * do know better. | ||
830 | */ | ||
831 | __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data)); | ||
832 | desc->handle_irq = handle; | ||
833 | |||
823 | irq_settings_set_noprobe(desc); | 834 | irq_settings_set_noprobe(desc); |
824 | irq_settings_set_norequest(desc); | 835 | irq_settings_set_norequest(desc); |
825 | irq_settings_set_nothread(desc); | 836 | irq_settings_set_nothread(desc); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 73a2b786b5e9..9530fcd27704 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -1681,8 +1681,10 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, | |||
1681 | action->dev_id = dev_id; | 1681 | action->dev_id = dev_id; |
1682 | 1682 | ||
1683 | retval = irq_chip_pm_get(&desc->irq_data); | 1683 | retval = irq_chip_pm_get(&desc->irq_data); |
1684 | if (retval < 0) | 1684 | if (retval < 0) { |
1685 | kfree(action); | ||
1685 | return retval; | 1686 | return retval; |
1687 | } | ||
1686 | 1688 | ||
1687 | chip_bus_lock(desc); | 1689 | chip_bus_lock(desc); |
1688 | retval = __setup_irq(irq, desc, action); | 1690 | retval = __setup_irq(irq, desc, action); |
@@ -1985,8 +1987,10 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler, | |||
1985 | action->percpu_dev_id = dev_id; | 1987 | action->percpu_dev_id = dev_id; |
1986 | 1988 | ||
1987 | retval = irq_chip_pm_get(&desc->irq_data); | 1989 | retval = irq_chip_pm_get(&desc->irq_data); |
1988 | if (retval < 0) | 1990 | if (retval < 0) { |
1991 | kfree(action); | ||
1989 | return retval; | 1992 | return retval; |
1993 | } | ||
1990 | 1994 | ||
1991 | chip_bus_lock(desc); | 1995 | chip_bus_lock(desc); |
1992 | retval = __setup_irq(irq, desc, action); | 1996 | retval = __setup_irq(irq, desc, action); |
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 54999350162c..19e9dfbe97fa 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c | |||
@@ -359,6 +359,17 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, | |||
359 | else | 359 | else |
360 | dev_dbg(dev, "irq [%d-%d] for MSI\n", | 360 | dev_dbg(dev, "irq [%d-%d] for MSI\n", |
361 | virq, virq + desc->nvec_used - 1); | 361 | virq, virq + desc->nvec_used - 1); |
362 | /* | ||
363 | * This flag is set by the PCI layer as we need to activate | ||
364 | * the MSI entries before the PCI layer enables MSI in the | ||
365 | * card. Otherwise the card latches a random msi message. | ||
366 | */ | ||
367 | if (info->flags & MSI_FLAG_ACTIVATE_EARLY) { | ||
368 | struct irq_data *irq_data; | ||
369 | |||
370 | irq_data = irq_domain_get_irq_data(domain, desc->irq); | ||
371 | irq_domain_activate_irq(irq_data); | ||
372 | } | ||
362 | } | 373 | } |
363 | 374 | ||
364 | return 0; | 375 | return 0; |