Le Wed, Mar 25, 2026 at 05:09:35PM +0800, Qiliang Yuan a écrit : > Managed interrupts currently have their affinity determined once, > honoring boot-time isolation settings. There is no mechanism to migrate > them when housekeeping boundaries change at runtime. > > Enable managed interrupts to respond dynamically to housekeeping updates. > > This ensures that managed interrupts are migrated away from newly > isolated CPUs or redistributed when housekeeping CPUs are added. > > Signed-off-by: Qiliang Yuan <[email protected]> > --- > kernel/irq/manage.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c > index 349ae7979da0e..f2cba3d7ef624 100644 > --- a/kernel/irq/manage.c > +++ b/kernel/irq/manage.c > @@ -2811,3 +2811,52 @@ bool irq_check_status_bit(unsigned int irq, unsigned > int bitmask) > return res; > } > EXPORT_SYMBOL_GPL(irq_check_status_bit); > + > +#ifdef CONFIG_SMP > +static int irq_housekeeping_reconfigure(struct notifier_block *nb, > + unsigned long action, void *data) > +{ > + struct housekeeping_update *upd = data; > + unsigned int irq; > + > + if (action != HK_UPDATE_MASK || upd->type != HK_TYPE_MANAGED_IRQ) > + return NOTIFY_OK; > + > + irq_lock_sparse(); > + for_each_active_irq(irq) { > + struct irq_data *irqd; > + struct irq_desc *desc; > + > + desc = irq_to_desc(irq); > + if (!desc) > + continue; > + > + scoped_guard(raw_spinlock_irqsave, &desc->lock) { > + irqd = irq_desc_get_irq_data(desc); > + if (!irqd_affinity_is_managed(irqd) || !desc->action || > + !irq_data_get_irq_chip(irqd)) > + continue; > + > + /* > + * Re-apply existing affinity to honor the new > + * housekeeping mask via __irq_set_affinity() logic. > + */ > + irq_set_affinity_locked(irqd, > irq_data_get_affinity_mask(irqd), false); > + } > + } > + irq_unlock_sparse(); > + > + return NOTIFY_OK; > +} > + > +static struct notifier_block irq_housekeeping_nb = { > + .notifier_call = irq_housekeeping_reconfigure, > +}; > + > +static int __init irq_init_housekeeping_notifier(void) > +{ > + housekeeping_register_notifier(&irq_housekeeping_nb); > + return 0; > +} > +core_initcall(irq_init_housekeeping_notifier); > +#endif
We probably want to do that for HK_TYPE_DOMAIN update on housekeeping_update(). Thanks. > > -- > 2.43.0 > -- Frederic Weisbecker SUSE Labs

