diff mbox series

blktests: add userspace IO test

Message ID 20190304081501.3068-1-ming.lei@redhat.com (mailing list archive)
State New, archived
Headers show
Series blktests: add userspace IO test | expand

Commit Message

Ming Lei March 4, 2019, 8:15 a.m. UTC
Add one test to cover changes on block passthrough IO interface,
such as blk_rq_map_user(), blk_rq_map_user_iov(), blk_rq_unmap_user()
and blk_rq_map_kern().

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 tests/block/029     | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/block/029.out |   5 +++
 2 files changed, 116 insertions(+)
 create mode 100755 tests/block/029
 create mode 100644 tests/block/029.out

Comments

Omar Sandoval March 4, 2019, 10:54 p.m. UTC | #1
On Mon, Mar 04, 2019 at 04:15:01PM +0800, Ming Lei wrote:
> Add one test to cover changes on block passthrough IO interface,
> such as blk_rq_map_user(), blk_rq_map_user_iov(), blk_rq_unmap_user()
> and blk_rq_map_kern().
> 
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
>  tests/block/029     | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/block/029.out |   5 +++
>  2 files changed, 116 insertions(+)
>  create mode 100755 tests/block/029
>  create mode 100644 tests/block/029.out
> 
> diff --git a/tests/block/029 b/tests/block/029
> new file mode 100755
> index 000000000000..89d2de70833a
> --- /dev/null
> +++ b/tests/block/029
> @@ -0,0 +1,111 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0+
> +# Copyright (c) 2019 Ming Lei <ming.lei@redhat.com>
> +#
> +# Test userspace IO on NVMe loop device

Is this a regression test for one of your recent patches?

