]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpu: Provide lockdep check for CPU hotplug lock write-held
authorFrederic Weisbecker <frederic@kernel.org>
Tue, 27 May 2025 13:33:01 +0000 (15:33 +0200)
committerFrederic Weisbecker <frederic@kernel.org>
Tue, 3 Feb 2026 14:23:33 +0000 (15:23 +0100)
cpuset modifies partitions, including isolated, while holding the cpu
hotplug lock read-held.

This means that write-holding the CPU hotplug lock is safe to
synchronize against housekeeping cpumask changes.

Provide a lockdep check to validate that.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Cc: Marco Crivellari <marco.crivellari@suse.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Waiman Long <longman@redhat.com>
Cc: linux-kernel@vger.kernel.org
include/linux/cpuhplock.h
include/linux/percpu-rwsem.h
kernel/cpu.c

index f7aa20f62b871f3bf5e3010c84098bff27c2ec78..286b3ab92e15c3ba6c4889dd0405025bf458fc9d 100644 (file)
@@ -13,6 +13,7 @@
 struct device;
 
 extern int lockdep_is_cpus_held(void);
+extern int lockdep_is_cpus_write_held(void);
 
 #ifdef CONFIG_HOTPLUG_CPU
 void cpus_write_lock(void);
index 288f5235649a5a0877090a806f41508f3ea41c5c..c8cb010d655ebe28a88349900f98977c3c4126b3 100644 (file)
@@ -161,6 +161,7 @@ extern void percpu_free_rwsem(struct percpu_rw_semaphore *);
        __percpu_init_rwsem(sem, #sem, &rwsem_key);             \
 })
 
+#define percpu_rwsem_is_write_held(sem)        lockdep_is_held_type(sem, 0)
 #define percpu_rwsem_is_held(sem)      lockdep_is_held(sem)
 #define percpu_rwsem_assert_held(sem)  lockdep_assert_held(sem)
 
index 40b8496f47c5eeb18b513474fcd501a1116bdd8c..01968a5c4a16fc3d34d1cb85f1f935efd4864997 100644 (file)
@@ -534,6 +534,11 @@ int lockdep_is_cpus_held(void)
 {
        return percpu_rwsem_is_held(&cpu_hotplug_lock);
 }
+
+int lockdep_is_cpus_write_held(void)
+{
+       return percpu_rwsem_is_write_held(&cpu_hotplug_lock);
+}
 #endif
 
 static void lockdep_acquire_cpus_lock(void)