Skip to content

Commit 7d04319

Browse files
committed
x86/apic: Convert to IRQCHIP_MOVE_DEFERRED
Instead of marking individual interrupts as safe to be migrated in arbitrary contexts, mark the interrupt chips, which require the interrupt to be moved in actual interrupt context, with the new IRQCHIP_MOVE_DEFERRED flag. This makes more sense because this is a per interrupt chip property and not restricted to individual interrupts. That flips the logic from the historical opt-out to a opt-in model. This is simpler to handle for other architectures, which default to unrestricted affinity setting. It also allows to cleanup the redundant core logic significantly. All interrupt chips, which belong to a top-level domain sitting directly on top of the x86 vector domain are marked accordingly, unless the related setup code marks the interrupts with IRQ_MOVE_PCNTXT, i.e. XEN. No functional change intended. Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Steve Wahl <[email protected]> Acked-by: Wei Liu <[email protected]> Link: https://lore.kernel.org/all/[email protected]
1 parent a648eb3 commit 7d04319

File tree

11 files changed

+7
-23
lines changed

11 files changed

+7
-23
lines changed

arch/x86/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ config X86
173173
select GENERIC_IRQ_RESERVATION_MODE
174174
select GENERIC_IRQ_SHOW
175175
select GENERIC_PENDING_IRQ if SMP
176+
select GENERIC_PENDING_IRQ_CHIPFLAGS if SMP
176177
select GENERIC_PTDUMP
177178
select GENERIC_SMP_IDLE_THREAD
178179
select GENERIC_TIME_VSYSCALL

arch/x86/hyperv/irqdomain.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ static struct irq_chip hv_pci_msi_controller = {
304304
.irq_retrigger = irq_chip_retrigger_hierarchy,
305305
.irq_compose_msi_msg = hv_irq_compose_msi_msg,
306306
.irq_set_affinity = msi_domain_set_affinity,
307-
.flags = IRQCHIP_SKIP_SET_WAKE,
307+
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED,
308308
};
309309