> +. tests/nvme/rc
> +
> +DESCRIPTION="test userspace IO via nvme-cli read/write interface"
> +QUICK=1
> +
> +requires() {
> +	_have_program nvme && _have_modules loop nvme-loop nvmet && \
> +		_have_configfs
> +}
> +
> +__test_user_io()
> +{
> +	DISK=$1
> +	START=$2
> +	CNT=$3
> +
> +	BS=`blockdev --getss $DISK`

$() instead of `` here and everywhere else, please. Also, $DISK needs to
quoted, as do several other variables. Please run `make check`.

> +	SIZE=$(($CNT * $BS))
> +
> +	IMG=`mktemp /tmp/blk_img_XXXXXX`
> +	IMG1=`mktemp /tmp/blk_img_XXXXXX`

Please make all of these variables local and lowercase.

> +	dd if=/dev/urandom of=$IMG bs=$BS count=$CNT status=none
> +
> +	let CNT--

$((CNT--))

> +	nvme write --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG $DISK
> +	[ $? -ne 0 ] && return -1
> +	nvme read --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG1 $DISK
> +	[ $? -ne 0 ] && return -1
> +
> +	diff -q -u $IMG $IMG1
> +	RES=$?
> +
> +	rm -f $IMG $IMG1
> +	return $RES
> +}
> +
> +test_user_io()
> +{
> +	DEV=$1
> +
> +	__test_user_io $DEV 1 512  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +
> +	__test_user_io $DEV 1 511  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +
> +	__test_user_io $DEV 1 513  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +
> +	__test_user_io $DEV 511 1024  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +
> +	__test_user_io $DEV 511 1023  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +
> +	__test_user_io $DEV 511 1025  > /dev/null 2>&1
> +	[ -$? -ne 0 ] && echo "FAIL"
> +}
> +
> +test() {
> +	echo "Running ${TEST_NAME}"
> +
> +	modprobe nvmet
> +	modprobe nvme-loop
> +
> +	local port
> +	local nvmedev
> +	local loop_dev
> +	local file_path="$TMPDIR/img"
> +	local subsys_name="blktests-subsystem-1"
> +
> +	truncate -s 1G "${file_path}"
> +
> +	loop_dev="$(losetup -f --show "${file_path}")"
> +
> +	_create_nvmet_subsystem "${subsys_name}" "${loop_dev}" \
> +		 "91fdba0d-f87b-4c25-b80f-db7be1418b9e"
> +	port="$(_create_nvmet_port "loop")"
> +	_add_nvmet_subsys_to_port "${port}" "${subsys_name}"
> +
> +	nvme connect -t loop -n "${subsys_name}"
> +
> +	nvmedev="$(_find_nvme_loop_dev)"
> +	cat "/sys/block/${nvmedev}n1/uuid"
> +	cat "/sys/block/${nvmedev}n1/wwid"
> +
> +	test_user_io "/dev/${nvmedev}n1"
> +
> +	nvme disconnect -n "${subsys_name}"

We just changed the other nvme tests to redirect the output of
disconnect like so:

	nvme disconnect -n "${subsys_name}" >> "$FULL" 2>&1

Let's do that for this one, too.

Thanks for the test!
Ming Lei March 5, 2019, 1:53 a.m. UTC | #2
On Mon, Mar 04, 2019 at 02:54:54PM -0800, Omar Sandoval wrote:
> On Mon, Mar 04, 2019 at 04:15:01PM +0800, Ming Lei wrote:
> > Add one test to cover changes on block passthrough IO interface,
> > such as blk_rq_map_user(), blk_rq_map_user_iov(), blk_rq_unmap_user()
> > and blk_rq_map_kern().
> > 
> > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> > ---
> >  tests/block/029     | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/block/029.out |   5 +++
> >  2 files changed, 116 insertions(+)
> >  create mode 100755 tests/block/029
> >  create mode 100644 tests/block/029.out
> > 
> > diff --git a/tests/block/029 b/tests/block/029
> > new file mode 100755
> > index 000000000000..89d2de70833a
> > --- /dev/null
> > +++ b/tests/block/029
> > @@ -0,0 +1,111 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0+
> > +# Copyright (c) 2019 Ming Lei <ming.lei@redhat.com>
> > +#
> > +# Test userspace IO on NVMe loop device
> 
> Is this a regression test for one of your recent patches?

Yeah, it is for the following patch:

	https://marc.info/?l=linux-block&m=155161907811128&w=2

Also it will serve regression test for the following(not posted yet) patch
of 'enabling multi-bvec for passthrough IO'.

> 
> > +. tests/nvme/rc
> > +
> > +DESCRIPTION="test userspace IO via nvme-cli read/write interface"
> > +QUICK=1
> > +
> > +requires() {
> > +	_have_program nvme && _have_modules loop nvme-loop nvmet && \
> > +		_have_configfs
> > +}
> > +
> > +__test_user_io()
> > +{
> > +	DISK=$1
> > +	START=$2
> > +	CNT=$3
> > +
> > +	BS=`blockdev --getss $DISK`
> 
> $() instead of `` here and everywhere else, please. Also, $DISK needs to
> quoted, as do several other variables. Please run `make check`.
> 
> > +	SIZE=$(($CNT * $BS))
> > +
> > +	IMG=`mktemp /tmp/blk_img_XXXXXX`
> > +	IMG1=`mktemp /tmp/blk_img_XXXXXX`
> 
> Please make all of these variables local and lowercase.
> 
> > +	dd if=/dev/urandom of=$IMG bs=$BS count=$CNT status=none
> > +
> > +	let CNT--
> 
> $((CNT--))
> 
> > +	nvme write --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG $DISK
> > +	[ $? -ne 0 ] && return -1
> > +	nvme read --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG1 $DISK
> > +	[ $? -ne 0 ] && return -1
> > +
> > +	diff -q -u $IMG $IMG1
> > +	RES=$?
> > +
> > +	rm -f $IMG $IMG1
> > +	return $RES
> > +}
> > +
> > +test_user_io()
> > +{
> > +	DEV=$1
> > +
> > +	__test_user_io $DEV 1 512  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +
> > +	__test_user_io $DEV 1 511  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +
> > +	__test_user_io $DEV 1 513  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +
> > +	__test_user_io $DEV 511 1024  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +
> > +	__test_user_io $DEV 511 1023  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +
> > +	__test_user_io $DEV 511 1025  > /dev/null 2>&1
> > +	[ -$? -ne 0 ] && echo "FAIL"
> > +}
> > +
> > +test() {
> > +	echo "Running ${TEST_NAME}"
> > +
> > +	modprobe nvmet
> > +	modprobe nvme-loop
> > +
> > +	local port
> > +	local nvmedev
> > +	local loop_dev
> > +	local file_path="$TMPDIR/img"
> > +	local subsys_name="blktests-subsystem-1"
> > +
> > +	truncate -s 1G "${file_path}"
> > +
> > +	loop_dev="$(losetup -f --show "${file_path}")"
> > +
> > +	_create_nvmet_subsystem "${subsys_name}" "${loop_dev}" \
> > +		 "91fdba0d-f87b-4c25-b80f-db7be1418b9e"
> > +	port="$(_create_nvmet_port "loop")"
> > +	_add_nvmet_subsys_to_port "${port}" "${subsys_name}"
> > +
> > +	nvme connect -t loop -n "${subsys_name}"
> > +
> > +	nvmedev="$(_find_nvme_loop_dev)"
> > +	cat "/sys/block/${nvmedev}n1/uuid"
> > +	cat "/sys/block/${nvmedev}n1/wwid"
> > +
> > +	test_user_io "/dev/${nvmedev}n1"
> > +
> > +	nvme disconnect -n "${subsys_name}"
> 
> We just changed the other nvme tests to redirect the output of
> disconnect like so:
> 
> 	nvme disconnect -n "${subsys_name}" >> "$FULL" 2>&1
> 
> Let's do that for this one, too.
> 
> Thanks for the test!

All have been addressed in V2.

Thanks,
Ming
diff mbox series

Patch

diff --git a/tests/block/029 b/tests/block/029
new file mode 100755
index 000000000000..89d2de70833a
--- /dev/null
+++ b/tests/block/029
@@ -0,0 +1,111 @@ 
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2019 Ming Lei <ming.lei@redhat.com>
+#
+# Test userspace IO on NVMe loop device
+
+. tests/nvme/rc
+
+DESCRIPTION="test userspace IO via nvme-cli read/write interface"
+QUICK=1
+
+requires() {
+	_have_program nvme && _have_modules loop nvme-loop nvmet && \
+		_have_configfs
+}
+
+__test_user_io()
+{
+	DISK=$1
+	START=$2
+	CNT=$3
+
+	BS=`blockdev --getss $DISK`
+	SIZE=$(($CNT * $BS))
+
+	IMG=`mktemp /tmp/blk_img_XXXXXX`
+	IMG1=`mktemp /tmp/blk_img_XXXXXX`
+
+	dd if=/dev/urandom of=$IMG bs=$BS count=$CNT status=none
+
+	let CNT--
+
+	nvme write --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG $DISK
+	[ $? -ne 0 ] && return -1
+	nvme read --start-block=$START --block-count=$CNT --data-size=$SIZE --data=$IMG1 $DISK
+	[ $? -ne 0 ] && return -1
+
+	diff -q -u $IMG $IMG1
+	RES=$?
+
+	rm -f $IMG $IMG1
+	return $RES
+}
+
+test_user_io()
+{
+	DEV=$1
+
+	__test_user_io $DEV 1 512  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+
+	__test_user_io $DEV 1 511  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+
+	__test_user_io $DEV 1 513  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+
+	__test_user_io $DEV 511 1024  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+
+	__test_user_io $DEV 511 1023  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+
+	__test_user_io $DEV 511 1025  > /dev/null 2>&1
+	[ -$? -ne 0 ] && echo "FAIL"
+}
+
+test() {
+	echo "Running ${TEST_NAME}"
+
+	modprobe nvmet
+	modprobe nvme-loop
+
+	local port
+	local nvmedev
+	local loop_dev
+	local file_path="$TMPDIR/img"
+	local subsys_name="blktests-subsystem-1"
+
+	truncate -s 1G "${file_path}"
+
+	loop_dev="$(losetup -f --show "${file_path}")"
+
+	_create_nvmet_subsystem "${subsys_name}" "${loop_dev}" \
+		 "91fdba0d-f87b-4c25-b80f-db7be1418b9e"
+	port="$(_create_nvmet_port "loop")"
+	_add_nvmet_subsys_to_port "${port}" "${subsys_name}"
+
+	nvme connect -t loop -n "${subsys_name}"
+
+	nvmedev="$(_find_nvme_loop_dev)"
+	cat "/sys/block/${nvmedev}n1/uuid"
+	cat "/sys/block/${nvmedev}n1/wwid"
+
+	test_user_io "/dev/${nvmedev}n1"
+
+	nvme disconnect -n "${subsys_name}"
+
+	_remove_nvmet_subsystem_from_port "${port}" "${subsys_name}"
+	_remove_nvmet_subsystem "${subsys_name}"
+	_remove_nvmet_port "${port}"
+
+	losetup -d "${loop_dev}"
+
+	rm "${file_path}"
+
+	modprobe -r nvme-loop
+	modprobe -r nvmet
+
+	echo "Test complete"
+}
diff --git a/tests/block/029.out b/tests/block/029.out
new file mode 100644
index 000000000000..89fc2313a723
--- /dev/null
+++ b/tests/block/029.out
@@ -0,0 +1,5 @@ 
+Running block/029
+91fdba0d-f87b-4c25-b80f-db7be1418b9e
+uuid.91fdba0d-f87b-4c25-b80f-db7be1418b9e
+NQN:blktests-subsystem-1 disconnected 1 controller(s)
+Test complete