All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@zeniv.linux.org.uk>
To: NeilBrown <neil@brown.name>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
	Jeff Layton <jlayton@kernel.org>,
	Trond Myklebust <trondmy@kernel.org>,
	Anna Schumaker <anna@kernel.org>,
	Miklos Szeredi <miklos@szeredi.hu>,
	Amir Goldstein <amir73il@gmail.com>, Jeremy Kerr <jk@ozlabs.org>,
	Ard Biesheuvel <ardb@kernel.org>,
	linux-efi@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-nfs@vger.kernel.org, linux-unionfs@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 04/19] VFS: use wait_var_event for waiting in d_alloc_parallel()
Date: Tue, 28 Apr 2026 04:37:38 +0100	[thread overview]
Message-ID: <20260428033738.GV3518998@ZenIV> (raw)
In-Reply-To: <20260427040517.828226-5-neilb@ownmail.net>

On Mon, Apr 27, 2026 at 02:01:22PM +1000, NeilBrown wrote:
> From: NeilBrown <neil@brown.name>
> 
> d_alloc_parallel() currently requires a wait_queue_head to be passed in.
> This must have a life time which extends until the lookup is completed.
> 
> This makes it awkward to use and particularly make it hard to use in
> lookup_one_qstr_excl() which I hope to do in the future.
> 
> This patch changes d_alloc_parallel() to use wake_up_var_locked() to
> wake up waiters, and wait_var_event_spinlock() to wait.  dentry->d_lock
> is used for synchronisation as it is already held and the relevant
> times.
> 
> In most cases there will be no waiters so the wake_up_var_locked()
> call is a complete waste.  To optimise this a new ->d_flags flag is
> added: DCACHE_LOCK_WAITERS.  This is set whenever any thread prepares to
> wait for the dentry, and if it isn't set when DCACHE_PAR_LOOKUP is
> cleared, no wakeup is sent.
> (The name is deliberately generic as I plan to replace DCACHE_PAR_LOOKUP
> with more generic per-dentry locking in the future).
> 
> __d_lookup_unhash() now returns a bool rather than a wq.  This is true
> if DCACHE_LOCK_WAITERS was sent and is used to decide to send the wake
> up.  It would be easier to send the wakeup immediately when clearing
> DCACHE_LOCK_WAITERS, but then the waiter could wake a bit earlier and
> then spend time spinning on ->d_lock.  I don't know if that cost is
> interesting.

I definitely like the calling conventions change, so much that I'd be glad
to pick that one Right Fucking Now.  I'd probably make the store in
d_must_wait() conditional, though - ->d_flags and ->d_lock are in different
cachelines and there's no need to dirty both every time we are called.
IOW, have d_must_wait() do this:
	if (!d_in_lookup(dentry))
		return false;
	if (!(dentry->d_flags & DCACHE_LOCK_WAITER))
		dentry->d_flags |= DCACHE_LOCK_WAITER;
	return true;
Not sure if it would flow better with return values inverted (and
negation removed from wait_var_event_spinlock(), that is)...

>  static inline void end_dir_add(struct inode *dir, unsigned int n,
> -			       wait_queue_head_t *d_wait)
> +			       bool do_wake, struct dentry *de)
>  {
>  	smp_store_release(&dir->i_dir_seq, n + 2);
>  	preempt_enable_nested();
> -	if (wq_has_sleeper(d_wait))
> -		wake_up_all(d_wait);
> +	if (do_wake)
> +		wake_up_var_locked(&de->d_flags, &de->d_lock);
>  }

This calling conventions change, OTOH, I don't like at all.  I mean,
(dir, n, false, unused) vs. (dir, n, true, never_NULL) is seriously
asking to be reduced to (dir, n, NULL) vs. (dir, n, never_NULL).

> @@ -2800,29 +2793,29 @@ EXPORT_SYMBOL(d_alloc_parallel);
>   * - Retrieve and clear the waitqueue head in dentry
>   * - Return the waitqueue head

... not anymore.  The entire comment needs replacement, TBH - 2 lines of
3 are stale with that patch and remaining one is... ambiguous, since
there are *two* hashes around and "Unhash the dentry" usually refers to
the other one.

Something like

/*
 * Move dentry from in-lookup state to busy-negative one.
 *
 * From now on d_in_lookup(dentry) will return false and dentry is gone from
 * in-lookup hash.
 *
 * Anyone who had been waiting on it in d_alloc_parallel() is free to
 * proceed after that.  Note that waking such waiters up is left to
 * the callers; we might be called in write-side critical area for ->i_dir_seq,
 * and PREEMPT_RT kernels can't have that wakeup done in those.
 *
 * Returns whether there are waiters to be woken up.
 */

