All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Snitzer <snitzer@kernel.org>
To: Anna Schumaker <anna@kernel.org>, Trond Myklebust <trondmy@kernel.org>
Cc: linux-nfs@vger.kernel.org,
	Jonathan Flynn <jonathan.flynn@hammerspace.com>
Subject: [PATCH 00/11] NFSv4/flexfiles: scale layoutstats for striped layouts
Date: Mon,  2 Nov 2026 14:10:58 -0500	[thread overview]
Message-ID: <20261102191109.13470-1-snitzer@kernel.org> (raw)

Hi,

Since striped flexfiles layouts were introduced, each stripe of a mirror
carries its own read_stat and write_stat, but the lock protecting them
stayed in the mirror.  For a RAID0-style layout (one mirror, many
stripes) that lock is effectively per-file: every DS RPC takes it twice,
once at prepare and once at completion, so striping multiplies RPC
parallelism without multiplying lock parallelism.

On a 64-core client reading one file from a 32-stripe layout with a
128KiB stripe unit (~36.7 GB/s, ~275k NFSv3 READ RPCs/s), perf reports
45% of all CPU in native_queued_spin_lock_slowpath, and 73% of the lock
contention events come from the two layoutstats paths.

This series removes that bottleneck and, along the way, fixes what the
server is told in LAYOUTSTATS for a striped mirror.

Patches 1-2 (Jonathan) move the layoutstats lock into the stripe, next
to the statistics it protects, and remove the now-unused mirror lock.

Patches 3-8 keep the per-stripe hot path to the stripe's own cachelines:
  3: cacheline align the per-stripe statistics so neighbouring stripes
     do not false-share
  4: make dss_info->start_time write-once (try_cmpxchg64), removing its
     dependence on any lock
  5: drop the redundant atomic from the busy timer
  6: pair the in-flight count with the layoutstats updates, under the
     same lock, with lockdep assertions
  7: derive ffil_ops_requested rather than storing it
  8: give each direction its own lock and cacheline, so an I/O dirties
     one line (the stripe shrinks from 384 to 320 bytes)

Patches 9-10 fix LAYOUTSTATS reporting for striped mirrors:
  9: drop NFS4_FF_MIRROR_STAT_AVAIL.  The per-mirror bit cost two atomic
     RMWs per RPC on the mirror's shared cacheline, and since the first
     stripe reported cleared it, a report carried only one
     ff_layoutupdate4 per mirror: always the lowest usable dss_id.
 10: rotate reporting across a mirror's stripes.  Callers cap a report
     at four entries; resume each mirror's scan where the previous
     report stopped, so every busy stripe is reported within
     ceil(busy_stripes / 4) report intervals instead of only the first
     four ever being reported.

Patch 11 takes the report decision (pointer chases into the mirror and
layout, ktime_to_ms(), the last_report_time cmpxchg) out of the critical
section, leaving the lock to cover two writes on one cacheline.

The wire encoding is unchanged; the values reported remain cumulative
since the layout was granted.

The series is based on Anna's linux-next (nfs-for-7.4-1).

Thanks,
Mike

Jonathan Flynn (2):
  NFSv4/flexfiles: move layoutstats accounting to a per-stripe lock
  NFSv4/flexfiles: drop the now-unused per-mirror lock

Mike Snitzer (9):
  NFSv4/flexfiles: cacheline align the per-stripe layoutstats
  NFSv4/flexfiles: make dss_info->start_time write-once
  NFSv4/flexfiles: drop the redundant atomic from the busy timer
  NFSv4/flexfiles: pair the in-flight count with the layoutstats updates
  NFSv4/flexfiles: derive ffil_ops_requested rather than storing it
  NFSv4/flexfiles: give each direction its own lock and cacheline
  NFSv4/flexfiles: drop NFS4_FF_MIRROR_STAT_AVAIL
  NFSv4/flexfiles: rotate LAYOUTSTATS reporting across a mirror's stripes
  NFSv4/flexfiles: take the report decision out of the critical section

 fs/nfs/flexfilelayout/flexfilelayout.c | 251 ++++++++++++++++---------
 fs/nfs/flexfilelayout/flexfilelayout.h |  74 ++++++--
 2 files changed, 218 insertions(+), 107 deletions(-)


base-commit: ef30b3efb7e8bae94d790a6503a595e1051323e7
-- 
2.52.0


             reply	other threads:[~2026-11-02 19:11 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-02 19:10 Mike Snitzer [this message]
2026-11-02 19:10 ` [PATCH 01/11] NFSv4/flexfiles: move layoutstats accounting to a per-stripe lock Mike Snitzer
2026-11-02 19:11 ` [PATCH 02/11] NFSv4/flexfiles: drop the now-unused per-mirror lock Mike Snitzer
2026-11-02 19:11 ` [PATCH 03/11] NFSv4/flexfiles: cacheline align the per-stripe layoutstats Mike Snitzer
2026-11-02 19:11 ` [PATCH 04/11] NFSv4/flexfiles: make dss_info->start_time write-once Mike Snitzer
2026-11-02 19:11 ` [PATCH 05/11] NFSv4/flexfiles: drop the redundant atomic from the busy timer Mike Snitzer
2026-11-02 19:11 ` [PATCH 06/11] NFSv4/flexfiles: pair the in-flight count with the layoutstats updates Mike Snitzer
2026-11-02 19:11 ` [PATCH 07/11] NFSv4/flexfiles: derive ffil_ops_requested rather than storing it Mike Snitzer
2026-11-02 19:11 ` [PATCH 08/11] NFSv4/flexfiles: give each direction its own lock and cacheline Mike Snitzer
2026-11-02 19:11 ` [PATCH 09/11] NFSv4/flexfiles: drop NFS4_FF_MIRROR_STAT_AVAIL Mike Snitzer
2026-11-02 19:11 ` [PATCH 10/11] NFSv4/flexfiles: rotate LAYOUTSTATS reporting across a mirror's stripes Mike Snitzer
2026-11-02 19:11 ` [PATCH 11/11] NFSv4/flexfiles: take the report decision out of the critical section Mike Snitzer

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=20261102191109.13470-1-snitzer@kernel.org \
    --to=snitzer@kernel.org \
    --cc=anna@kernel.org \
    --cc=jonathan.flynn@hammerspace.com \
    --cc=linux-nfs@vger.kernel.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.