linux-uconsole/drivers/watchdog
Kevin Hao f4c36f1999 watchdog: Fix the race between the release of watchdog_core_data and cdev
[ Upstream commit 72139dfa24 ]

The struct cdev is embedded in the struct watchdog_core_data. In the
current code, we manage the watchdog_core_data with a kref, but the
cdev is manged by a kobject. There is no any relationship between
this kref and kobject. So it is possible that the watchdog_core_data is
freed before the cdev is entirely released. We can easily get the
following call trace with CONFIG_DEBUG_KOBJECT_RELEASE and
CONFIG_DEBUG_OBJECTS_TIMERS enabled.
  ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x38
  WARNING: CPU: 23 PID: 1028 at lib/debugobjects.c:481 debug_print_object+0xb0/0xf0
  Modules linked in: softdog(-) deflate ctr twofish_generic twofish_common camellia_generic serpent_generic blowfish_generic blowfish_common cast5_generic cast_common cmac xcbc af_key sch_fq_codel openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4
  CPU: 23 PID: 1028 Comm: modprobe Not tainted 5.3.0-next-20190924-yoctodev-standard+ #180
  Hardware name: Marvell OcteonTX CN96XX board (DT)
  pstate: 00400009 (nzcv daif +PAN -UAO)
  pc : debug_print_object+0xb0/0xf0
  lr : debug_print_object+0xb0/0xf0
  sp : ffff80001cbcfc70
  x29: ffff80001cbcfc70 x28: ffff800010ea2128
  x27: ffff800010bad000 x26: 0000000000000000
  x25: ffff80001103c640 x24: ffff80001107b268
  x23: ffff800010bad9e8 x22: ffff800010ea2128
  x21: ffff000bc2c62af8 x20: ffff80001103c600
  x19: ffff800010e867d8 x18: 0000000000000060
  x17: 0000000000000000 x16: 0000000000000000
  x15: ffff000bd7240470 x14: 6e6968207473696c
  x13: 5f72656d6974203a x12: 6570797420746365
  x11: 6a626f2029302065 x10: 7461747320657669
  x9 : 7463612820657669 x8 : 3378302f3078302b
  x7 : 0000000000001d7a x6 : ffff800010fd5889
  x5 : 0000000000000000 x4 : 0000000000000000
  x3 : 0000000000000000 x2 : ffff000bff948548
  x1 : 276a1c9e1edc2300 x0 : 0000000000000000
  Call trace:
   debug_print_object+0xb0/0xf0
   debug_check_no_obj_freed+0x1e8/0x210
   kfree+0x1b8/0x368
   watchdog_cdev_unregister+0x88/0xc8
   watchdog_dev_unregister+0x38/0x48
   watchdog_unregister_device+0xa8/0x100
   softdog_exit+0x18/0xfec4 [softdog]
   __arm64_sys_delete_module+0x174/0x200
   el0_svc_handler+0xd0/0x1c8
   el0_svc+0x8/0xc

