mirror of https://gitee.com/openkylin/linux.git
MIPS: Stengthen IPI IRQ domain sanity check
Commitfbde2d7d82
("MIPS: Add generic SMP IPI support") introduced a sanity check that an IPI IRQ domain can be found during boot, in order to ensure that IPIs are able to be set up in systems using such domains. However it was added at a point where systems may have used an IPI IRQ domain in some situations but not others, and we could not know which were the case until runtime, so commit578bffc82e
("MIPS: Don't BUG_ON when no IPI domain is found") made that check simply skip IPI init if no domain were found in order to fix the boot for systems such as QEMU Malta. We now use IPI IRQ domains for the MIPS CPU interrupt controller, which means systems which make use of IPI IRQ domains will always do so when running on multiple CPUs. As a result we now strengthen the sanity check to ensure that an IPI IRQ domain is found when multiple CPUs are present in the system. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/15838/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
1eed400435
commit
e64889823d
|
@ -261,16 +261,20 @@ int mips_smp_ipi_allocate(const struct cpumask *mask)
|
|||
ipidomain = irq_find_matching_host(NULL, DOMAIN_BUS_IPI);
|
||||
|
||||
/*
|
||||
* There are systems which only use IPI domains some of the time,
|
||||
* depending upon configuration we don't know until runtime. An
|
||||
* example is Malta where we may compile in support for GIC & the
|
||||
* MT ASE, but run on a system which has multiple VPEs in a single
|
||||
* core and doesn't include a GIC. Until all IPI implementations
|
||||
* have been converted to use IPI domains the best we can do here
|
||||
* is to return & hope some other code sets up the IPIs.
|
||||
* There are systems which use IPI IRQ domains, but only have one
|
||||
* registered when some runtime condition is met. For example a Malta
|
||||
* kernel may include support for GIC & CPU interrupt controller IPI
|
||||
* IRQ domains, but if run on a system with no GIC & no MT ASE then
|
||||
* neither will be supported or registered.
|
||||
*
|
||||
* We only have a problem if we're actually using multiple CPUs so fail
|
||||
* loudly if that is the case. Otherwise simply return, skipping IPI
|
||||
* setup, if we're running with only a single CPU.
|
||||
*/
|
||||
if (!ipidomain)
|
||||
if (!ipidomain) {
|
||||
BUG_ON(num_present_cpus() > 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
virq = irq_reserve_ipi(ipidomain, mask);
|
||||
BUG_ON(!virq);
|
||||
|
|
Loading…
Reference in New Issue