All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: 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 01:01:03 +0100	[thread overview]
Message-ID: <ZPpkPyV8AWOjlgfm@casper.infradead.org> (raw)
In-Reply-To: <20230907193838.GB14243@noisy.programming.kicks-ass.net>

On Thu, Sep 07, 2023 at 09:38:38PM +0200, Peter Zijlstra wrote:
> On Thu, Sep 07, 2023 at 08:20:30PM +0100, Matthew Wilcox wrote:
> > On Thu, Sep 07, 2023 at 09:08:10PM +0200, Peter Zijlstra wrote:
> > > On Thu, Sep 07, 2023 at 06:47:01PM +0100, Matthew Wilcox (Oracle) wrote:
> > > > Several places want to know whether the lock is held by a writer, instead
> > > > of just whether it's held.  We can implement this for both normal and
> > > > rt rwsems.  RWSEM_WRITER_LOCKED is declared in rwsem.c and exposing
> > > > it outside that file might tempt other people to use it, so just use
> > > > a comment to note that's what the 1 means, and help anybody find it if
> > > > they're looking to change the implementation.
> > > 
> > > I'm presuming this is deep in a callchain where they know they hold the
> > > lock, but they lost in what capacity?
> > 
> > No, it's just assertions.  You can see that in patch 3 where it's
> > used in functions called things like "xfs_islocked".
> 
> 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.

Sure, but if you are the lock owner, it's guaranteed to work.  And if
you hold it for read, and check that it's held for write, that will
definitely fail.  I agree "somebody else is holding it" gives you a
false negative, but most locks aren't contended, so it'll fail the
assertion often enough.

> > Patch 2 shows it in use in the MM code.  We already have a
> > lockdep_assert_held_write(), but most people don't enable lockdep, so
> 
> 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.

Hm.  Enabling lockdep causes an xfstests run to go up from 6000 seconds
to 8000 seconds for me.  That's a significant reduction in the number
of test cycles I can run per day.

> > 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.

That's true.  Is it possible to do a cheaper version of lockdep where it
only records that you have the lock and doesn't, eg, check for locking
dependencies?  I haven't analysed lockdep to see what the expensive part
is; for all I know it's recording the holders, and this idea is
worthless.

> > 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.

Probably, although I think there might be a race where the worker thread
starts running before the waiter starts waiting?

In conversation with Darrick & Dave, XFS does this in order to avoid
overflowing the kernel stack.  So if you've been thinking about "we
could support segmented stacks", it would avoid having to support this
lockdep handoff.  It'd probably work a lot better for the scheduler too.

  parent reply	other threads:[~2023-09-08  0:01 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
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 [this message]
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=ZPpkPyV8AWOjlgfm@casper.infradead.org \
    --to=willy@infradead.org \
    --cc=chandan.babu@oracle.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=peterz@infradead.org \
    --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 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.