Re: alpha boot hang - 4.14-rc* regression
From: Lorenzo Pieralisi <hidden>
Date: 2017-10-25 15:14:10
Also in:
linux-pci, lkml
Subsystem:
alpha port, the rest · Maintainers:
Richard Henderson, Matt Turner, Magnus Lindholm, Linus Torvalds
On Wed, Oct 25, 2017 at 05:49:54PM +0300, Meelis Roos wrote:
quoted
quoted
quoted
quoted
removing libata modules and rebooting fixes it - so it seems to be loading of libata.Can you please cherry-pick: commit b1f9e5e355e9 ("ide: fix IRQ assignment for PCI bus order probing") from mainline and let us know if that solves the issue ?No, still breaks the same way (b1f9e5e355e9 patched on top of 0e4c2eeb758a). 4.14.0-rc5-00095-g1c9fec470b81 was also still broken the same way (tried on Sunday).I am not sure I patched the right sys file but if I did, does the patch below help ? I think that at sata driver binding time the kernel finds a freed pointer in the host bridge map_irq() hook and that's where things go wrong. Please let me know if that's the right sys file, it is a mechanical change and making it for other sys file should be reasonably simple. Lorenzo -- >8 --diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c"Booting GENERIC on Tsunami variation Webbrick using machine vector Webbrick from SRM" Seems to be the correct file - tsunami is referenced from this file and the IRQ-s are DP264. But the patch does not make a difference :(
It is probably because I patched the wrong map_irq() function, I am trying to detect which one you are _actually_ using, if the patch below fails I will patch them all (which is what I have to do anyway). Please give this a go - this _has_ to make a difference, it is not correct to leave map_irq() pointers as __init memory, IRQ routing for modules can't work. -- >8 --
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c
index 6c35159..62fd7f1 100644
--- a/arch/alpha/kernel/sys_dp264.c
+++ b/arch/alpha/kernel/sys_dp264.c@@ -356,7 +356,7 @@ clipper_init_irq(void) * 10 64 bit PCI option slot 3 (not bus 0) */ -static int __init +static int isa_irq_fixup(const struct pci_dev *dev, int irq) { u8 irq8;
@@ -372,10 +372,10 @@ isa_irq_fixup(const struct pci_dev *dev, int irq) return irq8 & 0xf; } -static int __init +static int dp264_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { - static char irq_tab[6][5] __initdata = { + static char irq_tab[6][5] = { /*INT INTA INTB INTC INTD */ { -1, -1, -1, -1, -1}, /* IdSel 5 ISA Bridge */ { 16+ 3, 16+ 3, 16+ 2, 16+ 2, 16+ 2}, /* IdSel 6 SCSI builtin*/
@@ -456,10 +456,10 @@ monet_swizzle(struct pci_dev *dev, u8 *pinp) return slot; } -static int __init +static int webbrick_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { - static char irq_tab[13][5] __initdata = { + static char irq_tab[13][5] = { /*INT INTA INTB INTC INTD */ { -1, -1, -1, -1, -1}, /* IdSel 7 ISA Bridge */ { -1, -1, -1, -1, -1}, /* IdSel 8 unused */