From: Peter Zijlstra <peterz@infradead.org>
To: Dave Chinner <david@fromorbit.com>
Cc: Matthew Wilcox <willy@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Will Deacon <will@kernel.org>,
Waiman Long <longman@redhat.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Chandan Babu R <chandan.babu@oracle.com>,
"Darrick J . Wong" <djwong@kernel.org>,
linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/5] locking: Add rwsem_is_write_locked()
Date: Fri, 8 Sep 2023 12:44:34 +0200 [thread overview]
Message-ID: <20230908104434.GB24372@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <ZPpV+MeFqX6RHIYw@dread.disaster.area>
On Fri, Sep 08, 2023 at 09:00:08AM +1000, Dave Chinner wrote:
> > Right, but if you're not the lock owner, your answer to the question is
> > a dice-roll, it might be locked, it might not be.
>
> Except that the person writing the code knows the call chain that
> leads up to that code, and so they have a pretty good idea whether
> the object should be locked or not. If we are running that code, and
> the object is locked, then it's pretty much guaranteed that the
> owner of the lock is code that executed the check, because otherwise
> we have a *major lock implementation bug*.
Agreed, and this is fine. However there's been some very creative
'use' of the _is_locked() class of functions in the past that did not
follow 'common' sense.
If all usage was: I should be holding this, lets check. I probably
wouldn't have this bad feeling about things.
> > Most devs should run with lockdep on when writing new code, and I know
> > the sanitizer robots run with lockdep on.
> >
> > In general there seems to be a ton of lockdep on coverage.
>
> *cough*
>
> Bit locks, semaphores, and all sorts of other constructs for IO
> serialisation (like inode_dio_wait()) have no lockdep coverage at
> all. IOWs, large chunks of many filesystems, the VFS and the VM have
> little to no lockdep coverage at all.
True, however I was commenting on the assertion that vm code has
duplicate asserts with the implication that was because not a lot of
people run with lockdep on.
> > > we also have VM_BUG_ON_MM(!rwsem_is_write_locked(&mm->mmap_lock), mm)
> > > to give us a good assertion when lockdep is disabled.
> >
> > Is that really worth it still? I mean, much of these assertions pre-date
> > lockdep.
>
> And we're trying to propagate them because lockdep isn't a viable
> option for day to day testing of filesystems because of it's
> overhead vs how infrequently it finds new problems.
... in XFS. Lockdep avoids a giant pile of broken from entering the
kernel and the robots still report plenty.
> > > XFS has a problem with using lockdep in general, which is that a worker
> > > thread can be spawned and use the fact that the spawner is holding the
> > > lock. There's no mechanism for the worker thread to ask "Does struct
> > > task_struct *p hold the lock?".
> >
> > Will be somewhat tricky to make happen -- but might be doable. It is
> > however an interface that is *very* hard to use correctly. Basically I
> > think you want to also assert that your target task 'p' is blocked,
> > right?
> >
> > That is: assert @p is blocked and holds @lock.
>
> That addresses the immediate symptom; it doesn't address the large
> problem with lockdep and needing non-owner rwsem semantics.
>
> i.e. synchronous task based locking models don't work for
> asynchronous multi-stage pipeline processing engines like XFS. The
> lock protects the data object and follows the data object through
> the processing pipeline, whilst the original submitter moves on to
> the next operation to processes without blocking.
>
> This is the non-blocking, async processing model that io_uring
> development is pushing filesystems towards, so assuming that we only
> hand a lock to a single worker task and then wait for it complete
> (i.e. synchronous operation) flies in the face of current
> development directions...
I was looking at things from an interface abuse perspective. How easy is
it to do the wrong thing. As said, we've had a bunch of really dodgy
code with the _is_locked class of functions, hence my desire to find
something else.
As to the whole non-owner locking, yes, that's problematic. I'm not
convinced async operations require non-owner locking, at the same time I
do see that IO completions pose a challence.
Coming from the schedulability and real-time corner, non-owner locks are
a nightmare because of the inversions. So yeah, fun to be had I'm sure.
next prev parent reply other threads:[~2023-09-08 10:44 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-07 17:47 [PATCH 0/5] Remove the XFS mrlock Matthew Wilcox (Oracle)
2023-09-07 17:47 ` [PATCH 1/5] locking: Add rwsem_is_write_locked() Matthew Wilcox (Oracle)
2023-09-07 18:05 ` Waiman Long
2023-09-07 19:33 ` Matthew Wilcox
2023-09-07 21:06 ` Waiman Long
2023-09-07 23:47 ` Waiman Long
2023-09-08 0:44 ` Dave Chinner
2023-09-07 19:08 ` Peter Zijlstra
2023-09-07 19:20 ` Matthew Wilcox
2023-09-07 19:38 ` Peter Zijlstra
2023-09-07 23:00 ` Dave Chinner
2023-09-08 10:44 ` Peter Zijlstra [this message]
2023-09-10 22:56 ` Dave Chinner
2023-09-10 23:17 ` Matthew Wilcox
2023-09-11 0:55 ` Dave Chinner
2023-09-11 2:15 ` Waiman Long
2023-09-11 22:29 ` Dave Chinner
2023-09-12 9:03 ` Peter Zijlstra
2023-09-12 12:28 ` Matthew Wilcox
2023-09-12 13:52 ` Peter Zijlstra
2023-09-12 13:58 ` Matthew Wilcox
2023-09-12 14:23 ` Peter Zijlstra
2023-09-12 15:27 ` Darrick J. Wong
2023-09-13 8:59 ` Peter Zijlstra
2023-09-12 14:02 ` Peter Zijlstra
2023-09-12 23:16 ` Dave Chinner
2023-09-08 0:01 ` Matthew Wilcox
2023-09-07 17:47 ` [PATCH 2/5] mm: Use rwsem_is_write_locked in mmap_assert_write_locked Matthew Wilcox (Oracle)
2023-09-07 17:47 ` [PATCH 3/5] xfs: Use rwsem_is_write_locked() Matthew Wilcox (Oracle)
2023-09-08 9:09 ` Christoph Hellwig
2023-09-08 9:10 ` Christoph Hellwig
2023-09-07 17:47 ` [PATCH 4/5] xfs: Remove mrlock wrapper Matthew Wilcox (Oracle)
2023-09-07 17:47 ` [PATCH 5/5] xfs: Stop using lockdep to assert that locks are held Matthew Wilcox (Oracle)
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=20230908104434.GB24372@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=chandan.babu@oracle.com \
--cc=david@fromorbit.com \
--cc=djwong@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=will@kernel.org \
--cc=willy@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.