提交 431d2113 编写于 作者: J Jie Zhan 提交者: Zheng Zengkai

irqdomain: Fix driver re-inserting failures when IRQs not being freed

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5GNIE

------------------------------------------------------------------------

Since commit 4615fbc3 ("genirq/irqdomain: Don't try to free an
interrupt that has no mapping"), we have found failures when
re-inserting some specific drivers:

[root@localhost ~]# rmmod hisi_sas_v3_hw
[root@localhost ~]# modprobe hisi_sas_v3_hw
[ 1295.622525] hisi_sas_v3_hw: probe of 0000:30:04.0 failed with error -2

A relevant discussion can be found at:
https://lore.kernel.org/lkml/3d3d0155e66429968cb4f6b4feeae4b3@kernel.org/

This is because IRQs from a low-level domain are not freed together,
leaving some leaked. Thus, the next driver insertion fails to allocate
the same number of IRQs.

Free a contiguous group of IRQs in one go to fix this issue.

Fixes: 4615fbc3 ("genirq/irqdomain: Don't try to free an interrupt
that has no mapping")
Signed-off-by: NJie Zhan <zhanjie9@hisilicon.com>
Reviewed-by: NLiao Chang <liaochang1@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 e49a394b
...@@ -1374,13 +1374,24 @@ static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain, ...@@ -1374,13 +1374,24 @@ static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain,
unsigned int nr_irqs) unsigned int nr_irqs)
{ {
unsigned int i; unsigned int i;
int n;
if (!domain->ops->free) if (!domain->ops->free)
return; return;
for (i = 0; i < nr_irqs; i++) { for (i = 0; i < nr_irqs; i++) {
if (irq_domain_get_irq_data(domain, irq_base + i)) /* Find the largest possible span of IRQs to free in one go */
domain->ops->free(domain, irq_base + i, 1); for (n = 0;
((i + n) < nr_irqs) &&
(irq_domain_get_irq_data(domain, irq_base + i + n));
n++)
;
if (!n)
continue;
domain->ops->free(domain, irq_base + i, n);
i += n;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册