perhaps?

  reply	other threads:[~2026-04-28  3:37 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-27  4:01 [PATCH v3 00/19] Prepare to lift lookup out of exclusive lock for directory ops NeilBrown
2026-04-27  4:01 ` [PATCH v3 01/19] VFS: fix various typos in documentation for start_creating start_removing etc NeilBrown
2026-04-27  4:01 ` [PATCH v3 02/19] VFS: enhance d_splice_alias() to handle in-lookup dentries NeilBrown
2026-04-27  4:01 ` [PATCH v3 03/19] VFS: allow d_alloc_name() to be used with ->d_hash NeilBrown
2026-04-28  2:10   ` Al Viro
2026-04-29  2:44     ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 04/19] VFS: use wait_var_event for waiting in d_alloc_parallel() NeilBrown
2026-04-28  3:37   ` Al Viro [this message]
2026-04-28 11:18     ` NeilBrown
2026-04-28 14:22       ` Al Viro
2026-04-28 23:26         ` NeilBrown
2026-04-29  5:26           ` Al Viro
2026-04-29 17:07             ` Al Viro
2026-04-29 21:03               ` Linus Torvalds
2026-04-30 23:51               ` NeilBrown
2026-05-01  1:11                 ` Al Viro
2026-05-01  1:39                   ` NeilBrown
2026-05-01  1:45                     ` NeilBrown
2026-05-01  3:37                     ` Al Viro
2026-05-01 10:46                       ` NeilBrown
2026-05-01  1:20                 ` NeilBrown
2026-04-28 16:32     ` Linus Torvalds
2026-04-27  4:01 ` [PATCH v3 05/19] VFS: introduce d_alloc_noblock() NeilBrown
2026-04-28  2:22   ` Al Viro
2026-04-28 11:24     ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 06/19] VFS: add d_duplicate() NeilBrown
2026-04-27  4:01 ` [PATCH v3 07/19] VFS: Add LOOKUP_SHARED flag NeilBrown
2026-04-27  7:43   ` Amir Goldstein
2026-04-27  8:47     ` NeilBrown
2026-04-27  9:05       ` Amir Goldstein
2026-04-27 23:51         ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 08/19] VFS/xfs/ntfs: drop parent lock across d_alloc_parallel() in d_add_ci() NeilBrown
2026-04-27  7:49   ` Amir Goldstein
2026-04-27  8:48     ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 09/19] ovl: stop using lookup_one() in iterate_shared() handling NeilBrown
2026-04-27 10:10   ` Amir Goldstein
2026-04-28  0:24     ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 10/19] VFS/ovl: add d_alloc_noblock_return() NeilBrown
2026-04-27  9:40   ` Amir Goldstein
2026-04-28  0:34     ` NeilBrown
2026-04-28  4:35       ` Al Viro
2026-04-28 11:44         ` NeilBrown
2026-04-27  4:01 ` [PATCH v3 11/19] efivarfs: use d_alloc_name() NeilBrown
2026-04-27  4:01 ` [PATCH v3 12/19] shmem: use d_duplicate() NeilBrown
2026-04-27  4:01 ` [PATCH v3 13/19] nfs: remove d_drop()/d_alloc_parallel() from nfs_atomic_open() NeilBrown
2026-04-27  4:01 ` [PATCH v3 14/19] nfs: use d_splice_alias() in nfs_link() NeilBrown
2026-04-27  4:01 ` [PATCH v3 15/19] nfs: don't d_drop() before d_splice_alias() NeilBrown
2026-04-27  4:01 ` [PATCH v3 16/19] nfs: don't d_drop() before d_splice_alias() in atomic_create NeilBrown
2026-04-27  4:01 ` [PATCH v3 17/19] nfs: Use d_alloc_noblock() in nfs_prime_dcache() NeilBrown
2026-04-27  4:01 ` [PATCH v3 18/19] nfs: use d_alloc_noblock() in silly-rename NeilBrown
2026-04-27  4:01 ` [PATCH v3 19/19] nfs: use d_duplicate() NeilBrown
2026-04-27  8:42 ` [syzbot ci] Re: Prepare to lift lookup out of exclusive lock for directory ops syzbot ci
2026-04-28 23:16   ` NeilBrown

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=20260428033738.GV3518998@ZenIV \
    --to=viro@zeniv.linux.org.uk \
    --cc=amir73il@gmail.com \
    --cc=anna@kernel.org \
    --cc=ardb@kernel.org \
    --cc=brauner@kernel.org \
    --cc=jack@suse.cz \
    --cc=jk@ozlabs.org \
    --cc=jlayton@kernel.org \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=neil@brown.name \
    --cc=torvalds@linux-foundation.org \
    --cc=trondmy@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.