提交 302905a3 编写于 作者: M Milton Miller 提交者: Benjamin Herrenschmidt

powerpc/xics: Update default_server during migrate_irqs_away

Currently, every time we determine which irq server to use, we check if
default_server, which is the id of the bootcpu, is still online.  But
default_server is a hardware cpu, not the logical cpu id needed to index
cpu_online_map.

Since the default server can only go offline during a cpu hotplug event,
explicitly check the default server and choose the new one when we move
irqs away from the cpu being offlined.

This has the added benefit of only needing the boot_cpuid to be updated
and not relying on the cpu being marked offline during migrate_irqs_away.

Also, since xics_update_irq_servers only reads device tree information, we
can call it before xics_init_host in xics_init_IRQ and then default_server
will always be valid when we can reach get_irq_server via the host ops.
Signed-off-by: NMilton Miller <miltonm@bga.com>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 8767e9ba
...@@ -208,9 +208,6 @@ static int get_irq_server(unsigned int virq, unsigned int strict_check) ...@@ -208,9 +208,6 @@ static int get_irq_server(unsigned int virq, unsigned int strict_check)
cpumask_t cpumask = irq_desc[virq].affinity; cpumask_t cpumask = irq_desc[virq].affinity;
cpumask_t tmp = CPU_MASK_NONE; cpumask_t tmp = CPU_MASK_NONE;
if (! cpu_isset(default_server, cpu_online_map))
xics_update_irq_servers();
if (!distribute_irqs) if (!distribute_irqs)
return default_server; return default_server;
...@@ -685,8 +682,8 @@ void __init xics_init_IRQ(void) ...@@ -685,8 +682,8 @@ void __init xics_init_IRQ(void)
if (found == 0) if (found == 0)
return; return;
xics_init_host();
xics_update_irq_servers(); xics_update_irq_servers();
xics_init_host();
if (firmware_has_feature(FW_FEATURE_LPAR)) if (firmware_has_feature(FW_FEATURE_LPAR))
ppc_md.get_irq = xics_get_irq_lpar; ppc_md.get_irq = xics_get_irq_lpar;
...@@ -779,6 +776,10 @@ void xics_migrate_irqs_away(void) ...@@ -779,6 +776,10 @@ void xics_migrate_irqs_away(void)
int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id(); int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id();
unsigned int irq, virq; unsigned int irq, virq;
/* If we used to be the default server, move to the new "boot_cpuid" */
if (hw_cpu == default_server)
xics_update_irq_servers();
/* Reject any interrupt that was queued to us... */ /* Reject any interrupt that was queued to us... */
xics_set_cpu_priority(0); xics_set_cpu_priority(0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册