All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
To: "Guenter Roeck" <linux@roeck-us.net>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Shawn Guo <shawnguo@kernel.org>,
	Linus Walleij <linus.walleij@linaro.org>
Subject: Re: Crashing 'kzm' target in next-20160913 due to 'gpio: mxc: shift gpio_mxc_init() to subsys_initcall level'
Date: Thu, 15 Sep 2016 16:35:04 +0300	[thread overview]
Message-ID: <99993063-6692-0870-12fa-64cf13d507f6@mentor.com> (raw)
In-Reply-To: <9befb559-499a-dd70-cd44-60d5fce2e5d6@roeck-us.net>

Hi Guenter,

On 09/14/2016 06:20 AM, Guenter Roeck wrote:
> Hi Vladimir,
>
> your commit e188cbf7564f ("gpio: mxc: shift gpio_mxc_init() to subsys_initcall level")
> in -next causes the following crash when running the 'kzm' target (and most likely
> the real thing) with qemu.
>
> [    1.211426] Unable to handle kernel NULL pointer dereference at virtual address 0000000c
> [    1.211600] pgd = c0004000
> [    1.211680] [0000000c] *pgd=00000000
> [    1.212067] Internal error: Oops: 5 [#1] SMP ARM
> [    1.212245] Modules linked in:
> [    1.212542] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.8.0-rc6-next-20160913 #1
> [    1.212671] Hardware name: Kyoto Microcomputer Co., Ltd. KZM-ARM11-01
> [    1.212825] task: c6848000 task.stack: c683e000
> [    1.213231] PC is at platform_get_irq+0xc0/0xe8
>
> See http://kerneltests.org/builders/qemu-arm-next/builds/525/steps/qemubuildcommand/logs/stdio
> for a complete log.
>
> Problem is quite subtle. The change causes the gpio driver to be installed later.
> As a result, kzm_init_smsc9118() fails to initialize the gpio pins correctly.
> gpio_request() in that function returns -EPROBE_DEFER, which is ignored,
> gpio_to_irq() then returns -22 which is unconditionally assigned as interrupt number.
> platform_get_irq(), as called from the smsc driver, gets this negative interrupt
> number, and passes it unconditionally to irq_get_irq_data(), which returns NULL.
> The NULL pointer is then passed to irqd_set_trigger_type() which, not entirely
> surprisingly, crashes.
>
> So, in other words, lots of bugs here. Nevertheless, I would suggest to keep using
> postcore_initcall(), at least until it is sure that all gpio clients handle -EPROBE_DEFER
> correctly.

I'm inviting Shawn and Uwe to the discussion.

The proper fix in this particular case should be like this one:

diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c
index 31df4361996f..8288acfe7221 100644
--- a/arch/arm/mach-imx/mach-kzm_arm11_01.c
+++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c
@@ -245,13 +245,17 @@ static void __init kzm_board_init(void)
  
  	mxc_iomux_setup_multiple_pins(kzm_pins,
  				      ARRAY_SIZE(kzm_pins), "kzm");
-	kzm_init_ext_uart();
-	kzm_init_smsc9118();
  	kzm_init_imx_uart();
  
  	pr_info("Clock input source is 26MHz\n");
  }
  
+static void __init kzm_late_init(void)
+{
+	kzm_init_ext_uart();
+	kzm_init_smsc9118();
+}
+
  /*
   * This structure defines static mappings for the kzm-arm11-01 board.
   */
@@ -291,5 +295,6 @@ MACHINE_START(KZM_ARM11_01, "Kyoto Microcomputer Co., Ltd. KZM-ARM11-01")
  	.init_irq = mx31_init_irq,
  	.init_time	= kzm_timer_init,
  	.init_machine = kzm_board_init,
+	.init_late	= kzm_late_init,
  	.restart	= mxc_restart,
  MACHINE_END
--

But I agree that there might be more legacy boards (i.MX31 only IMHO),
which may attempt to manipulate GPIO lines before subsys_initcall()
level.

Would it be better to move i.MX31 IOMUX controller driver under pinctrl
roof?

Any suggestions are welcome.

--
With best wishes,
Vladimir

  parent reply	other threads:[~2016-09-15 13:35 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-14  3:20 Crashing 'kzm' target in next-20160913 due to 'gpio: mxc: shift gpio_mxc_init() to subsys_initcall level' Guenter Roeck
2016-09-14  7:19 ` Linus Walleij
2016-09-14 14:33   ` Guenter Roeck
2016-09-15 12:19     ` Linus Walleij
2016-09-15 13:18       ` Vladimir Zapolskiy
2016-09-15 13:45         ` Vladimir Zapolskiy
2016-09-15 13:55         ` Linus Walleij
2016-09-15 13:18   ` Vladimir Zapolskiy
2016-09-15 13:35 ` Vladimir Zapolskiy [this message]
2016-09-15 14:23   ` Uwe Kleine-König
2016-09-15 14:35     ` Guenter Roeck
2016-09-15 14:46       ` Uwe Kleine-König
2016-09-16  2:24         ` Guenter Roeck
2016-09-18  0:08   ` Shawn Guo
2016-09-18  0:59     ` Guenter Roeck
2016-09-18 11:24       ` Linus Walleij
2016-09-20 12:55         ` Shawn Guo
2016-09-20 13:53           ` Vladimir Zapolskiy
2016-09-20 14:18             ` Shawn Guo
2016-09-20 21:35           ` Linus Walleij

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=99993063-6692-0870-12fa-64cf13d507f6@mentor.com \
    --to=vladimir_zapolskiy@mentor.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=shawnguo@kernel.org \
    --cc=u.kleine-koenig@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.