Phong Hoang
347ab94803
pwm: Fix deadlock warning when removing PWM device
This patch fixes deadlock warning if removing PWM device
when CONFIG_PROVE_LOCKING is enabled.
This issue can be reproceduced by the following steps on
the R-Car H3 Salvator-X board if the backlight is disabled:
# cd /sys/class/pwm/pwmchip0
# echo 0 > export
# ls
device export npwm power pwm0 subsystem uevent unexport
# cd device/driver
# ls
bind e6e31000.pwm uevent unbind
# echo e6e31000.pwm > unbind
[ 87.659974] ======================================================
[ 87.666149] WARNING: possible circular locking dependency detected
[ 87.672327] 5.0.0 #7 Not tainted
[ 87.675549] ------------------------------------------------------
[ 87.681723] bash/2986 is trying to acquire lock:
[ 87.686337] 000000005ea0e178 (kn->count#58){++++}, at: kernfs_remove_by_name_ns+0x50/0xa0
[ 87.694528]
[ 87.694528] but task is already holding lock:
[ 87.700353] 000000006313b17c (pwm_lock){+.+.}, at: pwmchip_remove+0x28/0x13c
[ 87.707405]
[ 87.707405] which lock already depends on the new lock.
[ 87.707405]
[ 87.715574]
[ 87.715574] the existing dependency chain (in reverse order) is:
[ 87.723048]
[ 87.723048] -> #1 (pwm_lock){+.+.}:
[ 87.728017] __mutex_lock+0x70/0x7e4
[ 87.732108] mutex_lock_nested+0x1c/0x24
[ 87.736547] pwm_request_from_chip.part.6+0x34/0x74
[ 87.741940] pwm_request_from_chip+0x20/0x40
[ 87.746725] export_store+0x6c/0x1f4
[ 87.750820] dev_attr_store+0x18/0x28
[ 87.754998] sysfs_kf_write+0x54/0x64
[ 87.759175] kernfs_fop_write+0xe4/0x1e8
[ 87.763615] __vfs_write+0x40/0x184
[ 87.767619] vfs_write+0xa8/0x19c
[ 87.771448] ksys_write+0x58/0xbc
[ 87.775278] __arm64_sys_write+0x18/0x20
[ 87.779721] el0_svc_common+0xd0/0x124
[ 87.783986] el0_svc_compat_handler+0x1c/0x24
[ 87.788858] el0_svc_compat+0x8/0x18
[ 87.792947]
[ 87.792947] -> #0 (kn->count#58){++++}:
[ 87.798260] lock_acquire+0xc4/0x22c
[ 87.802353] __kernfs_remove+0x258/0x2c4
[ 87.806790] kernfs_remove_by_name_ns+0x50/0xa0
[ 87.811836] remove_files.isra.1+0x38/0x78
[ 87.816447] sysfs_remove_group+0x48/0x98
[ 87.820971] sysfs_remove_groups+0x34/0x4c
[ 87.825583] device_remove_attrs+0x6c/0x7c
[ 87.830197] device_del+0x11c/0x33c
[ 87.834201] device_unregister+0x14/0x2c
[ 87.838638] pwmchip_sysfs_unexport+0x40/0x4c
[ 87.843509] pwmchip_remove+0xf4/0x13c
[ 87.847773] rcar_pwm_remove+0x28/0x34
[ 87.852039] platform_drv_remove+0x24/0x64
[ 87.856651] device_release_driver_internal+0x18c/0x21c
[ 87.862391] device_release_driver+0x14/0x1c
[ 87.867175] unbind_store+0xe0/0x124
[ 87.871265] drv_attr_store+0x20/0x30
[ 87.875442] sysfs_kf_write+0x54/0x64
[ 87.879618] kernfs_fop_write+0xe4/0x1e8
[ 87.884055] __vfs_write+0x40/0x184
[ 87.888057] vfs_write+0xa8/0x19c
[ 87.891887] ksys_write+0x58/0xbc
[ 87.895716] __arm64_sys_write+0x18/0x20
[ 87.900154] el0_svc_common+0xd0/0x124
[ 87.904417] el0_svc_compat_handler+0x1c/0x24
[ 87.909289] el0_svc_compat+0x8/0x18
[ 87.913378]
[ 87.913378] other info that might help us debug this:
[ 87.913378]
[ 87.921374] Possible unsafe locking scenario:
[ 87.921374]
[ 87.927286] CPU0 CPU1
[ 87.931808] ---- ----
[ 87.936331] lock(pwm_lock);
[ 87.939293] lock(kn->count#58);
[ 87.945120] lock(pwm_lock);
[ 87.950599] lock(kn->count#58);
[ 87.953908]
[ 87.953908] *** DEADLOCK ***
[ 87.953908]
[ 87.959821] 4 locks held by bash/2986:
[ 87.963563] #0: 00000000ace7bc30 (sb_writers#6){.+.+}, at: vfs_write+0x188/0x19c
[ 87.971044] #1: 00000000287991b2 (&of->mutex){+.+.}, at: kernfs_fop_write+0xb4/0x1e8
[ 87.978872] #2: 00000000f739d016 (&dev->mutex){....}, at: device_release_driver_internal+0x40/0x21c
[ 87.988001] #3: 000000006313b17c (pwm_lock){+.+.}, at: pwmchip_remove+0x28/0x13c
[ 87.995481]
[ 87.995481] stack backtrace:
[ 87.999836] CPU: 0 PID: 2986 Comm: bash Not tainted 5.0.0 #7
[ 88.005489] Hardware name: Renesas Salvator-X board based on r8a7795 ES1.x (DT)
[ 88.012791] Call trace:
[ 88.015235] dump_backtrace+0x0/0x190
[ 88.018891] show_stack+0x14/0x1c
[ 88.022204] dump_stack+0xb0/0xec
[ 88.025514] print_circular_bug.isra.32+0x1d0/0x2e0
[ 88.030385] __lock_acquire+0x1318/0x1864
[ 88.034388] lock_acquire+0xc4/0x22c
[ 88.037958] __kernfs_remove+0x258/0x2c4
[ 88.041874] kernfs_remove_by_name_ns+0x50/0xa0
[ 88.046398] remove_files.isra.1+0x38/0x78
[ 88.050487] sysfs_remove_group+0x48/0x98
[ 88.054490] sysfs_remove_groups+0x34/0x4c
[ 88.058580] device_remove_attrs+0x6c/0x7c
[ 88.062671] device_del+0x11c/0x33c
[ 88.066154] device_unregister+0x14/0x2c
[ 88.070070] pwmchip_sysfs_unexport+0x40/0x4c
[ 88.074421] pwmchip_remove+0xf4/0x13c
[ 88.078163] rcar_pwm_remove+0x28/0x34
[ 88.081906] platform_drv_remove+0x24/0x64
[ 88.085996] device_release_driver_internal+0x18c/0x21c
[ 88.091215] device_release_driver+0x14/0x1c
[ 88.095478] unbind_store+0xe0/0x124
[ 88.099048] drv_attr_store+0x20/0x30
[ 88.102704] sysfs_kf_write+0x54/0x64
[ 88.106359] kernfs_fop_write+0xe4/0x1e8
[ 88.110275] __vfs_write+0x40/0x184
[ 88.113757] vfs_write+0xa8/0x19c
[ 88.117065] ksys_write+0x58/0xbc
[ 88.120374] __arm64_sys_write+0x18/0x20
[ 88.124291] el0_svc_common+0xd0/0x124
[ 88.128034] el0_svc_compat_handler+0x1c/0x24
[ 88.132384] el0_svc_compat+0x8/0x18
The sysfs unexport in pwmchip_remove() is completely asymmetric
to what we do in pwmchip_add_with_polarity() and commit 0733424c9b
("pwm: Unexport children before chip removal") is a strong indication
that this was wrong to begin with. We should just move
pwmchip_sysfs_unexport() where it belongs, which is right after
pwmchip_sysfs_unexport_children(). In that case, we do not need
separate functions anymore either.
We also really want to remove sysfs irrespective of whether or not
the chip will be removed as a result of pwmchip_remove(). We can only
assume that the driver will be gone after that, so we shouldn't leave
any dangling sysfs files around.
This warning disappears if we move pwmchip_sysfs_unexport() to
the top of pwmchip_remove(), pwmchip_sysfs_unexport_children().
That way it is also outside of the pwm_lock section, which indeed
doesn't seem to be needed.
Moving the pwmchip_sysfs_export() call outside of that section also
seems fine and it'd be perfectly symmetric with pwmchip_remove() again.
So, this patch fixes them.
Signed-off-by: Phong Hoang <phong.hoang.wz@renesas.com>
[shimoda: revise the commit log and code]
Fixes: 76abbdde2d ("pwm: Add sysfs interface")
Fixes: 0733424c9b ("pwm: Unexport children before chip removal")
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: Hoan Nguyen An <na-hoan@jinso.co.jp>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2019-03-20 12:21:31 +01:00
..
2019-02-26 11:23:49 +00:00
2019-02-06 09:36:36 -08:00
2019-03-05 18:55:17 +01:00
2019-02-15 16:47:55 +02:00
2019-02-15 17:17:57 +01:00
2019-03-06 09:41:12 -08:00
2019-02-14 08:45:22 +01:00
2019-02-06 22:17:42 -08:00
2019-03-06 10:22:26 -08:00
2019-03-06 20:34:20 -06:00
2019-03-08 10:02:58 -08:00
2019-03-09 15:53:03 -08:00
2019-02-28 09:16:12 +01:00
2019-02-25 09:28:54 +01:00
2019-03-01 14:28:43 +01:00
2019-02-07 11:11:05 +05:30
2019-03-14 09:11:54 -07:00
2019-02-08 22:39:01 -08:00
2019-03-03 23:45:27 +00:00
2019-03-08 14:48:40 -08:00
2019-02-12 15:27:14 -06:00
2019-03-10 14:08:19 -04:00
2019-03-01 20:53:41 +01:00
2019-03-16 13:05:32 -07:00
2019-02-11 11:07:49 +01:00
2019-02-08 06:42:53 -07:00
2019-03-06 10:46:29 -08:00
2019-02-13 08:07:31 +01:00
2019-02-07 21:44:27 -05:00
2019-03-05 21:07:21 -08:00
2019-03-05 21:07:14 -08:00
2019-02-24 08:20:17 -07:00
2019-03-07 18:32:00 -08:00
2019-02-15 08:40:12 -07:00
2019-03-09 16:53:47 -08:00
2019-02-07 12:57:17 -07:00
2019-03-08 21:17:07 +01:00
2019-02-27 17:22:50 +01:00
2019-02-05 21:27:40 -05:00
2019-03-07 18:31:59 -08:00
2019-02-28 13:49:22 -07:00
2019-03-07 12:20:11 -08:00
2019-03-07 10:11:41 -08:00
2019-02-22 00:11:47 -08:00
2019-02-06 10:33:10 -08:00
2019-02-06 10:35:02 -08:00
2019-03-05 21:07:20 -08:00
2019-02-07 00:13:27 +01:00
2019-02-15 19:52:17 +01:00
2019-02-19 13:20:35 +01:00
2019-02-08 12:27:36 +01:00
2019-02-12 23:47:42 +01:00
2019-02-23 12:13:45 +01:00
2019-03-07 18:32:01 -08:00
2019-03-05 14:53:50 -05:00
2019-03-10 11:54:48 -07:00
2019-03-10 12:47:57 -07:00
2019-03-07 18:32:00 -08:00
2019-03-10 10:17:23 -07:00
2019-02-28 03:28:53 -05:00
2019-02-22 12:55:31 -08:00
2019-02-24 17:33:59 -08:00
2019-03-12 18:59:17 -07:00
2019-02-07 16:47:32 +01:00
2019-02-19 10:10:05 +01:00
2019-02-28 08:24:23 -07:00
2019-03-06 07:59:36 -08:00
2019-03-05 21:07:18 -08:00
2019-02-28 03:29:37 -05:00
2019-02-28 03:28:53 -05:00
2019-03-12 14:08:19 -07:00
2019-02-18 12:41:16 +01:00
2019-02-07 16:38:36 +01:00
2019-03-12 10:04:02 -07:00
2019-03-05 21:07:16 -08:00
2019-02-15 16:54:38 +01:00
2019-02-06 10:05:16 +00:00
2019-03-12 10:04:00 -07:00
2019-03-05 21:07:19 -08:00
2019-02-14 20:56:10 -05:00
2019-02-05 14:05:03 +01:00
2019-02-24 14:43:22 +01:00
2019-02-22 12:56:24 -08:00
2019-03-09 19:52:47 -08:00
2019-02-04 17:36:01 -05:00
2019-02-04 08:53:56 +01:00
2019-02-23 10:53:31 +01:00
2019-02-11 11:26:48 +01:00
2019-02-24 08:20:17 -07:00
2019-03-01 11:24:51 +01:00
2019-02-09 19:48:42 -06:00
2019-03-03 21:05:10 -08:00
2019-03-08 10:09:53 -08:00
2019-02-23 10:53:31 +01:00
2019-03-08 10:09:53 -08:00
2019-03-05 21:07:13 -08:00
2019-03-04 13:42:05 +01:00
2019-03-07 18:31:59 -08:00
2019-03-12 14:08:19 -07:00
2019-02-15 14:12:09 -08:00
2019-03-05 21:07:15 -08:00
2019-03-06 08:14:05 -08:00
2019-02-20 22:48:50 +01:00
2019-02-08 17:33:00 -05:00
2019-03-16 13:05:32 -07:00
2019-03-07 18:31:59 -08:00
2019-03-05 21:07:16 -08:00
2019-02-28 07:55:53 +01:00
2019-03-12 14:08:19 -07:00
2019-03-07 18:32:03 -08:00
2019-02-24 17:45:25 -08:00
2019-02-05 11:51:56 -07:00
2019-02-18 16:43:54 -08:00
2019-02-12 10:38:46 +01:00
2019-03-12 10:04:02 -07:00
2019-03-05 21:07:17 -08:00
2019-03-11 17:08:14 -07:00
2019-03-09 15:53:03 -08:00
2019-03-12 10:04:01 -07:00
2019-03-05 21:07:21 -08:00
2019-03-10 13:16:37 -07:00
2019-03-09 09:56:17 -08:00
2019-02-08 13:30:10 -06:00
2019-03-07 18:31:59 -08:00
2019-02-16 13:45:01 -08:00
2019-03-02 12:54:35 -08:00
2019-02-04 18:21:12 +01:00
2019-03-01 16:20:16 -05:00
2019-03-01 16:20:16 -05:00
2019-02-20 15:14:20 -05:00
2019-03-01 16:20:16 -05:00
2019-03-05 21:07:20 -08:00
2019-02-13 11:03:18 -05:00
2019-02-20 07:22:17 -07:00
2019-02-20 07:22:17 -07:00
2019-02-20 07:22:19 -07:00
2019-02-20 07:22:10 -07:00
2019-02-20 07:22:05 -07:00
2019-02-08 15:02:49 -08:00
2019-02-13 09:10:14 +01:00
2019-02-28 11:40:49 -06:00
2019-03-05 21:07:19 -08:00
2019-03-15 11:21:25 -07:00
2019-02-13 19:45:56 +01:00
2019-02-28 11:09:29 +01:00
2019-02-15 10:03:35 +00:00
2019-03-10 12:29:52 -07:00
2019-02-28 07:55:37 +01:00
2019-02-28 08:29:50 +01:00
2019-02-07 18:11:58 -08:00
2019-03-03 21:47:57 -08:00
2019-02-24 12:39:45 -08:00
2019-03-07 18:31:59 -08:00
2019-03-08 10:09:53 -08:00
2019-02-15 11:36:38 +01:00
2019-03-06 12:59:46 -08:00
2019-02-20 11:18:07 +01:00
2019-03-12 09:43:00 +01:00
2019-03-07 11:23:17 +01:00
2019-03-12 10:04:03 -07:00
2019-02-07 00:13:27 +01:00
2019-02-20 00:33:08 +01:00
2019-03-09 09:22:42 -08:00
2019-03-05 17:03:53 +01:00
2019-02-17 15:53:01 -08:00
2019-03-20 12:21:31 +01:00
2019-02-09 08:44:32 -08:00
2019-02-09 08:44:41 -08:00
2019-02-09 08:44:46 -08:00
2019-02-09 08:47:52 -08:00
2019-02-09 08:45:46 -08:00
2019-02-09 08:45:52 -08:00
2019-03-07 18:32:03 -08:00
2019-02-20 21:34:17 -08:00
2019-02-22 13:49:00 +01:00
2019-03-13 09:46:10 -04:00
2019-02-25 21:20:45 +01:00
2019-02-11 15:02:33 -07:00
2019-03-07 12:20:11 -08:00
2019-03-12 14:08:19 -07:00
2019-03-05 21:07:18 -08:00
2019-03-11 08:54:01 -07:00
2019-03-05 21:07:14 -08:00
2019-02-03 11:17:31 -08:00
2019-02-09 08:47:52 -08:00
2019-02-09 08:45:59 -08:00
2019-02-09 08:47:52 -08:00
2019-02-07 16:38:35 +01:00
2019-03-14 14:36:20 -07:00
2019-03-10 12:47:57 -07:00
2019-02-11 07:36:13 -05:00
2019-03-16 13:47:14 -07:00
2019-02-28 13:49:29 +01:00
2019-02-07 00:13:27 +01:00
2019-02-07 00:13:28 +01:00
2019-02-07 00:13:28 +01:00
2019-02-09 08:47:52 -08:00
2019-02-13 09:48:51 +02:00
2019-02-13 09:48:52 +02:00
2019-03-07 18:31:59 -08:00
2019-02-04 10:59:50 -05:00
2019-02-04 17:34:07 -05:00
2019-03-07 10:34:37 +01:00
2019-03-06 11:19:57 -05:00
2019-02-24 12:06:19 -08:00
2019-03-06 11:19:15 -05:00
2019-02-26 12:53:55 +01:00
2019-02-11 08:34:04 +01:00
2019-03-07 08:46:07 -08:00
2019-03-06 14:52:48 -08:00
2019-02-20 17:08:54 -05:00