diff mbox

[v5,2/2] generic: test mmap io through DAX and non-DAX

Message ID 1486275704-18917-3-git-send-email-xzhou@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Murphy Zhou Feb. 5, 2017, 6:21 a.m. UTC
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>
Signed-off-by: Xiong Zhou <xzhou@redhat.com>
---
 tests/generic/407     | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generic/407.out |   2 +
 tests/generic/group   |   1 +
 3 files changed, 128 insertions(+)
 create mode 100755 tests/generic/407
 create mode 100644 tests/generic/407.out

Comments

Ross Zwisler Feb. 6, 2017, 7:17 p.m. UTC | #1
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>
Murphy Zhou Feb. 8, 2017, 4:11 a.m. UTC | #2
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 mbox

Patch

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