Stefan Hajnoczi | 908eaf6 | 2010-04-26 11:44:05 +0200 | [diff] [blame] | 1 | #!/bin/bash |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 2 | # |
| 3 | # Copyright (C) 2009 Red Hat, Inc. |
| 4 | # |
| 5 | # This program is free software; you can redistribute it and/or modify |
| 6 | # it under the terms of the GNU General Public License as published by |
| 7 | # the Free Software Foundation; either version 2 of the License, or |
| 8 | # (at your option) any later version. |
| 9 | # |
| 10 | # This program is distributed in the hope that it will be useful, |
| 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | # GNU General Public License for more details. |
| 14 | # |
| 15 | # You should have received a copy of the GNU General Public License |
Christoph Hellwig | e8c212d | 2009-07-16 19:26:54 +0200 | [diff] [blame] | 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 17 | # |
| 18 | |
Kevin Wolf | 9128ae5 | 2009-07-16 19:11:09 +0200 | [diff] [blame] | 19 | function do_is_allocated() { |
| 20 | local start=$1 |
| 21 | local size=$(( $2 / 512)) |
| 22 | local step=$3 |
| 23 | local count=$4 |
| 24 | |
| 25 | for i in `seq 1 $count`; do |
Stefan Hajnoczi | dd0c35d | 2011-02-04 12:55:02 +0000 | [diff] [blame] | 26 | echo alloc $(( start + (i - 1) * step )) $size |
Kevin Wolf | 9128ae5 | 2009-07-16 19:11:09 +0200 | [diff] [blame] | 27 | done |
| 28 | } |
| 29 | |
| 30 | function is_allocated() { |
Jeff Cody | 0084043 | 2013-10-31 11:57:36 -0400 | [diff] [blame] | 31 | do_is_allocated "$@" | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
Kevin Wolf | 9128ae5 | 2009-07-16 19:11:09 +0200 | [diff] [blame] | 32 | } |
| 33 | |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 34 | function do_io() { |
| 35 | local op=$1 |
| 36 | local start=$2 |
| 37 | local size=$3 |
| 38 | local step=$4 |
| 39 | local count=$5 |
| 40 | local pattern=$6 |
| 41 | |
| 42 | echo === IO: pattern $pattern >&2 |
| 43 | for i in `seq 1 $count`; do |
Stefan Hajnoczi | dd0c35d | 2011-02-04 12:55:02 +0000 | [diff] [blame] | 44 | echo $op -P $pattern $(( start + (i - 1) * step )) $size |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 45 | done |
| 46 | } |
| 47 | |
| 48 | function io_pattern() { |
Jeff Cody | 0084043 | 2013-10-31 11:57:36 -0400 | [diff] [blame] | 49 | do_io "$@" | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | function io() { |
| 53 | local start=$2 |
| 54 | local pattern=$(( (start >> 9) % 256 )) |
| 55 | |
Jeff Cody | 0084043 | 2013-10-31 11:57:36 -0400 | [diff] [blame] | 56 | do_io "$@" $pattern | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 57 | } |
| 58 | |
| 59 | function io_zero() { |
Jeff Cody | 0084043 | 2013-10-31 11:57:36 -0400 | [diff] [blame] | 60 | do_io "$@" 0 | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | function io_test() { |
| 64 | local op=$1 |
| 65 | local offset=$2 |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 66 | local cluster_size=$3 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 67 | |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 68 | local num_large=$4 |
| 69 | local num_medium=$((num_large * num_large)) |
| 70 | local num_small=$((4 * num_medium)) |
| 71 | |
| 72 | local half_cluster=$((cluster_size / 2)) |
| 73 | local quarter_cluster=$((cluster_size / 4)) |
| 74 | local l2_size=$((cluster_size * cluster_size / 8)) |
| 75 | |
| 76 | # Complete clusters |
| 77 | io "$op" $offset $cluster_size $cluster_size $num_small |
| 78 | offset=$((offset + num_small * $cluster_size)) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 79 | |
| 80 | # From somewhere in the middle to the end of a cluster |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 81 | io "$op" $((offset + $half_cluster)) $half_cluster $cluster_size $num_small |
| 82 | offset=$((offset + num_small * $cluster_size)) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 83 | |
| 84 | # From the start to somewhere in the middle of a cluster |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 85 | io "$op" $offset $half_cluster $cluster_size $num_small |
| 86 | offset=$((offset + num_small * $cluster_size)) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 87 | |
| 88 | # Completely misaligned (and small) |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 89 | io "$op" $((offset + $quarter_cluster)) $half_cluster $cluster_size $num_small |
| 90 | offset=$((offset + num_small * $cluster_size)) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 91 | |
| 92 | # Spanning multiple clusters |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 93 | io "$op" $((offset + $half_cluster)) $((cluster_size * 2)) $((cluster_size * 3)) $num_medium |
| 94 | offset=$((offset + num_medium * 3 * $cluster_size)) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 95 | |
| 96 | # Spanning multiple L2 tables |
| 97 | # L2 table size: 512 clusters of 4k = 2M |
Kevin Wolf | ac5e2b2 | 2009-10-01 14:30:19 -0300 | [diff] [blame] | 98 | offset=$(( ((offset + l2_size - 1) & ~(l2_size - 1)) - (3 * half_cluster) )) |
| 99 | io "$op" $offset $((6 * half_cluster)) $(( l2_size + half_cluster )) $num_large |
| 100 | offset=$((offset + num_large * ( l2_size + half_cluster ))) |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | function io_test2() { |
| 104 | local orig_offset=$1 |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 105 | local cluster_size=$2 |
| 106 | local num=$3 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 107 | |
| 108 | # Pattern (repeat after 9 clusters): |
Kevin Wolf | 79e40ab | 2013-09-04 13:16:04 +0200 | [diff] [blame] | 109 | # used - used - free - used - compressed - compressed - |
| 110 | # free - free - compressed |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 111 | |
| 112 | # Write the clusters to be compressed |
| 113 | echo === Clusters to be compressed [1] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 114 | io_pattern writev $((offset + 4 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 115 | echo === Clusters to be compressed [2] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 116 | io_pattern writev $((offset + 5 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 117 | echo === Clusters to be compressed [3] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 118 | io_pattern writev $((offset + 8 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 119 | |
Jeff Cody | 0084043 | 2013-10-31 11:57:36 -0400 | [diff] [blame] | 120 | mv "$TEST_IMG" "$TEST_IMG.orig" |
| 121 | $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -c "$TEST_IMG.orig" "$TEST_IMG" |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 122 | |
| 123 | # Write the used clusters |
| 124 | echo === Used clusters [1] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 125 | io_pattern writev $((offset + 0 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 126 | echo === Used clusters [2] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 127 | io_pattern writev $((offset + 1 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 128 | echo === Used clusters [3] |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 129 | io_pattern writev $((offset + 3 * $cluster_size)) $cluster_size $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 130 | |
| 131 | # Read them |
| 132 | echo === Read used/compressed clusters |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 133 | io_pattern readv $((offset + 0 * $cluster_size)) $((2 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
| 134 | io_pattern readv $((offset + 3 * $cluster_size)) $((3 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
| 135 | io_pattern readv $((offset + 8 * $cluster_size)) $((1 * $cluster_size)) $((9 * $cluster_size)) $num 165 |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 136 | |
| 137 | echo === Read zeros |
Kevin Wolf | 8fc1024 | 2009-10-01 14:29:59 -0300 | [diff] [blame] | 138 | io_zero readv $((offset + 2 * $cluster_size)) $((1 * $cluster_size)) $((9 * $cluster_size)) $num |
| 139 | io_zero readv $((offset + 6 * $cluster_size)) $((2 * $cluster_size)) $((9 * $cluster_size)) $num |
Christoph Hellwig | 6bf19c9 | 2009-06-22 18:29:05 +0200 | [diff] [blame] | 140 | } |