linux/drivers/platform/x86
Srinivas Pandruvada 79175b6ee6 platform/x86: ISST: Fix possible circular locking dependency detected
[ Upstream commit 17da2d5f93 ]

As reported:

[  256.104522] ======================================================
[  256.113783] WARNING: possible circular locking dependency detected
[  256.120093] 5.16.0-rc6-yocto-standard+ #99 Not tainted
[  256.125362] ------------------------------------------------------
[  256.131673] intel-speed-sel/844 is trying to acquire lock:
[  256.137290] ffffffffc036f0d0 (punit_misc_dev_lock){+.+.}-{3:3}, at: isst_if_open+0x18/0x90 [isst_if_common]
[  256.147171]
[  256.147171] but task is already holding lock:
[  256.153135] ffffffff8ee7cb50 (misc_mtx){+.+.}-{3:3}, at: misc_open+0x2a/0x170
[  256.160407]
[  256.160407] which lock already depends on the new lock.
[  256.160407]
[  256.168712]
[  256.168712] the existing dependency chain (in reverse order) is:
[  256.176327]
[  256.176327] -> #1 (misc_mtx){+.+.}-{3:3}:
[  256.181946]        lock_acquire+0x1e6/0x330
[  256.186265]        __mutex_lock+0x9b/0x9b0
[  256.190497]        mutex_lock_nested+0x1b/0x20
[  256.195075]        misc_register+0x32/0x1a0
[  256.199390]        isst_if_cdev_register+0x65/0x180 [isst_if_common]
[  256.205878]        isst_if_probe+0x144/0x16e [isst_if_mmio]
...
[  256.241976]
[  256.241976] -> #0 (punit_misc_dev_lock){+.+.}-{3:3}:
[  256.248552]        validate_chain+0xbc6/0x1750
[  256.253131]        __lock_acquire+0x88c/0xc10
[  256.257618]        lock_acquire+0x1e6/0x330
[  256.261933]        __mutex_lock+0x9b/0x9b0
[  256.266165]        mutex_lock_nested+0x1b/0x20
[  256.270739]        isst_if_open+0x18/0x90 [isst_if_common]
[  256.276356]        misc_open+0x100/0x170
[  256.280409]        chrdev_open+0xa5/0x1e0
...

The call sequence suggested that misc_device /dev file can be opened
before misc device is yet to be registered, which is done only once.

Here punit_misc_dev_lock was used as common lock, to protect the
registration by multiple ISST HW drivers, one time setup, prevent
duplicate registry of misc device and prevent load/unload when device
is open.

We can split into locks:
- One which just prevent duplicate call to misc_register() and one
time setup. Also never call again if the misc_register() failed or
required one time setup is failed. This lock is not shared with
any misc device callbacks.

- The other lock protects registry, load and unload of HW drivers.

Sequence in isst_if_cdev_register()
- Register callbacks under punit_misc_dev_open_lock
- Call isst_misc_reg() which registers misc_device on the first
registry which is under punit_misc_dev_reg_lock, which is not
shared with callbacks.

Sequence in isst_if_cdev_unregister
Just opposite of isst_if_cdev_register

