From nobody Mon May 25 00:08:59 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D10AE3ACF01; Wed, 20 May 2026 08:28:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779265703; cv=none; b=FYvA/mbeACU3ZrdGj4uRh98xnVfDGibYbhRkdap/YfM/EgnxaGzrxyzPqF3UnzxWRfLhGEKPcbn50CqIJYm1oadHKibF7OaPETdvt8DvufxMhUgoA8nBZvVtVKmdUx2WHXMWI3kywV0KiqXDyNjG3d2vZp5mdeZVmYk7qXRKI5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779265703; c=relaxed/simple; bh=55kehuipL0hh+BDcv+HKdRXNJw/Y/OaSKXNMTAnMIKE=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=g3+VGQrHb9Dx5nrE+Ww9GCgNvEj/0YcVv0RarW95dsvAbsC9JGx0HlxR3/OgPTOiJELR3wdNUC2183OHZVuPcdefALEGDVxR7fmADDszJZj23vIaVWMVxmnkhzKXr9xIwjQpbC5P3uDfjIjRxhmw1qTJVkATp34QnM0yzPcM9xI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=VYzfs/cx; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=qKyo3Bzg; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="VYzfs/cx"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="qKyo3Bzg" Date: Wed, 20 May 2026 08:28:08 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1779265690; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5lFCVb/0ePpIbqZuPr7Klnnk4DsPkuAsXhhxPQfMpzo=; b=VYzfs/cxT5T0XCGSI9X3Y0DHOY0c0CMmANjnRmZHMdUbebAc58owvsva46eCljgvC+FviV FRAOIq6qiZDWjTSD2LZbHdVEva+zYZcp0tViP9oEjeq1mhDV4EoysGyBeUWzBnSfDyy0IS hASb5EJaHZiNaL/6dZt6ggt2Gx5eYhwMqcmPtfkUBSDvNoNB1mk4uMAFGzH3i8FgKltfUz Ei3TaCUUY8V2I8D6jV4/mVgYJOL5xtSiAD3+DMFfoO0XlRgGd1FBwkPs2O87Z/QvE45Xsj bHLNIfAtZZQt2YVteU55auRPiWjtEpdACqxi5G9/LhzIgUVMyrHh+tDdddx5PQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1779265690; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5lFCVb/0ePpIbqZuPr7Klnnk4DsPkuAsXhhxPQfMpzo=; b=qKyo3Bzg14TVnmRPFPvYmASGXu0zHZmrurlfizsuVNpVdvFGapocKBQvYfoOg0VD0r68Fs uA0pFOf3p80iprCw== From: "tip-bot2 for Marco Elver" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: locking/core] compiler-context-analysis: Bump required Clang version to 23 Cc: Marco Elver , "Peter Zijlstra (Intel)" , Nathan Chancellor , Bart Van Assche , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20260515124426.2227783-1-elver@google.com> References: <20260515124426.2227783-1-elver@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <177926568868.711.3058599932884307249.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the locking/core branch of tip: Commit-ID: 2422e2b10ebb45a6ac7a799a36462bfda3eda4c5 Gitweb: https://git.kernel.org/tip/2422e2b10ebb45a6ac7a799a36462bfda= 3eda4c5 Author: Marco Elver AuthorDate: Fri, 15 May 2026 14:43:31 +02:00 Committer: Peter Zijlstra CommitterDate: Tue, 19 May 2026 13:49:01 +02:00 compiler-context-analysis: Bump required Clang version to 23 Clang 23 introduces several major improvements: 1. Support for multiple arguments in the `guarded_by` and `pt_guarded_by` attributes [1]. This allows defining variables protected by multiple context locks, where read access requires holding at least one lock (shared or exclusive), and write access requires holding all of them exclusively. 2. Function pointer support [2]. We can now add attributes to function pointers just like we do on normal functions. 3. A fix to use arrays of locks [3]. Each index is now correctly treated as a separate lock instance. 4. A fix for implicit member access in attributes [4]. This allows to use __guarded_by(&foo->lock) correctly. Overall that makes it worthwhile bumping the compiler version instead of trying to make both Clang 22 and later work while supporting these new features. Signed-off-by: Marco Elver Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Nathan Chancellor Reviewed-by: Bart Van Assche Link: https://github.com/llvm/llvm-project/pull/186838 [1] Link: https://github.com/llvm/llvm-project/pull/191187 [2] Link: https://github.com/llvm/llvm-project/pull/148551 [3] Link: https://github.com/llvm/llvm-project/pull/194457 [4] Link: https://patch.msgid.link/20260515124426.2227783-1-elver@google.com --- Documentation/dev-tools/context-analysis.rst | 2 +- include/linux/compiler-context-analysis.h | 30 +++++++++++++------ lib/Kconfig.debug | 4 +-- lib/test_context-analysis.c | 24 +++++++++++++++- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Documentation/dev-tools/context-analysis.rst b/Documentation/d= ev-tools/context-analysis.rst index 54d9ee2..8e71e1e 100644 --- a/Documentation/dev-tools/context-analysis.rst +++ b/Documentation/dev-tools/context-analysis.rst @@ -17,7 +17,7 @@ features. To enable for Clang, configure the kernel with:: =20 CONFIG_WARN_CONTEXT_ANALYSIS=3Dy =20 -The feature requires Clang 22 or later. +The feature requires Clang 23 or later. =20 The analysis is *opt-in by default*, and requires declaring which modules = and subsystems should be analyzed in the respective `Makefile`:: diff --git a/include/linux/compiler-context-analysis.h b/include/linux/comp= iler-context-analysis.h index a931757..8302ebc 100644 --- a/include/linux/compiler-context-analysis.h +++ b/include/linux/compiler-context-analysis.h @@ -39,12 +39,14 @@ # define __assumes_shared_ctx_lock(...) __attribute__((assert_shared_capab= ility(__VA_ARGS__))) =20 /** - * __guarded_by - struct member and globals attribute, declares variable - * only accessible within active context + * __guarded_by() - struct member and globals attribute, declares variable + * only accessible within active context + * @...: context lock instance pointer(s) * * Declares that the struct member or global variable is only accessible w= ithin - * the context entered by the given context lock. Read operations on the d= ata - * require shared access, while write operations require exclusive access. + * the context entered by the given context lock(s). Read operations on th= e data + * require shared access to at least one of the context locks, while write + * operations require exclusive access to all listed context locks. * * .. code-block:: c * @@ -52,17 +54,24 @@ * spinlock_t lock; * long counter __guarded_by(&lock); * }; + * + * struct some_state { + * spinlock_t lock1, lock2; + * long counter __guarded_by(&lock1, &lock2); + * }; */ # define __guarded_by(...) __attribute__((guarded_by(__VA_ARGS__))) =20 /** - * __pt_guarded_by - struct member and globals attribute, declares pointed= -to - * data only accessible within active context + * __pt_guarded_by() - struct member and globals attribute, declares point= ed-to + * data only accessible within active context + * @...: context lock instance pointer(s) * * Declares that the data pointed to by the struct member pointer or global * pointer is only accessible within the context entered by the given cont= ext - * lock. Read operations on the data require shared access, while write - * operations require exclusive access. + * lock(s). Read operations on the data require shared access to at least = one + * of the context locks, while write operations require exclusive access t= o all + * listed context locks. * * .. code-block:: c * @@ -70,6 +79,11 @@ * spinlock_t lock; * long *counter __pt_guarded_by(&lock); * }; + * + * struct some_state { + * spinlock_t lock1, lock2; + * long *counter __pt_guarded_by(&lock1, &lock2); + * }; */ # define __pt_guarded_by(...) __attribute__((pt_guarded_by(__VA_ARGS__))) =20 diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 8ff5adc..b0f3028 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -630,7 +630,7 @@ config DEBUG_FORCE_WEAK_PER_CPU =20 config WARN_CONTEXT_ANALYSIS bool "Compiler context-analysis warnings" - depends on CC_IS_CLANG && CLANG_VERSION >=3D 220100 + depends on CC_IS_CLANG && CLANG_VERSION >=3D 230000 # Branch profiling re-defines "if", which messes with the compiler's # ability to analyze __cond_acquires(..), resulting in false positives. depends on !TRACE_BRANCH_PROFILING @@ -641,7 +641,7 @@ config WARN_CONTEXT_ANALYSIS and releasing user-definable "context locks". =20 Clang's name of the feature is "Thread Safety Analysis". Requires - Clang 22.1.0 or later. + Clang 23 or later. =20 Produces warnings by default. Select CONFIG_WERROR if you wish to turn these warnings into errors. diff --git a/lib/test_context-analysis.c b/lib/test_context-analysis.c index 06b4a6a..316f4df 100644 --- a/lib/test_context-analysis.c +++ b/lib/test_context-analysis.c @@ -159,6 +159,10 @@ TEST_SPINLOCK_COMMON(read_lock, struct test_mutex_data { struct mutex mtx; int counter __guarded_by(&mtx); + + struct mutex mtx2; + int anyread __guarded_by(&mtx, &mtx2); + int *anyptr __pt_guarded_by(&mtx, &mtx2); }; =20 static void __used test_mutex_init(struct test_mutex_data *d) @@ -219,6 +223,26 @@ static void __used test_mutex_cond_guard(struct test_m= utex_data *d) } } =20 +static void __used test_mutex_multiguard(struct test_mutex_data *d) +{ + mutex_lock(&d->mtx); + (void)d->anyread; + (void)*d->anyptr; + mutex_unlock(&d->mtx); + + mutex_lock(&d->mtx2); + (void)d->anyread; + (void)*d->anyptr; + mutex_unlock(&d->mtx2); + + mutex_lock(&d->mtx); + mutex_lock(&d->mtx2); + d->anyread++; + (*d->anyptr)++; + mutex_unlock(&d->mtx2); + mutex_unlock(&d->mtx); +} + struct test_seqlock_data { seqlock_t sl; int counter __guarded_by(&sl);