linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marco Elver <elver@google.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Boqun Feng <boqun.feng@gmail.com>, Ingo Molnar <mingo@kernel.org>,
	 Will Deacon <will@kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	 Luc Van Oostenryck <luc.vanoostenryck@gmail.com>,
	Chris Li <sparse@chrisli.org>,
	 "Paul E. McKenney" <paulmck@kernel.org>,
	Alexander Potapenko <glider@google.com>,
	Arnd Bergmann <arnd@arndb.de>,
	 Bart Van Assche <bvanassche@acm.org>,
	Christoph Hellwig <hch@lst.de>,
	Dmitry Vyukov <dvyukov@google.com>,
	 Eric Dumazet <edumazet@google.com>,
	Frederic Weisbecker <frederic@kernel.org>,
	 Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	 Ian Rogers <irogers@google.com>, Jann Horn <jannh@google.com>,
	 Joel Fernandes <joelagnelf@nvidia.com>,
	Johannes Berg <johannes.berg@intel.com>,
	 Jonathan Corbet <corbet@lwn.net>,
	Josh Triplett <josh@joshtriplett.org>,
	 Justin Stitt <justinstitt@google.com>,
	Kees Cook <kees@kernel.org>,
	 Kentaro Takeda <takedakn@nttdata.co.jp>,
	Lukas Bulwahn <lukas.bulwahn@gmail.com>,
	 Mark Rutland <mark.rutland@arm.com>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	 Miguel Ojeda <ojeda@kernel.org>,
	Nathan Chancellor <nathan@kernel.org>,
	 Neeraj Upadhyay <neeraj.upadhyay@kernel.org>,
	 Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	 Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
	Thomas Gleixner <tglx@linutronix.de>,
	 Thomas Graf <tgraf@suug.ch>, Uladzislau Rezki <urezki@gmail.com>,
	Waiman Long <longman@redhat.com>,
	 kasan-dev@googlegroups.com, linux-crypto@vger.kernel.org,
	 linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org,
	 linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	 linux-security-module@vger.kernel.org,
	linux-sparse@vger.kernel.org,  linux-wireless@vger.kernel.org,
	llvm@lists.linux.dev, rcu@vger.kernel.org
Subject: Re: [PATCH v4 06/35] cleanup: Basic compatibility with context analysis
Date: Mon, 15 Dec 2025 16:53:18 +0100	[thread overview]
Message-ID: <CANpmjNNm-kbTw46Wh1BJudynHOeLn-Oxew8VuAnCppvV_WtyBw@mail.gmail.com> (raw)
In-Reply-To: <aUAPbFJSv0alh_ix@elver.google.com>

On Mon, 15 Dec 2025 at 14:38, Marco Elver <elver@google.com> wrote:
>
> On Fri, Dec 12, 2025 at 12:09PM +0100, Peter Zijlstra wrote:
> > On Fri, Dec 12, 2025 at 11:15:29AM +0100, Marco Elver wrote:
> > > On Fri, 12 Dec 2025 at 10:43, Peter Zijlstra <peterz@infradead.org> wrote:
> > > [..]
> > > > > Correct. We're trading false negatives over false positives at this
> > > > > point, just to get things to compile cleanly.
> > > >
> > > > Right, and this all 'works' right up to the point someone sticks a
> > > > must_not_hold somewhere.
> > > >
> > > > > > > Better support for Linux's scoped guard design could be added in
> > > > > > > future if deemed critical.
> > > > > >
> > > > > > I would think so, per the above I don't think this is 'right'.
> > > > >
> > > > > It's not sound, but we'll avoid false positives for the time being.
> > > > > Maybe we can wrangle the jigsaw of macros to let it correctly acquire
> > > > > and then release (via a 2nd cleanup function), it might be as simple
> > > > > as marking the 'constructor' with the right __acquires(..), and then
> > > > > have a 2nd __attribute__((cleanup)) variable that just does a no-op
> > > > > release via __release(..) so we get the already supported pattern
> > > > > above.
> > > >
> > > > Right, like I mentioned in my previous email; it would be lovely if at
> > > > the very least __always_inline would get a *very* early pass such that
> > > > the above could be resolved without inter-procedural bits. I really
> > > > don't consider an __always_inline as another procedure.
> > > >
> > > > Because as I already noted yesterday, cleanup is now all
> > > > __always_inline, and as such *should* all end up in the one function.
> > > >
> > > > But yes, if we can get a magical mash-up of __cleanup and __release (let
> > > > it be knows as __release_on_cleanup ?) that might also work I suppose.
> > > > But I vastly prefer __always_inline actually 'working' ;-)
> > >
> > > The truth is that __always_inline working in this way is currently
> > > infeasible. Clang and LLVM's architecture simply disallow this today:
> > > the semantic analysis that -Wthread-safety does happens over the AST,
> > > whereas always_inline is processed by early passes in the middle-end
> > > already within LLVM's pipeline, well after semantic analysis. There's
> > > a complexity budget limit for semantic analysis (type checking,
> > > warnings, assorted other errors), and path-sensitive &
> > > intra-procedural analysis over the plain AST is outside that budget.
> > > Which is why tools like clang-analyzer exist (symbolic execution),
> > > where it's possible to afford that complexity since that's not
> > > something that runs for a normal compile.
> > >
> > > I think I've pushed the current version of Clang's -Wthread-safety
> > > already far beyond what folks were thinking is possible (a variant of
> > > alias analysis), but even my healthy disregard for the impossible
> > > tells me that making path-sensitive intra-procedural analysis even if
> > > just for __always_inline functions is quite possibly a fool's errand.
> >
> > Well, I had to propose it. Gotta push the envelope :-)
> >
> > > So either we get it to work with what we have, or give up.
> >
> > So I think as is, we can start. But I really do want the cleanup thing
> > sorted, even if just with that __release_on_cleanup mashup or so.
>
> Working on rebasing this to v6.19-rc1 and saw this new scoped seqlock
> abstraction. For that one I was able to make it work like I thought we
> could (below). Some awkwardness is required to make it work in
> for-loops, which only let you define variables with the same type.
>
> For <linux/cleanup.h> it needs some more thought due to extra levels of
> indirection.

