]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: rcar-host: Pass proper IRQ domain to generic_handle_domain_irq()
authorClaudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Sat, 9 Aug 2025 14:44:47 +0000 (17:44 +0300)
committerManivannan Sadhasivam <mani@kernel.org>
Wed, 27 Aug 2025 07:33:50 +0000 (13:03 +0530)
Starting with commit dd26c1a23fd5 ("PCI: rcar-host: Switch to
msi_create_parent_irq_domain()"), the MSI parent IRQ domain is NULL because
the object of type struct irq_domain_info passed to:

msi_create_parent_irq_domain() ->
  irq_domain_instantiate()() ->
    __irq_domain_instantiate()

has no reference to the parent IRQ domain. Using msi->domain->parent as an
argument for generic_handle_domain_irq() leads to below error:

"Unable to handle kernel NULL pointer dereference at virtual address"

This error was identified while switching the upcoming RZ/G3S PCIe host
controller driver to msi_create_parent_irq_domain() (which was using a
similar pattern to handle MSIs (see link section)), but it was not tested
on hardware using the pcie-rcar-host controller driver due to lack of
hardware.

Fixes: dd26c1a23fd5 ("PCI: rcar-host: Switch to msi_create_parent_irq_domain()")
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
[mani: reworded subject and description]
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Reviewed-by: Nam Cao <namcao@linutronix.de>
Link: https://lore.kernel.org/all/20250704161410.3931884-6-claudiu.beznea.uj@bp.renesas.com
Link: https://patch.msgid.link/20250809144447.3939284-1-claudiu.beznea.uj@bp.renesas.com
drivers/pci/controller/pcie-rcar-host.c

index fe288fd770c493fa70b0ef7d565cae42ed270f8f..4780e0109e58345dd314f85790d770a58d42e541 100644 (file)
@@ -584,7 +584,7 @@ static irqreturn_t rcar_pcie_msi_irq(int irq, void *data)
                unsigned int index = find_first_bit(&reg, 32);
                int ret;
 
-               ret = generic_handle_domain_irq(msi->domain->parent, index);
+               ret = generic_handle_domain_irq(msi->domain, index);
                if (ret) {
                        /* Unknown MSI, just clear it */
                        dev_dbg(dev, "unexpected MSI\n");