1#!/bin/bash 2# 3# Test concurrent pread/pwrite 4# 5# Copyright (C) 2014 Red Hat, Inc. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. 19# 20 21# creator 22owner=kwolf@redhat.com 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27here=`pwd` 28status=1 # failure is the default! 29 30_cleanup() 31{ 32 _cleanup_test_img 33} 34trap "_cleanup; exit \$status" 0 1 2 3 15 35 36# get standard environment, filters and checks 37. ./common.rc 38. ./common.filter 39 40_supported_fmt raw 41_supported_proto generic 42_supported_os Linux 43 44CLUSTER_SIZE=4k 45size=128M 46 47_make_test_img $size 48 49echo 50echo "== Some concurrent requests involving RMW ==" 51 52function test_io() 53{ 54echo "open -o driver=$IMGFMT,file.align=4k blkdebug::$TEST_IMG" 55# A simple RMW request 56cat <<EOF 57aio_write -P 10 0x200 0x200 58aio_flush 59EOF 60 61# Sequential RMW requests on the same physical sector 62off=0x1000 63for ev in "head" "after_head"; do 64cat <<EOF 65break pwritev_rmw_$ev A 66aio_write -P 10 $((off + 0x200)) 0x200 67wait_break A 68aio_write -P 11 $((off + 0x400)) 0x200 69sleep 100 70resume A 71aio_flush 72EOF 73off=$((off + 0x1000)) 74done 75 76# Chained dependencies 77cat <<EOF 78break pwritev_rmw_after_tail A 79aio_write -P 10 0x5000 0x200 80wait_break A 81aio_write -P 11 0x5200 0x200 82aio_write -P 12 0x5400 0x200 83aio_write -P 13 0x5600 0x200 84aio_write -P 14 0x5800 0x200 85aio_write -P 15 0x5a00 0x200 86aio_write -P 16 0x5c00 0x200 87aio_write -P 17 0x5e00 0x200 88sleep 100 89resume A 90aio_flush 91EOF 92 93# Overlapping multiple requests 94cat <<EOF 95break pwritev_rmw_after_tail A 96aio_write -P 10 0x6000 0x200 97wait_break A 98break pwritev_rmw_after_head B 99aio_write -P 10 0x7e00 0x200 100wait_break B 101aio_write -P 11 0x6800 0x1000 102resume A 103sleep 100 104resume B 105aio_flush 106EOF 107 108cat <<EOF 109break pwritev_rmw_after_tail A 110aio_write -P 10 0x8000 0x200 111wait_break A 112break pwritev_rmw_after_head B 113aio_write -P 10 0x9e00 0x200 114wait_break B 115aio_write -P 11 0x8800 0x1000 116resume B 117sleep 100 118resume A 119aio_flush 120EOF 121 122cat <<EOF 123break pwritev_rmw_after_tail A 124aio_write -P 10 0xa000 0x200 125wait_break A 126aio_write -P 11 0xa800 0x1000 127break pwritev_rmw_after_head B 128aio_write -P 10 0xbe00 0x200 129wait_break B 130resume A 131sleep 100 132resume B 133aio_flush 134EOF 135 136cat <<EOF 137break pwritev_rmw_after_tail A 138aio_write -P 10 0xc000 0x200 139wait_break A 140aio_write -P 11 0xc800 0x1000 141break pwritev_rmw_after_head B 142aio_write -P 10 0xde00 0x200 143wait_break B 144resume B 145sleep 100 146resume A 147aio_flush 148EOF 149 150# Only RMW for the tail part 151cat <<EOF 152break pwritev_rmw_after_tail A 153aio_write -P 10 0xe000 0x1800 154wait_break A 155aio_write -P 11 0xf000 0xc00 156sleep 100 157resume A 158aio_flush 159EOF 160 161cat <<EOF 162break pwritev A 163aio_write -P 10 0x10000 0x800 164wait_break A 165break pwritev_rmw_after_tail B 166aio_write -P 11 0x10000 0x400 167break pwritev_done C 168resume A 169wait_break C 170resume C 171sleep 100 172wait_break B 173resume B 174aio_flush 175EOF 176 177cat <<EOF 178break pwritev A 179aio_write -P 10 0x11000 0x800 180wait_break A 181aio_write -P 11 0x11000 0x1000 182sleep 100 183resume A 184aio_flush 185EOF 186} 187 188test_io | $QEMU_IO | _filter_qemu_io | \ 189 sed -e 's,[0-9/]* bytes at offset [0-9]*,XXX/XXX bytes at offset XXX,g' \ 190 -e 's/^[0-9]* \(bytes\|KiB\)/XXX bytes/' \ 191 -e '/Suspended/d' \ 192 -e '/blkdebug: Resuming request/d' 193 194echo 195echo "== Verify image content ==" 196 197function verify_io() 198{ 199 # A simple RMW request 200 echo read -P 0 0 0x200 201 echo read -P 10 0x200 0x200 202 echo read -P 0 0x400 0xc00 203 204 # Sequential RMW requests on the same physical sector 205 echo read -P 0 0x1000 0x200 206 echo read -P 10 0x1200 0x200 207 echo read -P 11 0x1400 0x200 208 echo read -P 0 0x1600 0xa00 209 210 echo read -P 0 0x2000 0x200 211 echo read -P 10 0x2200 0x200 212 echo read -P 11 0x2400 0x200 213 echo read -P 0 0x2600 0xa00 214 215 # Chained dependencies 216 echo read -P 10 0x5000 0x200 217 echo read -P 11 0x5200 0x200 218 echo read -P 12 0x5400 0x200 219 echo read -P 13 0x5600 0x200 220 echo read -P 14 0x5800 0x200 221 echo read -P 15 0x5a00 0x200 222 echo read -P 16 0x5c00 0x200 223 echo read -P 17 0x5e00 0x200 224 225 # Overlapping multiple requests 226 echo read -P 10 0x6000 0x200 227 echo read -P 0 0x6200 0x600 228 echo read -P 11 0x6800 0x1000 229 echo read -P 0 0x7800 0x600 230 echo read -P 10 0x7e00 0x200 231 232 echo read -P 10 0x8000 0x200 233 echo read -P 0 0x8200 0x600 234 echo read -P 11 0x8800 0x1000 235 echo read -P 0 0x9800 0x600 236 echo read -P 10 0x9e00 0x200 237 238 echo read -P 10 0xa000 0x200 239 echo read -P 0 0xa200 0x600 240 echo read -P 11 0xa800 0x1000 241 echo read -P 0 0xb800 0x600 242 echo read -P 10 0xbe00 0x200 243 244 echo read -P 10 0xc000 0x200 245 echo read -P 0 0xc200 0x600 246 echo read -P 11 0xc800 0x1000 247 echo read -P 0 0xd800 0x600 248 echo read -P 10 0xde00 0x200 249 250 # Only RMW for the tail part 251 echo read -P 10 0xe000 0x1000 252 echo read -P 11 0xf800 0x400 253 echo read -P 0 0xfc00 0x400 254 255 echo read -P 11 0x10000 0x400 256 echo read -P 10 0x10400 0x400 257 258 echo read -P 11 0x11800 0x800 259} 260 261verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io 262 263_check_test_img 264 265# success, all done 266echo "*** done" 267rm -f $seq.full 268status=0 269