For cleanup.h, the problem is that to instantiate we use
"guard(class)(args..)". If it had been designed as "guard(class,
args...)", i.e. just use __VA_ARGS__ explicitly instead of the
implicit 'args...', it might have been possible to add a second
cleanup variable to do the same (with some additional magic to extract
the first arg if one exists). Unfortunately, the use of the current
guard()() idiom has become so pervasive that this is a bigger
refactor. I'm going to leave cleanup.h as-is for now, if we think we
want to give this a go in the current state.

One observation from the rebase: Generally synchronization primitives
do not change much and the annotations are relatively stable, but e.g.
RCU & sched (latter is optional and depends on the sched-enablement
patch) receive disproportionally more changes, and while new
annotations required for v6.19-rc1 were trivial, it does require
compiling with a Clang version that does produce the warnings to
notice.
While Clang 22-dev is being tested on CI, I doubt maintainers already
use it, so it's possible we'll see some late warnings due to missing
annotations when things hit -next. This might be an acceptable churn
cost, if we think the outcome is worthwhile. Things should get better
when Clang 22 is released properly, but until then things might be a
little bumpy if there are large changes across the core
synchronization primitives.

Thanks,
-- Marco

  reply	other threads:[~2025-12-15 15:53 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-20 14:49 [PATCH v4 00/35] Compiler-Based Context- and Locking-Analysis Marco Elver
2025-11-20 14:49 ` [PATCH v4 01/35] compiler_types: Move lock checking attributes to compiler-context-analysis.h Marco Elver
2025-11-20 14:49 ` [PATCH v4 02/35] compiler-context-analysis: Add infrastructure for Context Analysis with Clang Marco Elver
2025-11-20 18:14   ` Linus Torvalds
2025-11-20 23:51     ` Marco Elver
2025-12-11 11:44   ` Peter Zijlstra
2025-12-11 12:04   ` Peter Zijlstra
2025-12-11 13:12     ` Marco Elver
2025-12-12  9:31       ` Peter Zijlstra
2025-12-12 10:37         ` Marco Elver
2025-11-20 14:49 ` [PATCH v4 03/35] compiler-context-analysis: Add test stub Marco Elver
2025-11-20 14:49 ` [PATCH v4 04/35] Documentation: Add documentation for Compiler-Based Context Analysis Marco Elver
2025-11-20 14:49 ` [PATCH v4 05/35] checkpatch: Warn about context_unsafe() without comment Marco Elver
2025-11-20 15:09 ` [PATCH v4 06/35] cleanup: Basic compatibility with context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 07/35] lockdep: Annotate lockdep assertions for " Marco Elver
2025-12-11 11:43     ` Peter Zijlstra
2025-12-11 13:24       ` Marco Elver
2025-12-12  9:59         ` Peter Zijlstra
2025-12-12 10:48           ` Marco Elver
2025-11-20 15:09   ` [PATCH v4 08/35] locking/rwlock, spinlock: Support Clang's " Marco Elver
2025-12-11 11:49     ` Peter Zijlstra
2025-11-20 15:09   ` [PATCH v4 09/35] compiler-context-analysis: Change __cond_acquires to take return value Marco Elver
2025-11-20 15:09   ` [PATCH v4 10/35] locking/mutex: Support Clang's context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 11/35] locking/seqlock: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 12/35] bit_spinlock: Include missing <asm/processor.h> Marco Elver
2025-11-20 15:09   ` [PATCH v4 13/35] bit_spinlock: Support Clang's context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 14/35] rcu: " Marco Elver
2025-12-10 19:30     ` Paul E. McKenney
2025-12-10 21:50       ` Marco Elver
2025-12-10 22:49         ` Paul E. McKenney
2025-11-20 15:09   ` [PATCH v4 15/35] srcu: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 16/35] kref: Add context-analysis annotations Marco Elver
2025-12-11 12:26     ` Peter Zijlstra
2025-12-11 13:54       ` Marco Elver
2025-12-12  9:33         ` Peter Zijlstra
2025-11-20 15:09   ` [PATCH v4 17/35] locking/rwsem: Support Clang's context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 18/35] locking/local_lock: Include missing headers Marco Elver
2025-11-20 15:09   ` [PATCH v4 19/35] locking/local_lock: Support Clang's context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 20/35] locking/ww_mutex: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 21/35] debugfs: Make debugfs_cancellation a context guard struct Marco Elver
2025-11-20 15:09   ` [PATCH v4 22/35] compiler-context-analysis: Remove Sparse support Marco Elver
2025-11-20 15:09   ` [PATCH v4 23/35] compiler-context-analysis: Remove __cond_lock() function-like helper Marco Elver
2025-11-20 15:09   ` [PATCH v4 24/35] compiler-context-analysis: Introduce header suppressions Marco Elver
2025-11-20 15:09   ` [PATCH v4 25/35] compiler: Let data_race() imply disabled context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 26/35] MAINTAINERS: Add entry for Context Analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 27/35] kfence: Enable context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 28/35] kcov: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 29/35] kcsan: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 30/35] stackdepot: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 31/35] rhashtable: " Marco Elver
2025-11-20 15:09   ` [PATCH v4 32/35] printk: Move locking annotation to printk.c Marco Elver
2025-11-20 15:09   ` [PATCH v4 33/35] security/tomoyo: Enable context analysis Marco Elver
2025-11-20 15:09   ` [PATCH v4 34/35] crypto: " Marco Elver
2025-11-20 15:10   ` [PATCH v4 35/35] sched: Enable context analysis for core.c and fair.c Marco Elver
2025-12-11  9:55   ` [PATCH v4 06/35] cleanup: Basic compatibility with context analysis Peter Zijlstra
2025-12-11 11:51   ` Peter Zijlstra
2025-12-11 12:16   ` Peter Zijlstra
2025-12-11 13:19     ` Marco Elver
2025-12-12  9:43       ` Peter Zijlstra
2025-12-12 10:15         ` Marco Elver
2025-12-12 11:09           ` Peter Zijlstra
2025-12-15 13:38             ` Marco Elver
2025-12-15 15:53               ` Marco Elver [this message]
2025-12-16 11:01                 ` Marco Elver
2025-12-16 15:57                   ` Marco Elver
2025-12-16 12:23                 ` Peter Zijlstra
2025-12-16 13:26                   ` Marco Elver
2025-12-16 12:32               ` Peter Zijlstra
2025-12-16 13:23                 ` Marco Elver
2025-12-16 13:41                   ` Peter Zijlstra
2025-12-10 16:18 ` [PATCH v4 00/35] Compiler-Based Context- and Locking-Analysis Marco Elver
2025-12-10 16:37   ` Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CANpmjNNm-kbTw46Wh1BJudynHOeLn-Oxew8VuAnCppvV_WtyBw@mail.gmail.com \
    --to=elver@google.com \
    --cc=arnd@arndb.de \
    --cc=boqun.feng@gmail.com \
    --cc=bvanassche@acm.org \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=dvyukov@google.com \
    --cc=edumazet@google.com \
    --cc=frederic@kernel.org \
    --cc=glider@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@lst.de \
    --cc=herbert@gondor.apana.org.au \
    --cc=irogers@google.com \
    --cc=jannh@google.com \
    --cc=joelagnelf@nvidia.com \
    --cc=johannes.berg@intel.com \
    --cc=josh@joshtriplett.org \
    --cc=justinstitt@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=kees@kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=linux-sparse@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=longman@redhat.com \
    --cc=luc.vanoostenryck@gmail.com \
    --cc=lukas.bulwahn@gmail.com \
    --cc=mark.rutland@arm.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=nathan@kernel.org \
    --cc=neeraj.upadhyay@kernel.org \
    --cc=nick.desaulniers+lkml@gmail.com \
    --cc=ojeda@kernel.org \
    --cc=paulmck@kernel.org \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=peterz@infradead.org \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=sparse@chrisli.org \
    --cc=takedakn@nttdata.co.jp \
    --cc=tglx@linutronix.de \
    --cc=tgraf@suug.ch \
    --cc=urezki@gmail.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).