Skip to content
  • Lorenzo Pieralisi's avatar
    alpha/PCI: Move pci_map_irq()/pci_swizzle() out of initdata · 814eae59
    Lorenzo Pieralisi authored
    The introduction of {map/swizzle}_irq() hooks in the struct pci_host_bridge
    allowed to replace the pci_fixup_irqs() PCI IRQ allocation in alpha arch
    PCI code with per-bridge map/swizzle functions with commit 0e4c2eeb
    ("alpha/PCI: Replace pci_fixup_irqs() call with host bridge IRQ mapping
    hooks").
    
    As a side effect of converting PCI IRQ allocation to the struct
    pci_host_bridge {map/swizzle}_irq() hooks mechanism, the actual PCI IRQ
    allocation function (ie pci_assign_irq()) is carried out per-device in
    pci_device_probe() that is called when a PCI device driver is about to be
    probed.
    
    This means that, for drivers compiled as loadable modules, the actual PCI
    device IRQ allocation can now happen after the system has booted so the
    struct pci_host_bridge {map/swizzle}_irq() hooks pci_assign_irq() relies on
    must stay valid after the system has booted so that PCI core can carry out
    PCI IRQ allocation correctly.
    
    Most of the alpha board structures pci_map_irq() and pci_swizzle() hooks
    (that are used to initialize their struct pci_host_bridge equivalent
    through the alpha_mv global variable - that represents the struct
    alpha_machine_vector of the running kernel) are marked as
    __init/__initdata; this causes freed memory dereferences when PCI IRQ
    allocation is carried out after the kernel has booted (ie when loading PCI
    drivers as loadable module) because when the kernel tries to bind the PCI
    device to its (module) driver, the function pci_assign_irq() is called,
    that in turn retrieves the struct pci_host_bridge {map/swizzle}_irq() hooks
    to carry out PCI IRQ allocation; if those hooks are marked as __init
    code/__initdata they point at freed/invalid memory.
    
    Fix the issue by removing the __init/__initdata markers from all subarch
    struct alpha_machine_vector.pci_map_irq()/pci_swizzle() functions (and
    data).
    
    Fixes: 0e4c2eeb ("alpha/PCI: Replace pci_fixup_irqs() call with host bridge IRQ mapping hooks")
    Link: http://lkml.kernel.org/r/alpine.LRH.2.21.1710251043170.7098@math.ut.ee
    
    
    Reported-by: default avatarMeelis Roos <mroos@linux.ee>
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Cc: Richard Henderson <rth@twiddle.net>
    Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
    Cc: Meelis Roos <mroos@linux.ee>
    Cc: Matt Turner <mattst88@gmail.com>
    814eae59