This is a common issue when using cdev embedded in a struct.
Fortunately, we already have a mechanism to solve this kind of issue.
Please see commit 233ed09d7f ("chardev: add helper function to
register char devs with a struct device") for more detail.

In this patch, we choose to embed the struct device into the
watchdog_core_data, and use the API provided by the commit 233ed09d7f
to make sure that the release of watchdog_core_data and cdev are
in sequence.

Signed-off-by: Kevin Hao <haokexin@gmail.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20191008112934.29669-1-haokexin@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-01-04 19:13:01 +01:00
..
acquirewdt.c
advantechwdt.c watchdog: advantechwdt: mark expected switch fall-through 2017-12-28 20:45:28 +01:00
alim1535_wdt.c watchdog: alim1535_wdt: mark expected switch fall-through 2017-12-28 20:45:28 +01:00
alim7101_wdt.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
ar7_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
asm9260_wdt.c watchdog: asm9260_wdt: fix error handling in asm9260_wdt_probe() 2018-03-03 17:04:16 +01:00
aspeed_wdt.c watchdog: aspeed: Fix clock behaviour for ast2600 2019-12-13 08:52:54 +01:00
at91rm9200_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
at91sam9_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
at91sam9_wdt.h watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
ath79_wdt.c
atlas7_wdt.c watchdog: constify watchdog_ops structures 2017-02-24 14:00:23 -08:00
bcm47xx_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
bcm63xx_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
bcm2835_wdt.c watchdog: bcm2835_wdt: Fix module autoload 2019-09-06 10:22:02 +02:00
bcm7038_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
bcm_kona_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
booke_wdt.c watchdog: constify watchdog_ops structures 2017-02-24 14:00:23 -08:00
cadence_wdt.c watchdog: simplify getting .drvdata 2018-05-21 21:24:40 +02:00
coh901327_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
cpu5wdt.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
cpwd.c watchdog: cpwd: Convert timers to use timer_setup() 2017-11-02 15:50:26 -07:00
da9052_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
da9055_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
da9062_wdt.c watchdog: da9062: remove unused code 2018-06-06 10:45:33 +02:00
da9063_wdt.c watchdog: da9063: remove duplicated timeout_to_sel calls 2018-06-07 12:41:43 +02:00
davinci_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
diag288_wdt.c watchdog: constify watchdog_ops and watchdog_info structures 2017-09-09 20:29:53 +02:00
digicolor_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
dw_wdt.c watchdog: dw: save/restore control and timeout across suspend/resume 2018-03-13 19:14:19 +01:00
ebc-c384_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
ep93xx_wdt.c watchdog: ep93xx_wdt: cleanup and let the core handle the heartbeat 2017-02-24 14:00:23 -08:00
eurotechwdt.c watchdog: eurotechwdt: mark expected switch fall-through 2017-12-28 20:45:51 +01:00
f71808e_wdt.c watchdog: f71808e_wdt: Fix WD_EN register read 2018-03-10 11:45:07 +01:00
ftwdt010_wdt.c watchdog: ftwdt010: Make interrupt optional 2017-12-28 20:45:02 +01:00
gef_wdt.c
geodewdt.c
gpio_wdt.c watchdog: gpio: change order for setting default timeout 2018-03-03 17:04:15 +01:00
hpwdt.c watchdog: hpwdt: Claim NMIs generated by iLO5 2018-05-21 21:24:42 +02:00
i6300esb.c watchdog: i6300esb: remove info message and version number 2017-12-28 20:45:18 +01:00
ib700wdt.c watchdog: ib700wdt: mark expected switch fall-through 2017-12-28 20:45:52 +01:00
ibmasr.c
ie6xx_wdt.c
imgpdc_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
imx2_wdt.c watchdog: imx2_wdt: fix min() calculation in imx2_wdt_set_timeout 2019-10-11 18:21:00 +02:00
indydog.c
intel-mid_wdt.c watchdog: intel-mid_wdt: Keep watchdog running 2017-06-05 20:37:35 +02:00
intel_scu_watchdog.c
intel_scu_watchdog.h
iop_wdt.c
it87_wdt.c watchdog: it87_wdt: constify watchdog_ops structure 2017-09-09 20:06:25 +02:00
it8712f_wdt.c
iTCO_vendor.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
iTCO_vendor_support.c
iTCO_wdt.c watchdog: Revert "iTCO_wdt: all versions count down twice" 2017-09-09 17:41:24 +02:00
ixp4xx_wdt.c
jz4740_wdt.c watchdog: JZ4740: Drop module remove function 2018-05-14 23:58:23 +01:00
Kconfig watchdog: fix compile time error of pretimeout governors 2019-06-15 11:54:06 +02:00
kempld_wdt.c include/linux/compiler*.h: make compiler-*.h mutually exclusive 2018-08-22 17:31:34 -07:00
ks8695_wdt.c
lantiq_wdt.c watchdog: lantiq: access boot cause register through regmap 2017-09-04 13:53:15 +02:00
loongson1_wdt.c
lpc18xx_wdt.c watchdog: lpc18xx: remove assignment of unused ret-value 2018-03-03 17:04:16 +01:00
m54xx_wdt.c
machzwd.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
Makefile watchdog: add driver for the MEN 16z069 IP-Core 2018-08-02 15:57:12 +02:00
max63xx_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
max77620_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
mei_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
mena21_wdt.c watchdog: mena21_wdt: Drop unnecessary mutex lock 2018-05-21 21:25:23 +02:00
menf21bmc_wdt.c
menz69_wdt.c watchdog: add driver for the MEN 16z069 IP-Core 2018-08-02 15:57:12 +02:00
meson_gxbb_wdt.c watchdog: meson: Fix the wrong value of left time 2019-12-05 09:19:44 +01:00
meson_wdt.c watchdog: meson: allow setting timeout in devicetree 2018-03-03 17:04:14 +01:00
mixcomwd.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
moxart_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
mpc8xxx_wdt.c watchdog: mpc8xxx: use the core worker function 2017-12-28 20:45:36 +01:00
mt7621_wdt.c watchdog: mt7621_wdt/rt2880_wdt: Fix compilation problem 2019-02-27 10:08:52 +01:00
mtk_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
mtx-1_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
mv64x60_wdt.c
ni903x_wdt.c
nic7018_wdt.c watchdog: nic7018_wdt: Add NIC7018 watchdog driver 2017-02-24 14:00:23 -08:00
npcm_wdt.c watchdog: Add Nuvoton NPCM watchdog driver 2018-03-24 10:19:39 +01:00
nuc900_wdt.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
nv_tco.c
nv_tco.h
octeon-wdt-main.c watchdog: octeon-wdt: Add support for 78XX SOCs. 2017-09-04 21:19:03 +02:00
octeon-wdt-nmi.S watchdog: octeon-wdt: Remove old boot vector code. 2017-09-04 21:19:03 +02:00
of_xilinx_wdt.c watchdog: simplify getting .drvdata 2018-05-21 21:24:40 +02:00
omap_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
omap_wdt.h
orion_wdt.c watchdog: orion_wdt: Mark watchdog as active when running at probe 2018-08-02 15:57:09 +02:00
pc87413_wdt.c Annotate hardware config module parameters in drivers/watchdog/ 2017-04-20 12:02:32 +01:00
pcwd.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
pcwd_pci.c watchdog: pcwd_pci: mark expected switch fall-through 2017-12-28 20:45:29 +01:00
pcwd_usb.c watchdog: pcwd_usb: remove unneeded DRIVER_LICENSE #define 2017-12-28 20:45:50 +01:00
pic32-dmt.c
pic32-wdt.c
pika_wdt.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
pnx833x_wdt.c
pnx4008_wdt.c watchdog: pnx4008: make use of timeout-secs provided in devicetree 2018-03-03 17:04:13 +01:00
pretimeout_noop.c
pretimeout_panic.c
qcom-wdt.c watchdog: qcom: Check for platform_get_resource() failure 2017-09-09 20:50:35 +02:00
rave-sp-wdt.c watchdog: Add RAVE SP watchdog driver 2018-01-08 10:08:36 +00:00
rc32434_wdt.c
rdc321x_wdt.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
renesas_wdt.c watchdog: renesas_wdt: stop when unregistering 2019-11-24 08:19:41 +01:00
retu_wdt.c
riowd.c
rn5t618_wdt.c watchdog: constify watchdog_info structures 2017-02-24 14:00:23 -08:00
rt2880_wdt.c watchdog: mt7621_wdt/rt2880_wdt: Fix compilation problem 2019-02-27 10:08:52 +01:00
rtd119x_wdt.c watchdog: Add Realtek RTD1295 2017-12-28 20:44:39 +01:00
rza_wdt.c watchdog: add rza_wdt driver 2017-06-05 20:37:17 +02:00
s3c2410_wdt.c watchdog: s3c2410: Minor code cleanup 2017-06-05 20:38:52 +02:00
sa1100_wdt.c
sama5d4_wdt.c watchdog: sama5d4: fix WDD value to be always set to max 2019-12-05 09:21:32 +01:00
sb_wdog.c
sbc60xxwdt.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
sbc7240_wdt.c
sbc8360.c
sbc_epx_c3.c
sbc_fitpc2_wdt.c
sbsa_gwdt.c watchdog: sbsa: use 32-bit read for WCV 2018-03-03 15:52:32 +01:00
sc520_wdt.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
sc1200wdt.c watchdog: sc1200: constify pnp_device_id 2017-09-09 21:14:46 +02:00
sch311x_wdt.c watchdog: sch311x_wdt: Mark expected switch fall-through 2018-04-16 10:22:39 +02:00
scx200_wdt.c
shwdt.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
sirfsoc_wdt.c watchdog: sirfsoc: allow setting timeout in devicetree 2018-03-03 17:04:13 +01:00
smsc37b787_wdt.c
softdog.c watchdog: softdog: fire watchdog even if softirqs do not get to run 2017-03-01 06:15:10 -08:00
sp805_wdt.c watchdog: sp805: Add clock-frequency property 2018-08-06 17:12:41 +02:00
sp5100_tco.c watchdog: sp5100_tco: Add support for recent FCH versions 2018-01-21 12:56:37 +01:00
sp5100_tco.h watchdog: sp5100_tco: Add support for recent FCH versions 2018-01-21 12:56:37 +01:00
sprd_wdt.c watchdog: sprd_wdt: Remove redundant dev_err call in sprd_wdt_probe() 2018-08-02 15:57:12 +02:00
st_lpc_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
stm32_iwdg.c watchdog: stm32: add pclk feature for stm32mp1 2018-08-02 15:57:09 +02:00
stmp3xxx_rtc_wdt.c watchdog: stmp3xxx: Switch to SPDX identifier 2018-08-02 15:57:11 +02:00
sun4v_wdt.c watchdog: constify watchdog_ops structures 2017-02-24 14:00:23 -08:00
sunxi_wdt.c watchdog: sunxi: allow setting timeout in devicetree 2018-03-03 17:04:13 +01:00
tangox_wdt.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
tegra_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
ts72xx_wdt.c watchdog: ts72xx_wdt: constify watchdog_ops structure 2017-09-09 20:06:14 +02:00
ts4800_wdt.c
twl4030_wdt.c mfd: twl: Move header file out of I2C realm 2017-09-04 14:41:02 +01:00
txx9wdt.c
uniphier_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
ux500_wdt.c
via_wdt.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
w83627hf_wdt.c watchdog: w83627hf_wdt: Support NCT6796D, NCT6797D, NCT6798D 2019-11-24 08:19:43 +01:00
w83877f_wdt.c treewide: Switch DEFINE_TIMER callbacks to struct timer_list * 2017-11-21 15:57:05 -08:00
w83977f_wdt.c watchdog: w83977f_wdt: Mark expected switch fall-through 2018-04-16 10:22:39 +02:00
wafer5823wdt.c watchdog: wafer5823wdt: Mark expected switch fall-through 2018-04-16 10:22:39 +02:00
watchdog_core.c watchdog: document watchdog_init_timeout() wdd parameter 2017-12-28 20:45:56 +01:00
watchdog_core.h
watchdog_dev.c watchdog: Fix the race between the release of watchdog_core_data and cdev 2020-01-04 19:13:01 +01:00
watchdog_pretimeout.c
watchdog_pretimeout.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
wd501p.h
wdat_wdt.c watchdog: simplify getting .drvdata 2018-05-21 21:24:40 +02:00
wdrtas.c
wdt.c Annotate hardware config module parameters in drivers/watchdog/ 2017-04-20 12:02:32 +01:00
wdt285.c
wdt977.c
wdt_pci.c watchdog: wdt_pci: mark expected switch fall-through 2017-12-28 20:45:30 +01:00
wm831x_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
wm8350_wdt.c watchdog: add SPDX identifiers for watchdog subsystem 2018-03-24 10:19:40 +01:00
xen_wdt.c watchdog: xen_wdt: remove info message and version number 2017-12-28 20:45:44 +01:00
ziirave_wdt.c watchdog: ziirave: constify i2c_device_id 2017-09-09 21:16:17 +02:00
zx2967_wdt.c watchdog: zx2967: explicitly request exclusive reset control 2017-09-09 20:18:43 +02:00