On Sat, Sep 02, 2023 at 03:08:02AM +0800, Zorro Lang wrote: > On Tue, Aug 29, 2023 at 04:03:49PM -0700, Darrick J. Wong wrote: > > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > > > The write invalidation code in iomap can only be triggered for writes > > that span multiple folios. If the kernel reports a huge page size, > > scale up the write size. > > > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > > --- > > tests/xfs/559 | 29 ++++++++++++++++++++++++++++- > > 1 file changed, 28 insertions(+), 1 deletion(-) > > > > > > diff --git a/tests/xfs/559 b/tests/xfs/559 > > index cffe5045a5..64fc16ebfd 100755 > > --- a/tests/xfs/559 > > +++ b/tests/xfs/559 > > @@ -42,11 +42,38 @@ $XFS_IO_PROG -c 'chattr -x' $SCRATCH_MNT &> $seqres.full > > _require_pagecache_access $SCRATCH_MNT > > > > blocks=10 > > -blksz=$(_get_page_size) > > + > > +# If this kernel advertises huge page support, it's possible that it could be > > +# using large folios for the page cache writes. It is necessary to write > > +# multiple folios (large or regular) to triggering the write invalidation, > > +# so we'll scale the test write size accordingly. > > +blksz=$(_get_hugepagesize) > > Isn't _require_hugepages needed if _get_hugepagesize is used? Nope -- if the kernel doesn't support hugepages, then _get_hugepagesize returns the empty string... > Thanks, > Zorro > > > +base_pagesize=$(_get_page_size) > > +test -z "$blksz" && blksz=${base_pagesize} ...and this line will substitute in the base page size as the block size. --D > > filesz=$((blocks * blksz)) > > dirty_offset=$(( filesz - 1 )) > > write_len=$(( ( (blocks - 1) * blksz) + 1 )) > > > > +# The write invalidation that we're testing below can only occur as part of > > +# a single large write. The kernel limits writes to one base page less than > > +# 2GiB to prevent lengthy IOs and integer overflows. If the block size is so > > +# huge (e.g. 512M huge pages on arm64) that we'd exceed that, reduce the number > > +# of blocks to get us under the limit. > > +max_writesize=$((2147483647 - base_pagesize)) > > +if ((write_len > max_writesize)); then > > + blocks=$(( ( (max_writesize - 1) / blksz) + 1)) > > + # We need at least three blocks in the file to test invalidation > > + # between writes to multiple folios. If we drop below that, > > + # reconfigure ourselves with base pages and hope for the best. > > + if ((blocks < 3)); then > > + blksz=$base_pagesize > > + blocks=10 > > + fi > > + filesz=$((blocks * blksz)) > > + dirty_offset=$(( filesz - 1 )) > > + write_len=$(( ( (blocks - 1) * blksz) + 1 )) > > +fi > > + > > # Create a large file with a large unwritten range. > > $XFS_IO_PROG -f -c "falloc 0 $filesz" $SCRATCH_MNT/file >> $seqres.full > > > > >