On Fri, Sep 01, 2023 at 09:56:29PM -0700, Darrick J. Wong wrote: > 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. Oh yes, you catch it at here :) OK, so the whole patchset is good to me, Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx> > > --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 > > > > > > > > >