qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

iotests: test bitmap moving inside 254

Test persistent bitmap copying with and without removal of original
bitmap.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 20190708220502.12977-4-jsnow@redhat.com
[Edited comment "bitmap1" --> "bitmap2" as per review. --js]
Signed-off-by: John Snow <jsnow@redhat.com>

authored by

Vladimir Sementsov-Ogievskiy and committed by
John Snow
3f7b2fa8 c4e4b0fa

+110 -2
+28 -2
tests/qemu-iotests/254
··· 1 1 #!/usr/bin/env python 2 2 # 3 - # Test external snapshot with bitmap copying. 3 + # Test external snapshot with bitmap copying and moving. 4 4 # 5 5 # Copyright (c) 2019 Virtuozzo International GmbH. All rights reserved. 6 6 # ··· 32 32 vm.launch() 33 33 34 34 vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap0') 35 + vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap1', 36 + persistent=True) 37 + vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap2', 38 + persistent=True) 35 39 36 40 vm.hmp_qemu_io('drive0', 'write 0 512K') 37 41 ··· 39 43 {'type': 'blockdev-snapshot-sync', 40 44 'data': {'device': 'drive0', 'snapshot-file': top, 41 45 'snapshot-node-name': 'snap'}}, 46 + 47 + # copy non-persistent bitmap0 42 48 {'type': 'block-dirty-bitmap-add', 43 49 'data': {'node': 'snap', 'name': 'bitmap0'}}, 44 50 {'type': 'block-dirty-bitmap-merge', 45 51 'data': {'node': 'snap', 'target': 'bitmap0', 46 - 'bitmaps': [{'node': 'base', 'name': 'bitmap0'}]}} 52 + 'bitmaps': [{'node': 'base', 'name': 'bitmap0'}]}}, 53 + 54 + # copy persistent bitmap1, original will be saved to base image 55 + {'type': 'block-dirty-bitmap-add', 56 + 'data': {'node': 'snap', 'name': 'bitmap1', 'persistent': True}}, 57 + {'type': 'block-dirty-bitmap-merge', 58 + 'data': {'node': 'snap', 'target': 'bitmap1', 59 + 'bitmaps': [{'node': 'base', 'name': 'bitmap1'}]}}, 60 + 61 + # move persistent bitmap2, original will be removed and not saved 62 + # to base image 63 + {'type': 'block-dirty-bitmap-add', 64 + 'data': {'node': 'snap', 'name': 'bitmap2', 'persistent': True}}, 65 + {'type': 'block-dirty-bitmap-merge', 66 + 'data': {'node': 'snap', 'target': 'bitmap2', 67 + 'bitmaps': [{'node': 'base', 'name': 'bitmap2'}]}}, 68 + {'type': 'block-dirty-bitmap-remove', 69 + 'data': {'node': 'base', 'name': 'bitmap2'}} 47 70 ], filters=[iotests.filter_qmp_testfiles]) 48 71 49 72 result = vm.qmp('query-block')['return'][0] 50 73 log("query-block: device = {}, node-name = {}, dirty-bitmaps:".format( 51 74 result['device'], result['inserted']['node-name'])) 52 75 log(result['dirty-bitmaps'], indent=2) 76 + log("\nbitmaps in backing image:") 77 + log(result['inserted']['image']['backing-image']['format-specific'] \ 78 + ['data']['bitmaps'], indent=2) 53 79 54 80 vm.shutdown()
+82
tests/qemu-iotests/254.out
··· 1 1 {"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap0", "node": "drive0"}} 2 2 {"return": {}} 3 + {"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap1", "node": "drive0", "persistent": true}} 4 + {"return": {}} 5 + {"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap2", "node": "drive0", "persistent": true}} 6 + {"return": {}} 3 7 { 4 8 "execute": "transaction", 5 9 "arguments": { ··· 31 35 "target": "bitmap0" 32 36 }, 33 37 "type": "block-dirty-bitmap-merge" 38 + }, 39 + { 40 + "data": { 41 + "name": "bitmap1", 42 + "node": "snap", 43 + "persistent": true 44 + }, 45 + "type": "block-dirty-bitmap-add" 46 + }, 47 + { 48 + "data": { 49 + "bitmaps": [ 50 + { 51 + "name": "bitmap1", 52 + "node": "base" 53 + } 54 + ], 55 + "node": "snap", 56 + "target": "bitmap1" 57 + }, 58 + "type": "block-dirty-bitmap-merge" 59 + }, 60 + { 61 + "data": { 62 + "name": "bitmap2", 63 + "node": "snap", 64 + "persistent": true 65 + }, 66 + "type": "block-dirty-bitmap-add" 67 + }, 68 + { 69 + "data": { 70 + "bitmaps": [ 71 + { 72 + "name": "bitmap2", 73 + "node": "base" 74 + } 75 + ], 76 + "node": "snap", 77 + "target": "bitmap2" 78 + }, 79 + "type": "block-dirty-bitmap-merge" 80 + }, 81 + { 82 + "data": { 83 + "name": "bitmap2", 84 + "node": "base" 85 + }, 86 + "type": "block-dirty-bitmap-remove" 34 87 } 35 88 ] 36 89 } ··· 44 97 "busy": false, 45 98 "count": 524288, 46 99 "granularity": 65536, 100 + "name": "bitmap2", 101 + "persistent": true, 102 + "recording": true, 103 + "status": "active" 104 + }, 105 + { 106 + "busy": false, 107 + "count": 524288, 108 + "granularity": 65536, 109 + "name": "bitmap1", 110 + "persistent": true, 111 + "recording": true, 112 + "status": "active" 113 + }, 114 + { 115 + "busy": false, 116 + "count": 524288, 117 + "granularity": 65536, 47 118 "name": "bitmap0", 48 119 "persistent": false, 49 120 "recording": true, 50 121 "status": "active" 51 122 } 52 123 ] 124 + 125 + bitmaps in backing image: 126 + [ 127 + { 128 + "flags": [ 129 + "auto" 130 + ], 131 + "granularity": 65536, 132 + "name": "bitmap1" 133 + } 134 + ]