Message ID | 1486275704-18917-3-git-send-email-xzhou@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, Feb 05, 2017 at 02:21:44PM +0800, Xiong Zhou wrote: > Mount TEST_DEV as non-DAX, SCRATCH_DEV as DAX, then > do some IO between them. In this case we use mmap > and dio/buffered IO read/write test programme. > > Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Yep, this is fine. > Signed-off-by: Xiong Zhou <xzhou@redhat.com> <> > diff --git a/tests/generic/407 b/tests/generic/407 <> > +do_tests() > +{ > + # less than page size > + t_mmap_dio_dax 1024 > + # page size > + t_mmap_dio_dax `src/feature -s` > + # bigger sizes, for PMD faults > + t_mmap_dio_dax $((16 * 1024 * 1024)) > + t_mmap_dio_dax $((64 * 1024 * 1024)) > +} > + > +# make fs 2Mb aligned for PMD fault testing > +if [[ $FSTYP =~ ext ]] ; then > + _scratch_mkfs "-E stride=512,stripe_width=1" \ > + > /dev/null 2>&1 > +elif [[ $FSTYP =~ xfs ]] ; then > + _scratch_mkfs "-d su=2m,sw=1" > /dev/null 2>&1 > +fi > + > +# mount SCRATCH_DEV with dax option, TEST_DEV not > +export MOUNT_OPTIONS="" > +export TEST_FS_MOUNT_OPTS="" > +_test_cycle_mount > +_fs_options $TEST_DEV | grep -qw "dax" && \ > + _notrun "we need $TEST_DEV mount without dax" > +_scratch_mount "-o dax" > + > +tsize=$((64 * 1024 * 1024)) Ugh - for some reason 64 MiB files for me don't get PMDs on ext4 because the ext4 block allocator gives us misaligned blocks. I'll follow up with them in a new thread on the ext4 list and I'll cc you, Xiong. If we up this to 128 MiB, so tsize=$((128 * 1024 * 1024)) I get PMDs for both ext4 and XFS. Can we make this one change before applying? The rest looks good to me. Thanks for the tests! Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com> -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Ross and all, After adding some initialization of test files, I've got different test results that the write call succeeds while the following read call fails. Please help test and review, Thanks! ----- common/rc : requires SCRATCH_DEV support DAX src/t_mmap_dio.c : intro mmap and O_DIRECT rw through files tests/generic/405 : IO between DAX/non-DAX mountpoints tests/xfs/138 : IO between DAX/non-DAX xfs files(per-inode flag) v2 : Merge helper function changes into the first patch; Rewrite _require_dax, check options for sure; Print msg in t_mmap_dio.c to show which test going wrong; Empty mount options and check after mount to ensure we wont mount with wrong option; Remove unnecessary leading underscore and _fail; Use xfs_io instead of dd; Other minor fixes. v3: close fds in C test programme for clean up. v4: Test both buffered and O_DIRECT IO; Fix arg numbers in C test programme; Fix fs options check after mount. Cc Jeff Moyer since this test is based on his code. (Sorry for the late cc!) v5: Mainly from Ross Zwisler <ross.zwisler@linux.intel.com> Add mkfs options to make fs 2M aligned, to hit PMD faults; Use falloc instead of pwrite to init test file aviding 4k alignment; 64M test file instead of 1G; Bumping test seq numners; Other minor fixes. v6: Test file size increase to 128M; Add fsync after write in t_mmap_dio.c; Split sub tests in both cases, re-initialize test files before every sub test. This change reveals the new read failure issue. Test status: Both cases not run on normal block device; Both cases not run on ext2/3 fs(no falloc); Both cases PASS on memory-mode nvdimm devices; DIO in both cases FAIL on brd based ramdisk with: DIO in both cases FAIL on raw-mode nvdimm devices with: +read(Bad address) len 1024 dio dax to nondax +read(Bad address) len 4096 dio dax to nondax +read(Bad address) len 16777216 dio dax to nondax +read(Bad address) len 67108864 dio dax to nondax I've reported this as an issue: https://lists.01.org/pipermail/linux-nvdimm/2017-February/008781.html Xiong Zhou (2): xfs: test per-inode DAX flag by IO generic: test mmap io through DAX and non-DAX .gitignore | 1 + common/rc | 13 +++++ src/Makefile | 2 +- src/t_mmap_dio.c | 111 +++++++++++++++++++++++++++++++++++ tests/generic/407 | 152 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/407.out | 2 + tests/generic/group | 1 + tests/xfs/196 | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/196.out | 2 + tests/xfs/group | 1 + 10 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 src/t_mmap_dio.c create mode 100755 tests/generic/407 create mode 100644 tests/generic/407.out create mode 100755 tests/xfs/196 create mode 100644 tests/xfs/196.out
diff --git a/tests/generic/407 b/tests/generic/407 new file mode 100755 index 0000000..6a457e4 --- /dev/null +++ b/tests/generic/407 @@ -0,0 +1,125 @@ +#! /bin/bash +# FS QA Test 407 +# +# mmap direct/buffered io between DAX and non-DAX mountpoints. +# +#----------------------------------------------------------------------- +# Copyright (c) 2017 Red Hat Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +_supported_fs generic +_supported_os Linux +_require_test +_require_scratch_dax +_require_test_program "feature" +_require_test_program "t_mmap_dio" +_require_xfs_io_command "falloc" + +# $1 mmap read/write size +t_mmap_dio_dax() +{ + # both dax + # with O_DIRECT first + src/t_mmap_dio $SCRATCH_MNT/tf_{s,d} $1 "dio both dax" + # again with buffered IO + src/t_mmap_dio -b $SCRATCH_MNT/tf_{s,d} \ + $1 "buffered both dax" + + # from non dax to dax + src/t_mmap_dio $TEST_DIR/tf_s \ + $SCRATCH_MNT/tf_d $1 "dio nondax to dax" + src/t_mmap_dio -b $TEST_DIR/tf_s \ + $SCRATCH_MNT/tf_d $1 "buffered nondax to dax" + + # from dax to non dax + src/t_mmap_dio $SCRATCH_MNT/tf_s \ + $TEST_DIR/tf_d $1 "dio dax to nondax" + src/t_mmap_dio -b $SCRATCH_MNT/tf_s \ + $TEST_DIR/tf_d $1 "buffered dax to nondax" + + # both non dax + src/t_mmap_dio $TEST_DIR/tf_{s,d} $1 "dio both nondax" + src/t_mmap_dio -b $TEST_DIR/tf_{s,d} \ + $1 "buffered both nondax" +} + +do_tests() +{ + # less than page size + t_mmap_dio_dax 1024 + # page size + t_mmap_dio_dax `src/feature -s` + # bigger sizes, for PMD faults + t_mmap_dio_dax $((16 * 1024 * 1024)) + t_mmap_dio_dax $((64 * 1024 * 1024)) +} + +# make fs 2Mb aligned for PMD fault testing +if [[ $FSTYP =~ ext ]] ; then + _scratch_mkfs "-E stride=512,stripe_width=1" \ + > /dev/null 2>&1 +elif [[ $FSTYP =~ xfs ]] ; then + _scratch_mkfs "-d su=2m,sw=1" > /dev/null 2>&1 +fi + +# mount SCRATCH_DEV with dax option, TEST_DEV not +export MOUNT_OPTIONS="" +export TEST_FS_MOUNT_OPTS="" +_test_cycle_mount +_fs_options $TEST_DEV | grep -qw "dax" && \ + _notrun "we need $TEST_DEV mount without dax" +_scratch_mount "-o dax" + +tsize=$((64 * 1024 * 1024)) + +$XFS_IO_PROG -f -c "falloc 0 $tsize" \ + $SCRATCH_MNT/tf_s >> $seqres.full 2>&1 +$XFS_IO_PROG -f -c "falloc 0 $tsize" \ + $SCRATCH_MNT/tf_d >> $seqres.full 2>&1 +$XFS_IO_PROG -f -c "falloc 0 $tsize" \ + $TEST_DIR/tf_s >> $seqres.full 2>&1 +$XFS_IO_PROG -f -c "falloc 0 $tsize" \ + $TEST_DIR/tf_d >> $seqres.full 2>&1 + +do_tests + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/generic/407.out b/tests/generic/407.out new file mode 100644 index 0000000..d05a416 --- /dev/null +++ b/tests/generic/407.out @@ -0,0 +1,2 @@ +QA output created by 407 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 159d691..027a238 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -409,3 +409,4 @@ 404 auto quick insert 405 auto mkfs 406 auto quick dangerous +407 auto quick