Reported-and-tested-by: Liwei Song <liwei.song@windriver.com>
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Link: https://lore.kernel.org/r/20220112022521.54669-1-srinivas.pandruvada@linux.intel.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-02-23 12:00:58 +01:00
..
intel_speed_select_if platform/x86: ISST: Fix possible circular locking dependency detected 2022-02-23 12:00:58 +01:00
acer-wireless.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
acer-wmi.c platform/x86: acer-wmi: Add ACER_CAP_KBD_DOCK quirk for the Aspire Switch 10E SW3-016 2021-03-11 14:17:24 +01:00
acerhdf.c - Add support to enable/disable the thermal zones resulting on core code and 2020-08-06 18:10:55 -07:00
alienware-wmi.c
amilo-rfkill.c
apple-gmux.c platform/x86: apple-gmux: use resource_size() with res 2022-01-05 12:40:29 +01:00
asus-laptop.c platform/x86: asus-laptop: Drop duplicate check for led_classdev_unregister() 2020-05-07 19:37:23 +03:00
asus-nb-wmi.c platform/x86: asus-nb-wmi: Revert "add support for ASUS ROG Zephyrus G14 and G15" 2021-07-14 16:56:00 +02:00
asus-wireless.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
asus-wmi.c platform/x86: asus-wmi: Fix SW_TABLET_MODE always reporting 1 on many different models 2020-10-06 09:48:05 +02:00
asus-wmi.h platform/x86: asus-wmi: Fix SW_TABLET_MODE always reporting 1 on many different models 2020-10-06 09:48:05 +02:00
classmate-laptop.c platform/x86: classmate-laptop: remove unused variable 2019-10-15 10:55:10 +03:00
compal-laptop.c platform/x86: compal-laptop: Initialize "value" in ec_read_u8() 2019-09-07 21:16:09 +03:00
dcdbas.c platform/x86: dcdbas: Check SMBIOS for protected buffer address 2020-06-01 12:27:25 +03:00
dcdbas.h
dell_rbu.c platform/x86: dell_rbu: Unify format of the printed messages 2020-02-10 17:47:38 +02:00
dell-laptop.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
dell-rbtn.c change email address for Pali Rohár 2020-04-10 15:36:22 -07:00
dell-rbtn.h change email address for Pali Rohár 2020-04-10 15:36:22 -07:00
dell-smbios-base.c platform/x86: dell-smbios-base: Fix error return code in dell_smbios_init 2020-12-30 11:53:28 +01:00
dell-smbios-smm.c change email address for Pali Rohár 2020-04-10 15:36:22 -07:00
dell-smbios-wmi.c platform/x86: dell-smbios-wmi: Add missing kfree in error-exit from run_smbios_call 2021-09-18 13:40:15 +02:00
dell-smbios.h change email address for Pali Rohár 2020-04-10 15:36:22 -07:00
dell-smo8800.c change email address for Pali Rohár 2020-04-10 15:36:22 -07:00
dell-wmi-aio.c
dell-wmi-descriptor.c platform-drivers-x86 for v5.3-1 2019-07-14 16:51:47 -07:00
dell-wmi-descriptor.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
dell-wmi-led.c
dell-wmi.c platform/x86: dell-wmi: add new dmi mapping for keycode 0xffff 2020-07-09 22:47:27 +03:00
eeepc-laptop.c platform/x86: eeepc-laptop: Drop duplicate check for led_classdev_unregister() 2020-05-07 19:39:32 +03:00
eeepc-wmi.c
fujitsu-laptop.c
fujitsu-tablet.c
gpd-pocket-fan.c platform/x86: GPD pocket fan: Fix error message when temp-limits are out of range 2020-03-20 14:44:47 +02:00
hdaps.c treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
hp_accel.c platform/x86: hp_accel: Fix an error handling path in 'lis3lv02d_probe()' 2021-11-26 10:39:16 +01:00
hp-wireless.c platform/x86: hp-wireless: add AMD's hardware id to the supported list 2021-06-03 09:00:44 +02:00
hp-wmi.c platform/x86: hp-wmi: Disable tablet-mode reporting by default 2021-02-17 11:02:22 +01:00
huawei-wmi.c platform/x86: huawei-wmi: Remove unnecessary battery mutex 2019-10-21 12:17:30 +03:00
i2c-multi-instantiate.c platform/x86: i2c-multi-instantiate: Don't create platform device for INT3515 ACPI nodes 2021-01-27 11:54:51 +01:00
ibm_rtl.c
ideapad-laptop.c platform/x86: ideapad-laptop: Disable touchpad_switch for ELAN0634 2021-01-27 11:54:51 +01:00
intel_atomisp2_led.c platform/x86: Add new intel_atomisp2_led driver 2020-07-09 22:47:27 +03:00
intel_atomisp2_pm.c platform/x86: intel_atomisp2_pm: Spelling fixes 2020-01-10 11:57:22 +02:00
intel_bxtwc_tmu.c platform/x86: intel_bxtwc_tmu: Remove dev_err() usage after platform_get_irq() 2019-08-01 18:03:02 +03:00
intel_cht_int33fe_common.c platform/x86: intel_cht_int33fe: Drop double check for ACPI companion device 2020-07-09 22:40:36 +03:00
intel_cht_int33fe_common.h platform/x86: intel_cht_int33fe: Split code to Micro-B and Type-C 2019-10-15 10:55:10 +03:00
intel_cht_int33fe_microb.c platform/x86: intel_cht_int33fe: Split code to Micro-B and Type-C 2019-10-15 10:55:10 +03:00
intel_cht_int33fe_typec.c platform/x86: intel_cht_int33fe: Fix spelling issues 2020-04-20 14:47:45 +03:00
intel_chtdc_ti_pwrbtn.c
intel_int0002_vgpio.c platform/x86: intel_int0002_vgpio: Only call enable_irq_wake() when using s2idle 2021-05-26 12:06:49 +02:00
intel_ips.c
intel_ips.h platform/x86: intel-ips: Use the correct style for SPDX License Identifier 2020-01-10 11:57:21 +02:00
intel_menlow.c platform/x86: intel_menlow: switch to use <linux/units.h> helpers 2020-01-31 10:30:40 -08:00
intel_mid_powerbtn.c platform/x86: intel_mid_powerbtn: Convert to use new SCU IPC API 2020-04-24 11:17:32 +01:00
intel_mid_thermal.c thermal: Explicitly enable non-changing thermal zone devices 2020-06-29 20:26:37 +02:00
intel_mrfld_pwrbtn.c
intel_oaktrail.c platform/x86: intel_oaktrail: Use pr_warn instead of pr_warning 2019-10-18 15:01:35 +02:00
intel_pmc_core_pltdrv.c platform/x86: intel_pmc_core: fix memleak on registration failure 2021-12-29 12:26:02 +01:00
intel_pmc_core.c platform/x86: intel_pmc_core: Don't use global pmcdev in quirks 2021-05-11 14:47:21 +02:00
intel_pmc_core.h platform/x86: intel_pmc_core: Fix the slp_s0 counter displayed value 2020-10-07 23:06:29 +02:00
intel_punit_ipc.c platform/x86/intel: punit_ipc: Drop wrong use of ACPI_PTR() 2021-09-30 10:11:01 +02:00
intel_scu_ipc.c platform/x86: intel_scu_ipc: Update timeout value in comment 2021-10-27 09:56:55 +02:00
intel_scu_ipcutil.c platform/x86: intel_scu_ipcutil: Convert to use new SCU IPC API 2020-04-24 11:17:41 +01:00
intel_scu_pcidrv.c platform/x86: intel_pmc_ipc: Move PCI IDs to intel_scu_pcidrv.c 2020-04-24 11:18:25 +01:00
intel_scu_pltdrv.c platform/x86: Add Elkhart Lake SCU/PMC support 2020-05-05 20:26:16 +03:00
intel_telemetry_core.c platform/x86: intel_telemetry: Add telemetry_get_pltdata() 2020-04-24 11:18:30 +01:00
intel_telemetry_debugfs.c platform/x86: intel_pmc_ipc: Convert to MFD 2020-04-24 11:18:44 +01:00
intel_telemetry_pltdrv.c platform/x86: intel_pmc_ipc: Convert to MFD 2020-04-24 11:18:44 +01:00
intel_turbo_max_3.c platform/x86: Convert to new CPU match macros 2020-03-24 21:33:00 +01:00
intel-hid.c platform/x86: intel-hid: Support Lenovo ThinkPad X1 Tablet Gen 2 2021-04-10 13:36:07 +02:00
intel-rst.c
intel-smartconnect.c
intel-uncore-frequency.c platform/x86/intel-uncore-freq: make uncore_root_kobj static 2020-04-17 16:48:06 +03:00
intel-vbtn.c platform/x86: intel-vbtn: Stop reporting SW_DOCK events 2021-03-30 14:31:53 +02:00
intel-wmi-sbl-fw-update.c platform/x86: Add Slim Bootloader firmware update signaling driver 2020-05-05 20:27:44 +03:00
intel-wmi-thunderbolt.c platform/x86: wmi: add context argument to the probe function 2019-06-17 15:22:47 +03:00
Kconfig platform/x86: intel_int0002_vgpio: Only call enable_irq_wake() when using s2idle 2021-05-26 12:06:49 +02:00
lg-laptop.c platform/x86: lg-laptop: Drop duplicate check for led_classdev_unregister() 2020-05-07 20:14:17 +03:00
Makefile platform/x86: Add new intel_atomisp2_led driver 2020-07-09 22:47:27 +03:00
mlx-platform.c platform/x86: mlx-platform: remove an unused variable 2020-12-30 11:54:19 +01:00
msi-laptop.c
msi-wmi.c
mxm-wmi.c
panasonic-laptop.c
pcengines-apuv2.c platform/x86: pcengines-apuv2: Add missing terminating entries to gpio-lookup tables 2021-08-18 08:59:09 +02:00
peaq-wmi.c platform/x86: peaq-wmi: switch to using polled mode of input devices 2019-10-15 10:55:09 +03:00
pmc_atom.c platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table 2021-05-14 09:50:20 +02:00
samsung-laptop.c platform/x86: samsung-laptop: Drop duplicate check for led_classdev_unregister() 2020-05-07 20:14:24 +03:00
samsung-q10.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
sony-laptop.c platform/x86: sony-laptop: Make resuming thermal profile safer 2020-05-12 17:27:11 +03:00
surface3_button.c
surface3_power.c platform/x86: surface3_power: Fix a NULL vs IS_ERR() check in probe 2020-04-17 16:47:26 +03:00
surface3-wmi.c
surfacepro3_button.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
system76_acpi.c platform/x86: system76-acpi: Fix brightness_set schedule while atomic 2020-07-09 22:40:36 +03:00
tc1100-wmi.c
thinkpad_acpi.c platform/x86: thinkpad_acpi: Fix WWAN device disabled issue after S3 deep 2021-12-08 09:03:19 +01:00
topstar-laptop.c
toshiba_acpi.c platform/x86: toshiba_acpi: Fix missing error code in toshiba_acpi_setup_keyboard() 2021-07-14 16:56:00 +02:00
toshiba_bluetooth.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
toshiba_haps.c
toshiba-wmi.c
touchscreen_dmi.c platform/x86: touchscreen_dmi: Add info for the RWC NANOTE P8 AY07J 2-in-1 2022-02-23 12:00:58 +01:00
wmi-bmof.c platform-drivers-x86 for v5.3-1 2019-07-14 16:51:47 -07:00
wmi.c platform/x86: wmi: do not fail if disabling fails 2021-11-18 14:03:53 +01:00
xiaomi-wmi.c platform/x86: wmi: Make two functions static 2020-04-17 16:47:26 +03:00
xo1-rfkill.c
xo15-ebook.c