summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorPengpeng Hou <pengpeng@iscas.ac.cn>2026-06-16 23:10:28 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-07-17 15:50:05 +0200
commit82aa033fef523ab4f0165afbc1c1fb0dadb89f94 (patch)
treed7a919c36f2be3f80b6ac6ca1c4f32492142f5d9 /drivers/misc
parent18189e5d84aa0b3bc89189cba13b9105634cb6fb (diff)
downloadlinux-next-82aa033fef523ab4f0165afbc1c1fb0dadb89f94.tar.gz
linux-next-82aa033fef523ab4f0165afbc1c1fb0dadb89f94.zip
misc: rp1: clear chained IRQ handlers on teardown
rp1_probe() installs a chained handler for each parent MSI-X vector and stores the rp1 device pointer as handler data. rp1_unregister_interrupts() then disposes the child IRQ mappings, removes the IRQ domain, and frees the PCI IRQ vectors without first removing those chained handlers. If a teardown path runs after the handlers have been installed, a later parent IRQ can still call rp1_chained_handle_irq() with stale handler data and a removed IRQ domain. Clear the chained handlers before disposing mappings and freeing the vectors. Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn> Reviewed-by: Andrea della Porta <andrea.porta@suse.com> Link: https://patch.msgid.link/20260616151028.69890-1-pengpeng@iscas.ac.cn Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/rp1/rp1_pci.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/misc/rp1/rp1_pci.c b/drivers/misc/rp1/rp1_pci.c
index 81685e3f3296..a1f20d88be5d 100644
--- a/drivers/misc/rp1/rp1_pci.c
+++ b/drivers/misc/rp1/rp1_pci.c
@@ -166,6 +166,9 @@ static void rp1_unregister_interrupts(struct pci_dev *pdev)
struct rp1_dev *rp1 = pci_get_drvdata(pdev);
int irq, i;
+ for (i = 0; i < RP1_INT_END; i++)
+ irq_set_chained_handler_and_data(pci_irq_vector(pdev, i), NULL, NULL);
+
if (rp1->domain) {
for (i = 0; i < RP1_INT_END; i++) {
irq = irq_find_mapping(rp1->domain, i);