2019-03-07 17:58:38 +03:00
|
|
|
#!/usr/bin/env bash
|
2021-01-16 16:44:19 +03:00
|
|
|
# group: rw quick
|
2014-01-14 18:37:03 +04:00
|
|
|
#
|
|
|
|
# Test concurrent pread/pwrite
|
|
|
|
#
|
|
|
|
# Copyright (C) 2014 Red Hat, Inc.
|
|
|
|
#
|
|
|
|
# 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; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
|
|
|
# creator
|
|
|
|
owner=kwolf@redhat.com
|
|
|
|
|
|
|
|
seq=`basename $0`
|
|
|
|
echo "QA output created by $seq"
|
|
|
|
|
|
|
|
status=1 # failure is the default!
|
|
|
|
|
|
|
|
_cleanup()
|
|
|
|
{
|
|
|
|
_cleanup_test_img
|
|
|
|
}
|
|
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
|
|
|
|
# get standard environment, filters and checks
|
|
|
|
. ./common.rc
|
|
|
|
. ./common.filter
|
|
|
|
|
2014-01-30 15:52:47 +04:00
|
|
|
_supported_fmt raw
|
2014-01-14 18:37:03 +04:00
|
|
|
_supported_proto generic
|
|
|
|
_supported_os Linux
|
|
|
|
|
|
|
|
CLUSTER_SIZE=4k
|
|
|
|
size=128M
|
|
|
|
|
|
|
|
_make_test_img $size
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "== Some concurrent requests involving RMW =="
|
|
|
|
|
2018-11-17 00:50:02 +03:00
|
|
|
test_io()
|
2014-01-14 18:37:03 +04:00
|
|
|
{
|
2014-11-20 18:27:07 +03:00
|
|
|
echo "open -o driver=$IMGFMT,file.align=4k blkdebug::$TEST_IMG"
|
2014-01-14 18:37:03 +04:00
|
|
|
# A simple RMW request
|
|
|
|
cat <<EOF
|
|
|
|
aio_write -P 10 0x200 0x200
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Sequential RMW requests on the same physical sector
|
|
|
|
off=0x1000
|
2016-05-30 14:31:13 +03:00
|
|
|
for ev in "head" "after_head"; do
|
2014-01-14 18:37:03 +04:00
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_$ev A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 $((off + 0x200)) 0x200
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 $((off + 0x400)) 0x200
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
off=$((off + 0x1000))
|
|
|
|
done
|
|
|
|
|
|
|
|
# Chained dependencies
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0x5000 0x200
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 0x5200 0x200
|
|
|
|
aio_write -P 12 0x5400 0x200
|
|
|
|
aio_write -P 13 0x5600 0x200
|
|
|
|
aio_write -P 14 0x5800 0x200
|
|
|
|
aio_write -P 15 0x5a00 0x200
|
|
|
|
aio_write -P 16 0x5c00 0x200
|
|
|
|
aio_write -P 17 0x5e00 0x200
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Overlapping multiple requests
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0x6000 0x200
|
|
|
|
wait_break A
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_head B
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0x7e00 0x200
|
|
|
|
wait_break B
|
|
|
|
aio_write -P 11 0x6800 0x1000
|
|
|
|
resume A
|
|
|
|
sleep 100
|
|
|
|
resume B
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0x8000 0x200
|
|
|
|
wait_break A
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_head B
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0x9e00 0x200
|
|
|
|
wait_break B
|
|
|
|
aio_write -P 11 0x8800 0x1000
|
|
|
|
resume B
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0xa000 0x200
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 0xa800 0x1000
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_head B
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0xbe00 0x200
|
|
|
|
wait_break B
|
|
|
|
resume A
|
|
|
|
sleep 100
|
|
|
|
resume B
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0xc000 0x200
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 0xc800 0x1000
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_head B
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0xde00 0x200
|
|
|
|
wait_break B
|
|
|
|
resume B
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Only RMW for the tail part
|
|
|
|
cat <<EOF
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail A
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 10 0xe000 0x1800
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 0xf000 0xc00
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat <<EOF
|
|
|
|
break pwritev A
|
|
|
|
aio_write -P 10 0x10000 0x800
|
|
|
|
wait_break A
|
blkdebug: Avoid '.' in enum values
Our qapi conventions document that '.' should only be used in
the prefix of downstream names. BlkdebugEvent was a lone
exception to this. Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable. It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.
Done with:
$ for str in \
l1_grow.{alloc,write,activate}_table \
l2_alloc.{cow_read,write} \
refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
pwritev_rmw.{head,after_head,tail,after_tail}; do
str1=$(echo "$str" | sed 's/\./\\./')
str2=$(echo "$str" | sed 's/\./_/')
git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
done
followed by a manual touchup to test 77 to keep the test working.
Reported-by: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2015-11-18 11:52:55 +03:00
|
|
|
break pwritev_rmw_after_tail B
|
2014-01-14 18:37:03 +04:00
|
|
|
aio_write -P 11 0x10000 0x400
|
|
|
|
break pwritev_done C
|
|
|
|
resume A
|
|
|
|
wait_break C
|
|
|
|
resume C
|
|
|
|
sleep 100
|
|
|
|
wait_break B
|
|
|
|
resume B
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat <<EOF
|
|
|
|
break pwritev A
|
|
|
|
aio_write -P 10 0x11000 0x800
|
|
|
|
wait_break A
|
|
|
|
aio_write -P 11 0x11000 0x1000
|
|
|
|
sleep 100
|
|
|
|
resume A
|
|
|
|
aio_flush
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
test_io | $QEMU_IO | _filter_qemu_io | \
|
|
|
|
sed -e 's,[0-9/]* bytes at offset [0-9]*,XXX/XXX bytes at offset XXX,g' \
|
|
|
|
-e 's/^[0-9]* \(bytes\|KiB\)/XXX bytes/' \
|
iotests: 077: Filter out 'resume' lines
In the "Overlapping multiple requests" cases, the 3rd reqs (the break
point B) doesn't wait for the 2nd, and once resumed the I/O will just
continue. This is because the 2nd is already waiting for the 1st, and
in wait_serialising_requests() there is:
/* If the request is already (indirectly) waiting for us, or
* will wait for us as soon as it wakes up, then just go on
* (instead of producing a deadlock in the former case). */
if (!req->waiting_for) {
/* actually break */
...
}
Consequently, the following "sleep 100; resume A" command races with the
completion of that request, and sometimes results in an unexpected
order of output:
> @@ -56,9 +56,9 @@
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> blkdebug: Resuming request 'B'
> +blkdebug: Resuming request 'A'
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -blkdebug: Resuming request 'A'
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> wrote XXX/XXX bytes at offset XXX
Filter out the "Resuming request" lines to make the output
deterministic.
Reported-by: Patchew <no-reply@patchew.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 20171113150026.4743-1-famz@redhat.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
2017-11-13 18:00:26 +03:00
|
|
|
-e '/Suspended/d' \
|
|
|
|
-e '/blkdebug: Resuming request/d'
|
2014-01-14 18:37:03 +04:00
|
|
|
|
|
|
|
echo
|
|
|
|
echo "== Verify image content =="
|
|
|
|
|
2018-11-17 00:50:02 +03:00
|
|
|
verify_io()
|
2014-01-14 18:37:03 +04:00
|
|
|
{
|
|
|
|
# A simple RMW request
|
|
|
|
echo read -P 0 0 0x200
|
|
|
|
echo read -P 10 0x200 0x200
|
|
|
|
echo read -P 0 0x400 0xc00
|
|
|
|
|
|
|
|
# Sequential RMW requests on the same physical sector
|
|
|
|
echo read -P 0 0x1000 0x200
|
|
|
|
echo read -P 10 0x1200 0x200
|
|
|
|
echo read -P 11 0x1400 0x200
|
|
|
|
echo read -P 0 0x1600 0xa00
|
|
|
|
|
|
|
|
echo read -P 0 0x2000 0x200
|
|
|
|
echo read -P 10 0x2200 0x200
|
|
|
|
echo read -P 11 0x2400 0x200
|
|
|
|
echo read -P 0 0x2600 0xa00
|
|
|
|
|
|
|
|
# Chained dependencies
|
|
|
|
echo read -P 10 0x5000 0x200
|
|
|
|
echo read -P 11 0x5200 0x200
|
|
|
|
echo read -P 12 0x5400 0x200
|
|
|
|
echo read -P 13 0x5600 0x200
|
|
|
|
echo read -P 14 0x5800 0x200
|
|
|
|
echo read -P 15 0x5a00 0x200
|
|
|
|
echo read -P 16 0x5c00 0x200
|
|
|
|
echo read -P 17 0x5e00 0x200
|
|
|
|
|
|
|
|
# Overlapping multiple requests
|
|
|
|
echo read -P 10 0x6000 0x200
|
|
|
|
echo read -P 0 0x6200 0x600
|
|
|
|
echo read -P 11 0x6800 0x1000
|
|
|
|
echo read -P 0 0x7800 0x600
|
|
|
|
echo read -P 10 0x7e00 0x200
|
|
|
|
|
|
|
|
echo read -P 10 0x8000 0x200
|
|
|
|
echo read -P 0 0x8200 0x600
|
|
|
|
echo read -P 11 0x8800 0x1000
|
|
|
|
echo read -P 0 0x9800 0x600
|
|
|
|
echo read -P 10 0x9e00 0x200
|
|
|
|
|
|
|
|
echo read -P 10 0xa000 0x200
|
|
|
|
echo read -P 0 0xa200 0x600
|
|
|
|
echo read -P 11 0xa800 0x1000
|
|
|
|
echo read -P 0 0xb800 0x600
|
|
|
|
echo read -P 10 0xbe00 0x200
|
|
|
|
|
|
|
|
echo read -P 10 0xc000 0x200
|
|
|
|
echo read -P 0 0xc200 0x600
|
|
|
|
echo read -P 11 0xc800 0x1000
|
|
|
|
echo read -P 0 0xd800 0x600
|
|
|
|
echo read -P 10 0xde00 0x200
|
|
|
|
|
|
|
|
# Only RMW for the tail part
|
|
|
|
echo read -P 10 0xe000 0x1000
|
|
|
|
echo read -P 11 0xf800 0x400
|
|
|
|
echo read -P 0 0xfc00 0x400
|
|
|
|
|
|
|
|
echo read -P 11 0x10000 0x400
|
|
|
|
echo read -P 10 0x10400 0x400
|
|
|
|
|
|
|
|
echo read -P 11 0x11800 0x800
|
|
|
|
}
|
|
|
|
|
|
|
|
verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
_check_test_img
|
|
|
|
|
|
|
|
# success, all done
|
|
|
|
echo "*** done"
|
|
|
|
rm -f $seq.full
|
|
|
|
status=0
|