From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>,
Linus Walleij <linus.walleij@linaro.org>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL 4.14 20/36] gpio: Fix crash due to registration race
Date: Mon, 24 Sep 2018 14:49:05 +0000 [thread overview]
Message-ID: <20180924144851.164533-20-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180924144851.164533-1-alexander.levin@microsoft.com>
From: Vincent Whitchurch <vincent.whitchurch@axis.com>
[ Upstream commit d49b48f088c323dbacae44dfbe56d9c985c8a2a1 ]
gpiochip_add_data_with_key() adds the gpiochip to the gpio_devices list
before of_gpiochip_add() is called, but it's only the latter which sets
the ->of_xlate function pointer. gpiochip_find() can be called by
someone else between these two actions, and it can find the chip and
call of_gpiochip_match_node_and_xlate() which leads to the following
crash due to a NULL ->of_xlate().
Unhandled prefetch abort: page domain fault (0x01b) at 0x00000000
Modules linked in: leds_gpio(+) gpio_generic(+)
CPU: 0 PID: 830 Comm: insmod Not tainted 4.18.0+ #43
Hardware name: ARM-Versatile Express
PC is at (null)
LR is at of_gpiochip_match_node_and_xlate+0x2c/0x38
Process insmod (pid: 830, stack limit = 0x(ptrval))
(of_gpiochip_match_node_and_xlate) from (gpiochip_find+0x48/0x84)
(gpiochip_find) from (of_get_named_gpiod_flags+0xa8/0x238)
(of_get_named_gpiod_flags) from (gpiod_get_from_of_node+0x2c/0xc8)
(gpiod_get_from_of_node) from (devm_fwnode_get_index_gpiod_from_child+0xb8/0x144)
(devm_fwnode_get_index_gpiod_from_child) from (gpio_led_probe+0x208/0x3c4 [leds_gpio])
(gpio_led_probe [leds_gpio]) from (platform_drv_probe+0x48/0x9c)
(platform_drv_probe) from (really_probe+0x1d0/0x3d4)
(really_probe) from (driver_probe_device+0x78/0x1c0)
(driver_probe_device) from (__driver_attach+0x120/0x13c)
(__driver_attach) from (bus_for_each_dev+0x68/0xb4)
(bus_for_each_dev) from (bus_add_driver+0x1a8/0x268)
(bus_add_driver) from (driver_register+0x78/0x10c)
(driver_register) from (do_one_initcall+0x54/0x1fc)
(do_one_initcall) from (do_init_module+0x64/0x1f4)
(do_init_module) from (load_module+0x2198/0x26ac)
(load_module) from (sys_finit_module+0xe0/0x110)
(sys_finit_module) from (ret_fast_syscall+0x0/0x54)
One way to fix this would be to rework the hairy registration sequence
in gpiochip_add_data_with_key(), but since I'd probably introduce a
couple of new bugs if I attempted that, simply add a check for a
non-NULL of_xlate function pointer in
of_gpiochip_match_node_and_xlate(). This works since the driver looking
for the gpio will simply fail to find the gpio and defer its probe and
be reprobed when the driver which is registering the gpiochip has fully
completed its probe.
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
drivers/gpio/gpiolib-of.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index ba38f530e403..ee8c046cab62 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -31,6 +31,7 @@ static int of_gpiochip_match_node_and_xlate(struct gpio_chip *chip, void *data)
struct of_phandle_args *gpiospec = data;
return chip->gpiodev->dev.of_node == gpiospec->np &&
+ chip->of_xlate &&
chip->of_xlate(chip, gpiospec, NULL) >= 0;
}
--
2.17.1
next prev parent reply other threads:[~2018-09-24 20:52 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-24 14:48 [PATCH AUTOSEL 4.14 01/36] mac80211: Run TXQ teardown code before de-registering interfaces Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 03/36] KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 02/36] mac80211_hwsim: require at least one channel Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 05/36] scsi: csiostor: add a check for NULL pointer after kmalloc() Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 04/36] btrfs: btrfs_shrink_device should call commit transaction at the end Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 07/36] mac80211_hwsim: correct use of IEEE80211_VHT_CAP_RXSTBC_X Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 06/36] mac80211: " Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 08/36] gpio: adp5588: Fix sleep-in-atomic-context bug Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 09/36] mac80211: mesh: fix HWMP sequence numbering to follow standard Sasha Levin
2018-09-24 14:48 ` [PATCH AUTOSEL 4.14 10/36] mac80211: avoid kernel panic when building AMSDU from non-linear SKB Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 11/36] gpiolib: acpi: Switch to cansleep version of GPIO library call Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 13/36] net: hns: add the code for cleaning pkt in chip Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 12/36] gpiolib-acpi: Register GpioInt ACPI event handlers from a late_initcall Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 14/36] net: hns: add netif_carrier_off before change speed and duplex Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 15/36] cfg80211: nl80211_update_ft_ies() to validate NL80211_ATTR_IE Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 16/36] mac80211: do not convert to A-MSDU if frag/subframe limited Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 17/36] mac80211: always account for A-MSDU header changes Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 19/36] tools/kvm_stat: fix handling of invalid paths in debugfs provider Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 18/36] tools/kvm_stat: fix python3 issues Sasha Levin
2018-09-24 14:49 ` Sasha Levin [this message]
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 21/36] ARC: atomics: unbork atomic_fetch_##op() Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 23/36] RAID10 BUG_ON in raise_barrier when force is true and conf->barrier is 0 Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 22/36] md/raid5-cache: disable reshape completely Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 24/36] net: ethernet: cpsw-phy-sel: prefer phandle for phy sel Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 25/36] i2c: uniphier: issue STOP only for last message or I2C_M_STOP Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 26/36] i2c: uniphier-f: " Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 27/36] net: cadence: Fix a sleep-in-atomic-context bug in macb_halt_tx() Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 28/36] fs/cifs: don't translate SFM_SLASH (U+F026) to backslash Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 29/36] mac80211: fix an off-by-one issue in A-MSDU max_subframe computation Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 30/36] cfg80211: fix a type issue in ieee80211_chandef_to_operating_class() Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 31/36] mac80211: fix a race between restart and CSA flows Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 33/36] mac80211: don't Tx a deauth frame if the AP forbade Tx Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 32/36] mac80211: Fix station bandwidth setting after channel switch Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 35/36] tools/vm/slabinfo.c: fix sign-compare warning Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 34/36] mac80211: shorten the IBSS debug messages Sasha Levin
2018-09-24 14:49 ` [PATCH AUTOSEL 4.14 36/36] tools/vm/page-types.c: fix "defined but not used" warning Sasha Levin
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=20180924144851.164533-20-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=vincent.whitchurch@axis.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).