[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20250620140320.231780-1-alexjlzheng@tencent.com>
Date: Fri, 20 Jun 2025 22:03:20 +0800
From: Jinliang Zheng <alexjlzheng@...il.com>
To: david@...morbit.com
Cc: cem@...nel.org,
chizhiling@....com,
chizhiling@...inos.cn,
djwong@...nel.org,
linux-kernel@...r.kernel.org,
linux-xfs@...r.kernel.org
Subject: Re: [PATCH] xfs: Remove i_rwsem lock in buffered read
On Fri, 27 Dec 2024 08:50:46 +1100, Dave Chinner <david@...morbit.com> wrote:
> On Thu, Dec 26, 2024 at 02:16:02PM +0800, Chi Zhiling wrote:
> > From: Chi Zhiling <chizhiling@...inos.cn>
> >
> > Using an rwsem to protect file data ensures that we can always obtain a
> > completed modification. But due to the lock, we need to wait for the
> > write process to release the rwsem before we can read it, even if we are
> > reading a different region of the file. This could take a lot of time
> > when many processes need to write and read this file.
> >
> > On the other hand, The ext4 filesystem and others do not hold the lock
> > during buffered reading, which make the ext4 have better performance in
> > that case. Therefore, I think it will be fine if we remove the lock in
> > xfs, as most applications can handle this situation.
>
> Nope.
>
> This means that XFS loses high level serialisation of incoming IO
> against operations like truncate, fallocate, pnfs operations, etc.
>
> We've been through this multiple times before; the solution lies in
> doing the work to make buffered writes use shared locking, not
> removing shared locking from buffered reads.
Hi, Dave
I have a question that I haven't figured out: If shared locking are used
in buffer writes, how can the read/write atomicity mentioned by [0] provided
by xfs be guaranteed?
" "I/O is intended to be atomic to ordinary files and pipes and FIFOs.
" Atomic means that all the bytes from a single operation that started
" out together end up together, without interleaving from other I/O
" operations."
"
" i.e. that independent read()s should see a write() as a single
" atomic change. hence if you do a read() concurrently with a write(),
" the read should either run to completion before the write, or the
" write run to completion before the read().
"
" XFS is the only linux filesystem that provides this behaviour.
[0] https://lore.kernel.org/linux-xfs/20190325001044.GA23020@dastard/
thanks,
Jinliang Zheng :)
>
> A couple of old discussions from the list:
>
> https://lore.kernel.org/linux-xfs/CAOQ4uxi0pGczXBX7GRAFs88Uw0n1ERJZno3JSeZR71S1dXg+2w@mail.gmail.com/
> https://lore.kernel.org/linux-xfs/20190404165737.30889-1-amir73il@gmail.com/
>
> There are likely others - you can search for them yourself to get
> more background information.
>
> Fundamentally, though, removing locking from the read side is not
> the answer to this buffered write IO exclusion problem....
>
> -Dave.
> --
> Dave Chinner
> david@...morbit.com
Powered by blists - more mailing lists