310310
static struct msi_domain_ops pci_msi_domain_ops = {

arch/x86/kernel/apic/io_apic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1861,7 +1861,7 @@ static struct irq_chip ioapic_chip __read_mostly = {
18611861
.irq_set_affinity = ioapic_set_affinity,
18621862
.irq_retrigger = irq_chip_retrigger_hierarchy,
18631863
.irq_get_irqchip_state = ioapic_irq_get_chip_state,
1864-
.flags = IRQCHIP_SKIP_SET_WAKE |
1864+
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
18651865
IRQCHIP_AFFINITY_PRE_STARTUP,
18661866
};
18671867

arch/x86/kernel/apic/msi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ static bool x86_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
214214
if (WARN_ON_ONCE(domain != real_parent))
215215
return false;
216216
info->chip->irq_set_affinity = msi_set_affinity;
217+
info->chip->flags |= IRQCHIP_MOVE_DEFERRED;
217218
break;
218219
case DOMAIN_BUS_DMAR:
219220
case DOMAIN_BUS_AMDVI:
@@ -315,7 +316,7 @@ static struct irq_chip dmar_msi_controller = {
315316
.irq_retrigger = irq_chip_retrigger_hierarchy,
316317
.irq_compose_msi_msg = dmar_msi_compose_msg,
317318
.irq_write_msi_msg = dmar_msi_write_msg,
318-
.flags = IRQCHIP_SKIP_SET_WAKE |
319+
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
319320
IRQCHIP_AFFINITY_PRE_STARTUP,
320321
};
321322

arch/x86/kernel/hpet.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -516,22 +516,14 @@ static int hpet_msi_init(struct irq_domain *domain,
516516
struct msi_domain_info *info, unsigned int virq,
517517
irq_hw_number_t hwirq, msi_alloc_info_t *arg)
518518
{
519-
irq_set_status_flags(virq, IRQ_MOVE_PCNTXT);
520519
irq_domain_set_info(domain, virq, arg->hwirq, info->chip, NULL,
521520
handle_edge_irq, arg->data, "edge");
522521

523522
return 0;
524523
}
525524

526-
static void hpet_msi_free(struct irq_domain *domain,
527-
struct msi_domain_info *info, unsigned int virq)
528-
{
529-
irq_clear_status_flags(virq, IRQ_MOVE_PCNTXT);
530-
}
531-
532525
static struct msi_domain_ops hpet_msi_domain_ops = {
533526
.msi_init = hpet_msi_init,
534-
.msi_free = hpet_msi_free,
535527
};
536528

537529
static struct msi_domain_info hpet_msi_domain_info = {

arch/x86/platform/uv/uv_irq.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ static int uv_domain_alloc(struct irq_domain *domain, unsigned int virq,
9292
if (ret >= 0) {
9393
if (info->uv.limit == UV_AFFINITY_CPU)
9494
irq_set_status_flags(virq, IRQ_NO_BALANCING);
95-
else
96-
irq_set_status_flags(virq, IRQ_MOVE_PCNTXT);
9795

9896
chip_data->pnode = uv_blade_to_pnode(info->uv.blade);
9997
chip_data->offset = info->uv.offset;
@@ -113,7 +111,6 @@ static void uv_domain_free(struct irq_domain *domain, unsigned int virq,
113111

114112
BUG_ON(nr_irqs != 1);
115113
kfree(irq_data->chip_data);
116-
irq_clear_status_flags(virq, IRQ_MOVE_PCNTXT);
117114
irq_clear_status_flags(virq, IRQ_NO_BALANCING);
118115
irq_domain_free_irqs_top(domain, virq, nr_irqs);
119116
}

drivers/iommu/amd/init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,7 @@ static struct irq_chip intcapxt_controller = {
23322332
.irq_retrigger = irq_chip_retrigger_hierarchy,
23332333
.irq_set_affinity = intcapxt_set_affinity,
23342334
.irq_set_wake = intcapxt_set_wake,
2335-
.flags = IRQCHIP_MASK_ON_SUSPEND,
2335+
.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_MOVE_DEFERRED,
23362336
};
23372337

23382338
static const struct irq_domain_ops intcapxt_domain_ops = {

drivers/iommu/amd/iommu.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3532,7 +3532,6 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq,
35323532
irq_data->chip_data = data;
35333533
irq_data->chip = &amd_ir_chip;
35343534
irq_remapping_prepare_irte(data, cfg, info, devid, index, i);
3535-
irq_set_status_flags(virq + i, IRQ_MOVE_PCNTXT);
35363535
}
35373536

35383537
return 0;

drivers/iommu/intel/irq_remapping.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,6 @@ static int intel_irq_remapping_alloc(struct irq_domain *domain,
14631463
else
14641464
irq_data->chip = &intel_ir_chip;
14651465
intel_irq_remapping_prepare_irte(ird, irq_cfg, info, index, i);
1466-
irq_set_status_flags(virq + i, IRQ_MOVE_PCNTXT);
14671466
}
14681467
return 0;
14691468

drivers/pci/controller/pci-hyperv.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2053,6 +2053,7 @@ static struct irq_chip hv_msi_irq_chip = {
20532053
.irq_set_affinity = irq_chip_set_affinity_parent,
20542054
#ifdef CONFIG_X86
20552055
.irq_ack = irq_chip_ack_parent,
2056+
.flags = IRQCHIP_MOVE_DEFERRED,
20562057
#elif defined(CONFIG_ARM64)
20572058
.irq_eoi = irq_chip_eoi_parent,
20582059
#endif

drivers/xen/events/events_base.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -722,12 +722,6 @@ static struct irq_info *xen_irq_init(unsigned int irq)
722722
INIT_RCU_WORK(&info->rwork, delayed_free_irq);
723723

724724
set_info_for_irq(irq, info);
725-
/*
726-
* Interrupt affinity setting can be immediate. No point
727-
* in delaying it until an interrupt is handled.
728-
*/
729-
irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
730-
731725
INIT_LIST_HEAD(&info->eoi_list);
732726
list_add_tail(&info->list, &xen_irq_list_head);
733727
}

0 commit comments

Comments
 (0)