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