Skip to content

Commit 42e1cc2

Browse files
committed
genirq/irqdomain: Propagate early activation
Propagate the early activation mode to the irqdomain activate() callbacks. This is required for the upcoming reservation, late vector assignment scheme, so that the early activation call can act accordingly. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Juergen Gross <jgross@suse.com> Tested-by: Yu Chen <yu.c.chen@intel.com> Acked-by: Juergen Gross <jgross@suse.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Alok Kataria <akataria@vmware.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Rui Zhang <rui.zhang@intel.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Len Brown <lenb@kernel.org> Link: https://lkml.kernel.org/r/20170913213153.028353660@linutronix.de
1 parent bb9b428 commit 42e1cc2

File tree

6 files changed

+13
-12
lines changed

6 files changed

+13
-12
lines changed

arch/x86/kernel/apic/io_apic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,7 +2096,7 @@ static inline void __init check_timer(void)
20962096
unmask_ioapic_irq(irq_get_irq_data(0));
20972097
}
20982098
irq_domain_deactivate_irq(irq_data);
2099-
irq_domain_activate_irq(irq_data);
2099+
irq_domain_activate_irq(irq_data, false);
21002100
if (timer_irq_works()) {
21012101
if (disable_timer_pin_1 > 0)
21022102
clear_IO_APIC_pin(0, pin1);
@@ -2118,7 +2118,7 @@ static inline void __init check_timer(void)
21182118
*/
21192119
replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2);
21202120
irq_domain_deactivate_irq(irq_data);
2121-
irq_domain_activate_irq(irq_data);
2121+
irq_domain_activate_irq(irq_data, false);
21222122
legacy_pic->unmask(0);
21232123
if (timer_irq_works()) {
21242124
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");

include/linux/irqdomain.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ extern int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
441441
unsigned int nr_irqs, int node, void *arg,
442442
bool realloc, const struct cpumask *affinity);
443443
extern void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs);
444-
extern int irq_domain_activate_irq(struct irq_data *irq_data);
444+
extern int irq_domain_activate_irq(struct irq_data *irq_data, bool early);
445445
extern void irq_domain_deactivate_irq(struct irq_data *irq_data);
446446

447447
static inline int irq_domain_alloc_irqs(struct irq_domain *domain,

kernel/irq/chip.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ __irq_startup_managed(struct irq_desc *desc, struct cpumask *aff, bool force)
223223
* Managed interrupts have reserved resources, so this should not
224224
* happen.
225225
*/
226-
if (WARN_ON(irq_domain_activate_irq(d)))
226+
if (WARN_ON(irq_domain_activate_irq(d, false)))
227227
return IRQ_STARTUP_ABORT;
228228
return IRQ_STARTUP_MANAGED;
229229
}
@@ -290,7 +290,7 @@ int irq_activate(struct irq_desc *desc)
290290
struct irq_data *d = irq_desc_get_irq_data(desc);
291291

292292
if (!irqd_affinity_is_managed(d))
293-
return irq_domain_activate_irq(d);
293+
return irq_domain_activate_irq(d, false);
294294
return 0;
295295
}
296296

kernel/irq/internals.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ static inline bool irq_fixup_move_pending(struct irq_desc *desc, bool fclear)
439439
#endif /* !CONFIG_GENERIC_PENDING_IRQ */
440440

441441
#if !defined(CONFIG_IRQ_DOMAIN) || !defined(CONFIG_IRQ_DOMAIN_HIERARCHY)
442-
static inline int irq_domain_activate_irq(struct irq_data *data)
442+
static inline int irq_domain_activate_irq(struct irq_data *data, bool early)
443443
{
444444
irqd_set_activated(data);
445445
return 0;

kernel/irq/irqdomain.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,17 +1694,18 @@ static void __irq_domain_deactivate_irq(struct irq_data *irq_data)
16941694
}
16951695
}
16961696

1697-
static int __irq_domain_activate_irq(struct irq_data *irqd)
1697+
static int __irq_domain_activate_irq(struct irq_data *irqd, bool early)
16981698
{
16991699
int ret = 0;
17001700

17011701
if (irqd && irqd->domain) {
17021702
struct irq_domain *domain = irqd->domain;
17031703

17041704
if (irqd->parent_data)
1705-
ret = __irq_domain_activate_irq(irqd->parent_data);
1705+
ret = __irq_domain_activate_irq(irqd->parent_data,
1706+
early);
17061707
if (!ret && domain->ops->activate) {
1707-
ret = domain->ops->activate(domain, irqd, false);
1708+
ret = domain->ops->activate(domain, irqd, early);
17081709
/* Rollback in case of error */
17091710
if (ret && irqd->parent_data)
17101711
__irq_domain_deactivate_irq(irqd->parent_data);
@@ -1721,12 +1722,12 @@ static int __irq_domain_activate_irq(struct irq_data *irqd)
17211722
* This is the second step to call domain_ops->activate to program interrupt
17221723
* controllers, so the interrupt could actually get delivered.
17231724
*/
1724-
int irq_domain_activate_irq(struct irq_data *irq_data)
1725+
int irq_domain_activate_irq(struct irq_data *irq_data, bool early)
17251726
{
17261727
int ret = 0;
17271728

17281729
if (!irqd_is_activated(irq_data))
1729-
ret = __irq_domain_activate_irq(irq_data);
1730+
ret = __irq_domain_activate_irq(irq_data, early);
17301731
if (!ret)
17311732
irqd_set_activated(irq_data);
17321733
return ret;

kernel/irq/msi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
401401
struct irq_data *irq_data;
402402

403403
irq_data = irq_domain_get_irq_data(domain, desc->irq);
404-
ret = irq_domain_activate_irq(irq_data);
404+
ret = irq_domain_activate_irq(irq_data, true);
405405
if (ret)
406406
goto cleanup;
407407
}

0 commit comments

Comments
 (0)