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