serial: pl011: Fix oops on -EPROBE_DEFER
commit
27afac93e3bd7fa89749cf11da5d86ac9cde4dba upstream.
If probing of a pl011 gets deferred until after free_initmem(), an oops
ensues because pl011_console_match() is called which has been freed.
Fix by removing the __init attribute from the function and those it
calls.
Commit
10879ae5f12e ("serial: pl011: add console matching function")
introduced pl011_console_match() not just for early consoles but
regular preferred consoles, such as those added by acpi_parse_spcr().
Regular consoles may be registered after free_initmem() for various
reasons, one being deferred probing, another being dynamic enablement
of serial ports using a DeviceTree overlay.
Thus, pl011_console_match() must not be declared __init and the
functions it calls mustn't either.
Stack trace for posterity:
Unable to handle kernel paging request at virtual address
80c38b58
Internal error: Oops:
8000000d [#1] PREEMPT SMP ARM
PC is at pl011_console_match+0x0/0xfc
LR is at register_console+0x150/0x468
[<
80187004>] (register_console)
[<
805a8184>] (uart_add_one_port)
[<
805b2b68>] (pl011_register_port)
[<
805b3ce4>] (pl011_probe)
[<
80569214>] (amba_probe)
[<
805ca088>] (really_probe)
[<
805ca2ec>] (driver_probe_device)
[<
805ca5b0>] (__device_attach_driver)
[<
805c8060>] (bus_for_each_drv)
[<
805c9dfc>] (__device_attach)
[<
805ca630>] (device_initial_probe)
[<
805c90a8>] (bus_probe_device)
[<
805c95a8>] (deferred_probe_work_func)
Fixes:
10879ae5f12e ("serial: pl011: add console matching function")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v4.10+
Cc: Aleksey Makarov <amakarov@marvell.com>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Christopher Covington <cov@codeaurora.org>
Link: https://lore.kernel.org/r/f827ff09da55b8c57d316a1b008a137677b58921.1597315557.git.lukas@wunner.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>