linux/drivers/ptp
Jeongjun Park b1b73c4523 ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use()
[ Upstream commit 87f7ce260a ]

There is no disagreement that we should check both ptp->is_virtual_clock
and ptp->n_vclocks to check if the ptp virtual clock is in use.

However, when we acquire ptp->n_vclocks_mux to read ptp->n_vclocks in
ptp_vclock_in_use(), we observe a recursive lock in the call trace
starting from n_vclocks_store().

============================================
WARNING: possible recursive locking detected
6.15.0-rc6 #1 Not tainted
--------------------------------------------
syz.0.1540/13807 is trying to acquire lock:
ffff888035a24868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at:
 ptp_vclock_in_use drivers/ptp/ptp_private.h:103 [inline]
ffff888035a24868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at:
 ptp_clock_unregister+0x21/0x250 drivers/ptp/ptp_clock.c:415

but task is already holding lock:
ffff888030704868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at:
 n_vclocks_store+0xf1/0x6d0 drivers/ptp/ptp_sysfs.c:215

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&ptp->n_vclocks_mux);
  lock(&ptp->n_vclocks_mux);

 *** DEADLOCK ***
....
============================================

The best way to solve this is to remove the logic that checks
ptp->n_vclocks in ptp_vclock_in_use().

The reason why this is appropriate is that any path that uses
ptp->n_vclocks must unconditionally check if ptp->n_vclocks is greater
than 0 before unregistering vclocks, and all functions are already
written this way. And in the function that uses ptp->n_vclocks, we
already get ptp->n_vclocks_mux before unregistering vclocks.

Therefore, we need to remove the redundant check for ptp->n_vclocks in
ptp_vclock_in_use() to prevent recursive locking.

Fixes: 73f37068d5 ("ptp: support ptp physical/virtual clocks conversion")
Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Link: https://patch.msgid.link/20250520160717.7350-1-aha310510@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-06-27 11:07:21 +01:00
..
Kconfig ptp: ocp: Select CRC16 in the Kconfig. 2022-07-27 18:11:34 -07:00
Makefile ptp: add ptp virtual clock driver framework 2021-07-01 13:08:18 -07:00
ptp_chardev.c ptp: Properly handle compat ioctls 2025-02-21 13:49:28 +01:00
ptp_clock.c ptp: Ensure info->enable callback is always set 2025-02-21 13:49:53 +01:00
ptp_clockmatrix.c ptp: ptp_clockmatrix: fix is_single_shot 2022-05-25 21:51:32 -07:00
ptp_clockmatrix.h ptp: ptp_clockmatrix: return -EBUSY if phase pull-in is in progress 2022-05-17 17:49:04 -07:00
ptp_dte.c ptp: convert remaining drivers to adjfine interface 2024-12-14 19:54:21 +01:00
ptp_idt82p33.c ptp: idt82p33: use rsmu driver to access i2c/spi bus 2022-03-09 19:50:57 -08:00
ptp_idt82p33.h ptp: idt82p33: use rsmu driver to access i2c/spi bus 2022-03-09 19:50:57 -08:00
ptp_ines.c net_tstamp: add new flag HWTSTAMP_FLAG_BONDED_PHC_INDEX 2021-12-14 12:28:24 +00:00
ptp_kvm_arm.c ptp: kvm: Use decrypted memory in confidential guest on x86 2024-12-19 18:08:53 +01:00
ptp_kvm_common.c ptp: kvm: Use decrypted memory in confidential guest on x86 2024-12-19 18:08:53 +01:00
ptp_kvm_x86.c ptp: kvm: x86: Return EOPNOTSUPP instead of ENODEV from kvm_arch_ptp_init() 2024-12-19 18:08:53 +01:00
ptp_ocp.c ptp: ocp: fix start time alignment in ptp_ocp_signal_set 2025-04-25 10:43:51 +02:00
ptp_pch.c ptp_pch: Remove unused pch_pm_ops 2022-02-08 21:04:32 -08:00
ptp_private.h ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use() 2025-06-27 11:07:21 +01:00
ptp_qoriq.c ptp_qoriq: fix memory leak in probe() 2023-04-06 12:10:44 +02:00
ptp_qoriq_debugfs.c ptp_qoriq: add little enadian support 2019-02-12 12:58:48 -05:00
ptp_sysfs.c ptp: fix integer overflow in max_vclocks_store 2024-06-27 13:46:19 +02:00
ptp_vclock.c ptp: vclock: use mutex to fix "sleep on atomic" bug 2023-03-11 13:55:25 +01:00
ptp_vmw.c ptp: add VMware virtual PTP clock driver 2020-03-05 17:25:07 -08:00