| From c3474b77222b02d8c1e0dbbd983dde013076ac8b Mon Sep 17 00:00:00 2001 |
| From: Thomas Bogendoerfer <tbogendoerfer@suse.de> |
| Date: Tue, 19 Nov 2019 12:08:56 +0100 |
| Subject: [PATCH] MIPS: SGI-IP27: Fix crash, when CPUs are disabled via nr_cpus |
| parameter |
| |
| commit e3d765a941f6130fd94e47b2064cfee71f4cbadd upstream. |
| |
| If number of CPUs are limited by the kernel commandline parameter nr_cpus |
| assignment of interrupts accourding to numa rules might not be possibe. |
| As a fallback use one of the online CPUs as interrupt destination. |
| |
| Fixes: 69a07a41d908 ("MIPS: SGI-IP27: rework HUB interrupts") |
| Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de> |
| Signed-off-by: Paul Burton <paulburton@kernel.org> |
| Cc: Ralf Baechle <ralf@linux-mips.org> |
| Cc: James Hogan <jhogan@kernel.org> |
| Cc: linux-mips@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c |
| index 37be04975831..79a2f6bd2b5a 100644 |
| --- a/arch/mips/sgi-ip27/ip27-irq.c |
| +++ b/arch/mips/sgi-ip27/ip27-irq.c |
| @@ -73,6 +73,9 @@ static void setup_hub_mask(struct hub_irq_data *hd, const struct cpumask *mask) |
| int cpu; |
| |
| cpu = cpumask_first_and(mask, cpu_online_mask); |
| + if (cpu >= nr_cpu_ids) |
| + cpu = cpumask_any(cpu_online_mask); |
| + |
| nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); |
| hd->cpu = cpu; |
| if (!cputoslice(cpu)) { |
| @@ -139,6 +142,7 @@ static int hub_domain_alloc(struct irq_domain *domain, unsigned int virq, |
| /* use CPU connected to nearest hub */ |
| hub = hub_data(NASID_TO_COMPACT_NODEID(info->nasid)); |
| setup_hub_mask(hd, &hub->h_cpus); |
| + info->nasid = cpu_to_node(hd->cpu); |
| |
| /* Make sure it's not already pending when we connect it. */ |
| REMOTE_HUB_CLR_INTR(info->nasid, swlevel); |
| -- |
| 2.7.4 |
| |