* Tue Nov 12 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.1.0-14.el8
- kvm-blockdev-reduce-aio_context-locked-sections-in-bitma.patch [bz#1756413] - kvm-qapi-implement-block-dirty-bitmap-remove-transaction.patch [bz#1756413] - kvm-iotests-test-bitmap-moving-inside-254.patch [bz#1756413] - kvm-spapr-xive-skip-partially-initialized-vCPUs-in-prese.patch [bz#1754710] - kvm-nbd-Grab-aio-context-lock-in-more-places.patch [bz#1741094] - kvm-tests-Use-iothreads-during-iotest-223.patch [bz#1741094] - Resolves: bz#1741094 ([Upstream]Incremental backup: Qemu coredump when expose an active bitmap via pull mode(data plane enable)) - Resolves: bz#1754710 (qemu core dumped when hotpluging vcpus) - Resolves: bz#1756413 (backport support for transactionable block-dirty-bitmap-remove for incremental backup support)
This commit is contained in:
		
							parent
							
								
									1eb8acbee7
								
							
						
					
					
						commit
						32a3ac0fa9
					
				
							
								
								
									
										122
									
								
								kvm-blockdev-reduce-aio_context-locked-sections-in-bitma.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								kvm-blockdev-reduce-aio_context-locked-sections-in-bitma.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| From 107ad619739795199df98c56d0ad4db14fec3722 Mon Sep 17 00:00:00 2001 | ||||
| From: John Snow <jsnow@redhat.com> | ||||
| Date: Fri, 27 Sep 2019 20:18:44 +0100 | ||||
| Subject: [PATCH 1/6] blockdev: reduce aio_context locked sections in bitmap | ||||
|  add/remove | ||||
| 
 | ||||
| RH-Author: John Snow <jsnow@redhat.com> | ||||
| Message-id: <20190927201846.6823-2-jsnow@redhat.com> | ||||
| Patchwork-id: 90908 | ||||
| O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH 1/3] blockdev: reduce aio_context locked sections in bitmap add/remove | ||||
| Bugzilla: 1756413 | ||||
| RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com> | ||||
| RH-Acked-by: Max Reitz <mreitz@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| 
 | ||||
| Commit 0a6c86d024c52 returned these locks back to add/remove | ||||
| functionality, to protect from intersection of persistent bitmap | ||||
| related IO with other IO. But other bitmap-related functions called | ||||
| here are unrelated to the problem, and there are no needs to keep these | ||||
| calls inside critical sections. | ||||
| 
 | ||||
| Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| Reviewed-by: John Snow <jsnow@redhat.com> | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| Reviewed-by: Max Reitz <mreitz@redhat.com> | ||||
| Message-id: 20190708220502.12977-2-jsnow@redhat.com | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| (cherry picked from commit 2899f41eef2806cf8eb119811c9d6fcf15ce80f6) | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  blockdev.c | 30 +++++++++++++----------------- | ||||
|  1 file changed, 13 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| diff --git a/blockdev.c b/blockdev.c
 | ||||
| index 4d141e9..0124825 100644
 | ||||
| --- a/blockdev.c
 | ||||
| +++ b/blockdev.c
 | ||||
| @@ -2811,7 +2811,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
 | ||||
|  { | ||||
|      BlockDriverState *bs; | ||||
|      BdrvDirtyBitmap *bitmap; | ||||
| -    AioContext *aio_context = NULL;
 | ||||
|   | ||||
|      if (!name || name[0] == '\0') { | ||||
|          error_setg(errp, "Bitmap name cannot be empty"); | ||||
| @@ -2847,16 +2846,20 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
 | ||||
|      } | ||||
|   | ||||
|      if (persistent) { | ||||
| -        aio_context = bdrv_get_aio_context(bs);
 | ||||
| +        AioContext *aio_context = bdrv_get_aio_context(bs);
 | ||||
| +        bool ok;
 | ||||
| +
 | ||||
|          aio_context_acquire(aio_context); | ||||
| -        if (!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) {
 | ||||
| -            goto out;
 | ||||
| +        ok = bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp);
 | ||||
| +        aio_context_release(aio_context);
 | ||||
| +        if (!ok) {
 | ||||
| +            return;
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
|      bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp); | ||||
|      if (bitmap == NULL) { | ||||
| -        goto out;
 | ||||
| +        return;
 | ||||
|      } | ||||
|   | ||||
|      if (disabled) { | ||||
| @@ -2864,10 +2867,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
 | ||||
|      } | ||||
|   | ||||
|      bdrv_dirty_bitmap_set_persistence(bitmap, persistent); | ||||
| - out:
 | ||||
| -    if (aio_context) {
 | ||||
| -        aio_context_release(aio_context);
 | ||||
| -    }
 | ||||
|  } | ||||
|   | ||||
|  void qmp_block_dirty_bitmap_remove(const char *node, const char *name, | ||||
| @@ -2875,8 +2874,6 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
 | ||||
|  { | ||||
|      BlockDriverState *bs; | ||||
|      BdrvDirtyBitmap *bitmap; | ||||
| -    Error *local_err = NULL;
 | ||||
| -    AioContext *aio_context = NULL;
 | ||||
|   | ||||
|      bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp); | ||||
|      if (!bitmap || !bs) { | ||||
| @@ -2889,20 +2886,19 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
 | ||||
|      } | ||||
|   | ||||
|      if (bdrv_dirty_bitmap_get_persistence(bitmap)) { | ||||
| -        aio_context = bdrv_get_aio_context(bs);
 | ||||
| +        AioContext *aio_context = bdrv_get_aio_context(bs);
 | ||||
| +        Error *local_err = NULL;
 | ||||
| +
 | ||||
|          aio_context_acquire(aio_context); | ||||
|          bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err); | ||||
| +        aio_context_release(aio_context);
 | ||||
|          if (local_err != NULL) { | ||||
|              error_propagate(errp, local_err); | ||||
| -            goto out;
 | ||||
| +            return;
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
|      bdrv_release_dirty_bitmap(bs, bitmap); | ||||
| - out:
 | ||||
| -    if (aio_context) {
 | ||||
| -        aio_context_release(aio_context);
 | ||||
| -    }
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										209
									
								
								kvm-iotests-test-bitmap-moving-inside-254.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								kvm-iotests-test-bitmap-moving-inside-254.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,209 @@ | ||||
| From b15fa18e724e356bd889f0566d512daedb9a09dc Mon Sep 17 00:00:00 2001 | ||||
| From: John Snow <jsnow@redhat.com> | ||||
| Date: Fri, 27 Sep 2019 20:18:46 +0100 | ||||
| Subject: [PATCH 3/6] iotests: test bitmap moving inside 254 | ||||
| 
 | ||||
| RH-Author: John Snow <jsnow@redhat.com> | ||||
| Message-id: <20190927201846.6823-4-jsnow@redhat.com> | ||||
| Patchwork-id: 90910 | ||||
| O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH 3/3] iotests: test bitmap moving inside 254 | ||||
| Bugzilla: 1756413 | ||||
| RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com> | ||||
| RH-Acked-by: Max Reitz <mreitz@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | ||||
| 
 | ||||
| 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> | ||||
| (cherry picked from commit 3f7b2fa8cd476fe871ce1d996c640317730752a0) | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| 
 | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/254     | 30 +++++++++++++++-- | ||||
|  tests/qemu-iotests/254.out | 82 ++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  2 files changed, 110 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/254 b/tests/qemu-iotests/254
 | ||||
| index 8edba91..09584f3 100755
 | ||||
| --- a/tests/qemu-iotests/254
 | ||||
| +++ b/tests/qemu-iotests/254
 | ||||
| @@ -1,6 +1,6 @@
 | ||||
|  #!/usr/bin/env python | ||||
|  # | ||||
| -# Test external snapshot with bitmap copying.
 | ||||
| +# Test external snapshot with bitmap copying and moving.
 | ||||
|  # | ||||
|  # Copyright (c) 2019 Virtuozzo International GmbH. All rights reserved. | ||||
|  # | ||||
| @@ -32,6 +32,10 @@ vm = iotests.VM().add_drive(disk, opts='node-name=base')
 | ||||
|  vm.launch() | ||||
|   | ||||
|  vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap0') | ||||
| +vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap1',
 | ||||
| +           persistent=True)
 | ||||
| +vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap2',
 | ||||
| +           persistent=True)
 | ||||
|   | ||||
|  vm.hmp_qemu_io('drive0', 'write 0 512K') | ||||
|   | ||||
| @@ -39,16 +43,38 @@ vm.qmp_log('transaction', indent=2, actions=[
 | ||||
|      {'type': 'blockdev-snapshot-sync', | ||||
|       'data': {'device': 'drive0', 'snapshot-file': top, | ||||
|                'snapshot-node-name': 'snap'}}, | ||||
| +
 | ||||
| +    # copy non-persistent bitmap0
 | ||||
|      {'type': 'block-dirty-bitmap-add', | ||||
|       'data': {'node': 'snap', 'name': 'bitmap0'}}, | ||||
|      {'type': 'block-dirty-bitmap-merge', | ||||
|       'data': {'node': 'snap', 'target': 'bitmap0', | ||||
| -              'bitmaps': [{'node': 'base', 'name': 'bitmap0'}]}}
 | ||||
| +              'bitmaps': [{'node': 'base', 'name': 'bitmap0'}]}},
 | ||||
| +
 | ||||
| +    # copy persistent bitmap1, original will be saved to base image
 | ||||
| +    {'type': 'block-dirty-bitmap-add',
 | ||||
| +     'data': {'node': 'snap', 'name': 'bitmap1', 'persistent': True}},
 | ||||
| +    {'type': 'block-dirty-bitmap-merge',
 | ||||
| +     'data': {'node': 'snap', 'target': 'bitmap1',
 | ||||
| +              'bitmaps': [{'node': 'base', 'name': 'bitmap1'}]}},
 | ||||
| +
 | ||||
| +    # move persistent bitmap2, original will be removed and not saved
 | ||||
| +    # to base image
 | ||||
| +    {'type': 'block-dirty-bitmap-add',
 | ||||
| +     'data': {'node': 'snap', 'name': 'bitmap2', 'persistent': True}},
 | ||||
| +    {'type': 'block-dirty-bitmap-merge',
 | ||||
| +     'data': {'node': 'snap', 'target': 'bitmap2',
 | ||||
| +              'bitmaps': [{'node': 'base', 'name': 'bitmap2'}]}},
 | ||||
| +    {'type': 'block-dirty-bitmap-remove',
 | ||||
| +     'data': {'node': 'base', 'name': 'bitmap2'}}
 | ||||
|  ], filters=[iotests.filter_qmp_testfiles]) | ||||
|   | ||||
|  result = vm.qmp('query-block')['return'][0] | ||||
|  log("query-block: device = {}, node-name = {}, dirty-bitmaps:".format( | ||||
|      result['device'], result['inserted']['node-name'])) | ||||
|  log(result['dirty-bitmaps'], indent=2) | ||||
| +log("\nbitmaps in backing image:")
 | ||||
| +log(result['inserted']['image']['backing-image']['format-specific'] \
 | ||||
| +    ['data']['bitmaps'], indent=2)
 | ||||
|   | ||||
|  vm.shutdown() | ||||
| diff --git a/tests/qemu-iotests/254.out b/tests/qemu-iotests/254.out
 | ||||
| index d7394cf..d185c05 100644
 | ||||
| --- a/tests/qemu-iotests/254.out
 | ||||
| +++ b/tests/qemu-iotests/254.out
 | ||||
| @@ -1,5 +1,9 @@
 | ||||
|  {"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap0", "node": "drive0"}} | ||||
|  {"return": {}} | ||||
| +{"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap1", "node": "drive0", "persistent": true}}
 | ||||
| +{"return": {}}
 | ||||
| +{"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap2", "node": "drive0", "persistent": true}}
 | ||||
| +{"return": {}}
 | ||||
|  { | ||||
|    "execute": "transaction", | ||||
|    "arguments": { | ||||
| @@ -31,6 +35,55 @@
 | ||||
|            "target": "bitmap0" | ||||
|          }, | ||||
|          "type": "block-dirty-bitmap-merge" | ||||
| +      },
 | ||||
| +      {
 | ||||
| +        "data": {
 | ||||
| +          "name": "bitmap1",
 | ||||
| +          "node": "snap",
 | ||||
| +          "persistent": true
 | ||||
| +        },
 | ||||
| +        "type": "block-dirty-bitmap-add"
 | ||||
| +      },
 | ||||
| +      {
 | ||||
| +        "data": {
 | ||||
| +          "bitmaps": [
 | ||||
| +            {
 | ||||
| +              "name": "bitmap1",
 | ||||
| +              "node": "base"
 | ||||
| +            }
 | ||||
| +          ],
 | ||||
| +          "node": "snap",
 | ||||
| +          "target": "bitmap1"
 | ||||
| +        },
 | ||||
| +        "type": "block-dirty-bitmap-merge"
 | ||||
| +      },
 | ||||
| +      {
 | ||||
| +        "data": {
 | ||||
| +          "name": "bitmap2",
 | ||||
| +          "node": "snap",
 | ||||
| +          "persistent": true
 | ||||
| +        },
 | ||||
| +        "type": "block-dirty-bitmap-add"
 | ||||
| +      },
 | ||||
| +      {
 | ||||
| +        "data": {
 | ||||
| +          "bitmaps": [
 | ||||
| +            {
 | ||||
| +              "name": "bitmap2",
 | ||||
| +              "node": "base"
 | ||||
| +            }
 | ||||
| +          ],
 | ||||
| +          "node": "snap",
 | ||||
| +          "target": "bitmap2"
 | ||||
| +        },
 | ||||
| +        "type": "block-dirty-bitmap-merge"
 | ||||
| +      },
 | ||||
| +      {
 | ||||
| +        "data": {
 | ||||
| +          "name": "bitmap2",
 | ||||
| +          "node": "base"
 | ||||
| +        },
 | ||||
| +        "type": "block-dirty-bitmap-remove"
 | ||||
|        } | ||||
|      ] | ||||
|    } | ||||
| @@ -44,9 +97,38 @@ query-block: device = drive0, node-name = snap, dirty-bitmaps:
 | ||||
|      "busy": false, | ||||
|      "count": 524288, | ||||
|      "granularity": 65536, | ||||
| +    "name": "bitmap2",
 | ||||
| +    "persistent": true,
 | ||||
| +    "recording": true,
 | ||||
| +    "status": "active"
 | ||||
| +  },
 | ||||
| +  {
 | ||||
| +    "busy": false,
 | ||||
| +    "count": 524288,
 | ||||
| +    "granularity": 65536,
 | ||||
| +    "name": "bitmap1",
 | ||||
| +    "persistent": true,
 | ||||
| +    "recording": true,
 | ||||
| +    "status": "active"
 | ||||
| +  },
 | ||||
| +  {
 | ||||
| +    "busy": false,
 | ||||
| +    "count": 524288,
 | ||||
| +    "granularity": 65536,
 | ||||
|      "name": "bitmap0", | ||||
|      "persistent": false, | ||||
|      "recording": true, | ||||
|      "status": "active" | ||||
|    } | ||||
|  ] | ||||
| +
 | ||||
| +bitmaps in backing image:
 | ||||
| +[
 | ||||
| +  {
 | ||||
| +    "flags": [
 | ||||
| +      "auto"
 | ||||
| +    ],
 | ||||
| +    "granularity": 65536,
 | ||||
| +    "name": "bitmap1"
 | ||||
| +  }
 | ||||
| +]
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										200
									
								
								kvm-nbd-Grab-aio-context-lock-in-more-places.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								kvm-nbd-Grab-aio-context-lock-in-more-places.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,200 @@ | ||||
| From 7cf87a669fa0dd580013b0ca5e4510f12aff2319 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Blake <eblake@redhat.com> | ||||
| Date: Wed, 9 Oct 2019 14:10:07 +0100 | ||||
| Subject: [PATCH 5/6] nbd: Grab aio context lock in more places | ||||
| 
 | ||||
| RH-Author: Eric Blake <eblake@redhat.com> | ||||
| Message-id: <20191009141008.24439-2-eblake@redhat.com> | ||||
| Patchwork-id: 91353 | ||||
| O-Subject: [RHEL-AV-8.1.1 qemu-kvm PATCH 1/2] nbd: Grab aio context lock in more places | ||||
| Bugzilla: 1741094 | ||||
| RH-Acked-by: John Snow <jsnow@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| When iothreads are in use, the failure to grab the aio context results | ||||
| in an assertion failure when trying to unlock things during blk_unref, | ||||
| when trying to unlock a mutex that was not locked.  In short, all | ||||
| calls to nbd_export_put need to done while within the correct aio | ||||
| context.  But since nbd_export_put can recursively reach itself via | ||||
| nbd_export_close, and recursively grabbing the context would deadlock, | ||||
| we can't do the context grab directly in those functions, but must do | ||||
| so in their callers. | ||||
| 
 | ||||
| Hoist the use of the correct aio_context from nbd_export_new() to its | ||||
| caller qmp_nbd_server_add().  Then tweak qmp_nbd_server_remove(), | ||||
| nbd_eject_notifier(), and nbd_esport_close_all() to grab the right | ||||
| context, so that all callers during qemu now own the context before | ||||
| nbd_export_put() can call blk_unref(). | ||||
| 
 | ||||
| Remaining uses in qemu-nbd don't matter (since that use case does not | ||||
| support iothreads). | ||||
| 
 | ||||
| Suggested-by: Kevin Wolf <kwolf@redhat.com> | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| Message-Id: <20190917023917.32226-1-eblake@redhat.com> | ||||
| Reviewed-by: Sergio Lopez <slp@redhat.com> | ||||
| (cherry picked from commit 61bc846d8c58535af6884b637a4005dd6111ea95) | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  blockdev-nbd.c      | 14 ++++++++++++-- | ||||
|  include/block/nbd.h |  1 + | ||||
|  nbd/server.c        | 22 ++++++++++++++++++---- | ||||
|  3 files changed, 31 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/blockdev-nbd.c b/blockdev-nbd.c
 | ||||
| index 06041a2..bed9370 100644
 | ||||
| --- a/blockdev-nbd.c
 | ||||
| +++ b/blockdev-nbd.c
 | ||||
| @@ -152,6 +152,7 @@ void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
 | ||||
|      BlockBackend *on_eject_blk; | ||||
|      NBDExport *exp; | ||||
|      int64_t len; | ||||
| +    AioContext *aio_context;
 | ||||
|   | ||||
|      if (!nbd_server) { | ||||
|          error_setg(errp, "NBD server not running"); | ||||
| @@ -174,11 +175,13 @@ void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
 | ||||
|          return; | ||||
|      } | ||||
|   | ||||
| +    aio_context = bdrv_get_aio_context(bs);
 | ||||
| +    aio_context_acquire(aio_context);
 | ||||
|      len = bdrv_getlength(bs); | ||||
|      if (len < 0) { | ||||
|          error_setg_errno(errp, -len, | ||||
|                           "Failed to determine the NBD export's length"); | ||||
| -        return;
 | ||||
| +        goto out;
 | ||||
|      } | ||||
|   | ||||
|      if (!has_writable) { | ||||
| @@ -192,13 +195,16 @@ void qmp_nbd_server_add(const char *device, bool has_name, const char *name,
 | ||||
|                           writable ? 0 : NBD_FLAG_READ_ONLY, | ||||
|                           NULL, false, on_eject_blk, errp); | ||||
|      if (!exp) { | ||||
| -        return;
 | ||||
| +        goto out;
 | ||||
|      } | ||||
|   | ||||
|      /* The list of named exports has a strong reference to this export now and | ||||
|       * our only way of accessing it is through nbd_export_find(), so we can drop | ||||
|       * the strong reference that is @exp. */ | ||||
|      nbd_export_put(exp); | ||||
| +
 | ||||
| + out:
 | ||||
| +    aio_context_release(aio_context);
 | ||||
|  } | ||||
|   | ||||
|  void qmp_nbd_server_remove(const char *name, | ||||
| @@ -206,6 +212,7 @@ void qmp_nbd_server_remove(const char *name,
 | ||||
|                             Error **errp) | ||||
|  { | ||||
|      NBDExport *exp; | ||||
| +    AioContext *aio_context;
 | ||||
|   | ||||
|      if (!nbd_server) { | ||||
|          error_setg(errp, "NBD server not running"); | ||||
| @@ -222,7 +229,10 @@ void qmp_nbd_server_remove(const char *name,
 | ||||
|          mode = NBD_SERVER_REMOVE_MODE_SAFE; | ||||
|      } | ||||
|   | ||||
| +    aio_context = nbd_export_aio_context(exp);
 | ||||
| +    aio_context_acquire(aio_context);
 | ||||
|      nbd_export_remove(exp, mode, errp); | ||||
| +    aio_context_release(aio_context);
 | ||||
|  } | ||||
|   | ||||
|  void qmp_nbd_server_stop(Error **errp) | ||||
| diff --git a/include/block/nbd.h b/include/block/nbd.h
 | ||||
| index bb9f5bc..82f9b9e 100644
 | ||||
| --- a/include/block/nbd.h
 | ||||
| +++ b/include/block/nbd.h
 | ||||
| @@ -335,6 +335,7 @@ void nbd_export_put(NBDExport *exp);
 | ||||
|   | ||||
|  BlockBackend *nbd_export_get_blockdev(NBDExport *exp); | ||||
|   | ||||
| +AioContext *nbd_export_aio_context(NBDExport *exp);
 | ||||
|  NBDExport *nbd_export_find(const char *name); | ||||
|  void nbd_export_close_all(void); | ||||
|   | ||||
| diff --git a/nbd/server.c b/nbd/server.c
 | ||||
| index ea0353a..81f8217 100644
 | ||||
| --- a/nbd/server.c
 | ||||
| +++ b/nbd/server.c
 | ||||
| @@ -1460,7 +1460,12 @@ static void blk_aio_detach(void *opaque)
 | ||||
|  static void nbd_eject_notifier(Notifier *n, void *data) | ||||
|  { | ||||
|      NBDExport *exp = container_of(n, NBDExport, eject_notifier); | ||||
| +    AioContext *aio_context;
 | ||||
| +
 | ||||
| +    aio_context = exp->ctx;
 | ||||
| +    aio_context_acquire(aio_context);
 | ||||
|      nbd_export_close(exp); | ||||
| +    aio_context_release(aio_context);
 | ||||
|  } | ||||
|   | ||||
|  NBDExport *nbd_export_new(BlockDriverState *bs, uint64_t dev_offset, | ||||
| @@ -1479,12 +1484,11 @@ NBDExport *nbd_export_new(BlockDriverState *bs, uint64_t dev_offset,
 | ||||
|       * NBD exports are used for non-shared storage migration.  Make sure | ||||
|       * that BDRV_O_INACTIVE is cleared and the image is ready for write | ||||
|       * access since the export could be available before migration handover. | ||||
| +     * ctx was acquired in the caller.
 | ||||
|       */ | ||||
|      assert(name); | ||||
|      ctx = bdrv_get_aio_context(bs); | ||||
| -    aio_context_acquire(ctx);
 | ||||
|      bdrv_invalidate_cache(bs, NULL); | ||||
| -    aio_context_release(ctx);
 | ||||
|   | ||||
|      /* Don't allow resize while the NBD server is running, otherwise we don't | ||||
|       * care what happens with the node. */ | ||||
| @@ -1492,7 +1496,7 @@ NBDExport *nbd_export_new(BlockDriverState *bs, uint64_t dev_offset,
 | ||||
|      if ((nbdflags & NBD_FLAG_READ_ONLY) == 0) { | ||||
|          perm |= BLK_PERM_WRITE; | ||||
|      } | ||||
| -    blk = blk_new(bdrv_get_aio_context(bs), perm,
 | ||||
| +    blk = blk_new(ctx, perm,
 | ||||
|                    BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED | | ||||
|                    BLK_PERM_WRITE | BLK_PERM_GRAPH_MOD); | ||||
|      ret = blk_insert_bs(blk, bs, errp); | ||||
| @@ -1549,7 +1553,7 @@ NBDExport *nbd_export_new(BlockDriverState *bs, uint64_t dev_offset,
 | ||||
|      } | ||||
|   | ||||
|      exp->close = close; | ||||
| -    exp->ctx = blk_get_aio_context(blk);
 | ||||
| +    exp->ctx = ctx;
 | ||||
|      blk_add_aio_context_notifier(blk, blk_aio_attached, blk_aio_detach, exp); | ||||
|   | ||||
|      if (on_eject_blk) { | ||||
| @@ -1582,6 +1586,12 @@ NBDExport *nbd_export_find(const char *name)
 | ||||
|      return NULL; | ||||
|  } | ||||
|   | ||||
| +AioContext *
 | ||||
| +nbd_export_aio_context(NBDExport *exp)
 | ||||
| +{
 | ||||
| +    return exp->ctx;
 | ||||
| +}
 | ||||
| +
 | ||||
|  void nbd_export_close(NBDExport *exp) | ||||
|  { | ||||
|      NBDClient *client, *next; | ||||
| @@ -1676,9 +1686,13 @@ BlockBackend *nbd_export_get_blockdev(NBDExport *exp)
 | ||||
|  void nbd_export_close_all(void) | ||||
|  { | ||||
|      NBDExport *exp, *next; | ||||
| +    AioContext *aio_context;
 | ||||
|   | ||||
|      QTAILQ_FOREACH_SAFE(exp, &exports, next, next) { | ||||
| +        aio_context = exp->ctx;
 | ||||
| +        aio_context_acquire(aio_context);
 | ||||
|          nbd_export_close(exp); | ||||
| +        aio_context_release(aio_context);
 | ||||
|      } | ||||
|  } | ||||
|   | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										274
									
								
								kvm-qapi-implement-block-dirty-bitmap-remove-transaction.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								kvm-qapi-implement-block-dirty-bitmap-remove-transaction.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,274 @@ | ||||
| From fd8ecebf0c0632e473bcb8bb08dc8311a5530dcf Mon Sep 17 00:00:00 2001 | ||||
| From: John Snow <jsnow@redhat.com> | ||||
| Date: Fri, 27 Sep 2019 20:18:45 +0100 | ||||
| Subject: [PATCH 2/6] qapi: implement block-dirty-bitmap-remove transaction | ||||
|  action | ||||
| 
 | ||||
| RH-Author: John Snow <jsnow@redhat.com> | ||||
| Message-id: <20190927201846.6823-3-jsnow@redhat.com> | ||||
| Patchwork-id: 90911 | ||||
| O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH 2/3] qapi: implement block-dirty-bitmap-remove transaction action | ||||
| Bugzilla: 1756413 | ||||
| RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com> | ||||
| RH-Acked-by: Max Reitz <mreitz@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| It is used to do transactional movement of the bitmap (which is | ||||
| possible in conjunction with merge command). Transactional bitmap | ||||
| movement is needed in scenarios with external snapshot, when we don't | ||||
| want to leave copy of the bitmap in the base image. | ||||
| 
 | ||||
| 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-3-jsnow@redhat.com | ||||
| [Edited "since" version to 4.2 --js] | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| (cherry picked from commit c4e4b0fa598ddc9cee6ba7a06899ce0a8dae6c61) | ||||
| Signed-off-by: John Snow <jsnow@redhat.com> | ||||
| 
 | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  block.c                        |  2 +- | ||||
|  block/dirty-bitmap.c           | 15 ++++---- | ||||
|  blockdev.c                     | 79 ++++++++++++++++++++++++++++++++++++++---- | ||||
|  include/block/dirty-bitmap.h   |  2 +- | ||||
|  migration/block-dirty-bitmap.c |  2 +- | ||||
|  qapi/transaction.json          |  2 ++ | ||||
|  6 files changed, 85 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| diff --git a/block.c b/block.c
 | ||||
| index cbd8da5..92a3e9f 100644
 | ||||
| --- a/block.c
 | ||||
| +++ b/block.c
 | ||||
| @@ -5334,7 +5334,7 @@ static void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs,
 | ||||
|      for (bm = bdrv_dirty_bitmap_next(bs, NULL); bm; | ||||
|           bm = bdrv_dirty_bitmap_next(bs, bm)) | ||||
|      { | ||||
| -        bdrv_dirty_bitmap_set_migration(bm, false);
 | ||||
| +        bdrv_dirty_bitmap_skip_store(bm, false);
 | ||||
|      } | ||||
|   | ||||
|      ret = refresh_total_sectors(bs, bs->total_sectors); | ||||
| diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
 | ||||
| index 95a9c2a..a308e1f 100644
 | ||||
| --- a/block/dirty-bitmap.c
 | ||||
| +++ b/block/dirty-bitmap.c
 | ||||
| @@ -48,10 +48,9 @@ struct BdrvDirtyBitmap {
 | ||||
|      bool inconsistent;          /* bitmap is persistent, but inconsistent. | ||||
|                                     It cannot be used at all in any way, except | ||||
|                                     a QMP user can remove it. */ | ||||
| -    bool migration;             /* Bitmap is selected for migration, it should
 | ||||
| -                                   not be stored on the next inactivation
 | ||||
| -                                   (persistent flag doesn't matter until next
 | ||||
| -                                   invalidation).*/
 | ||||
| +    bool skip_store;            /* We are either migrating or deleting this
 | ||||
| +                                 * bitmap; it should not be stored on the next
 | ||||
| +                                 * inactivation. */
 | ||||
|      QLIST_ENTRY(BdrvDirtyBitmap) list; | ||||
|  }; | ||||
|   | ||||
| @@ -757,16 +756,16 @@ void bdrv_dirty_bitmap_set_inconsistent(BdrvDirtyBitmap *bitmap)
 | ||||
|  } | ||||
|   | ||||
|  /* Called with BQL taken. */ | ||||
| -void bdrv_dirty_bitmap_set_migration(BdrvDirtyBitmap *bitmap, bool migration)
 | ||||
| +void bdrv_dirty_bitmap_skip_store(BdrvDirtyBitmap *bitmap, bool skip)
 | ||||
|  { | ||||
|      qemu_mutex_lock(bitmap->mutex); | ||||
| -    bitmap->migration = migration;
 | ||||
| +    bitmap->skip_store = skip;
 | ||||
|      qemu_mutex_unlock(bitmap->mutex); | ||||
|  } | ||||
|   | ||||
|  bool bdrv_dirty_bitmap_get_persistence(BdrvDirtyBitmap *bitmap) | ||||
|  { | ||||
| -    return bitmap->persistent && !bitmap->migration;
 | ||||
| +    return bitmap->persistent && !bitmap->skip_store;
 | ||||
|  } | ||||
|   | ||||
|  bool bdrv_dirty_bitmap_inconsistent(const BdrvDirtyBitmap *bitmap) | ||||
| @@ -778,7 +777,7 @@ bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs)
 | ||||
|  { | ||||
|      BdrvDirtyBitmap *bm; | ||||
|      QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) { | ||||
| -        if (bm->persistent && !bm->readonly && !bm->migration) {
 | ||||
| +        if (bm->persistent && !bm->readonly && !bm->skip_store) {
 | ||||
|              return true; | ||||
|          } | ||||
|      } | ||||
| diff --git a/blockdev.c b/blockdev.c
 | ||||
| index 0124825..800b3dc 100644
 | ||||
| --- a/blockdev.c
 | ||||
| +++ b/blockdev.c
 | ||||
| @@ -2134,6 +2134,51 @@ static void block_dirty_bitmap_merge_prepare(BlkActionState *common,
 | ||||
|                                                  errp); | ||||
|  } | ||||
|   | ||||
| +static BdrvDirtyBitmap *do_block_dirty_bitmap_remove(
 | ||||
| +        const char *node, const char *name, bool release,
 | ||||
| +        BlockDriverState **bitmap_bs, Error **errp);
 | ||||
| +
 | ||||
| +static void block_dirty_bitmap_remove_prepare(BlkActionState *common,
 | ||||
| +                                              Error **errp)
 | ||||
| +{
 | ||||
| +    BlockDirtyBitmap *action;
 | ||||
| +    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
 | ||||
| +                                             common, common);
 | ||||
| +
 | ||||
| +    if (action_check_completion_mode(common, errp) < 0) {
 | ||||
| +        return;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    action = common->action->u.block_dirty_bitmap_remove.data;
 | ||||
| +
 | ||||
| +    state->bitmap = do_block_dirty_bitmap_remove(action->node, action->name,
 | ||||
| +                                                 false, &state->bs, errp);
 | ||||
| +    if (state->bitmap) {
 | ||||
| +        bdrv_dirty_bitmap_skip_store(state->bitmap, true);
 | ||||
| +        bdrv_dirty_bitmap_set_busy(state->bitmap, true);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void block_dirty_bitmap_remove_abort(BlkActionState *common)
 | ||||
| +{
 | ||||
| +    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
 | ||||
| +                                             common, common);
 | ||||
| +
 | ||||
| +    if (state->bitmap) {
 | ||||
| +        bdrv_dirty_bitmap_skip_store(state->bitmap, false);
 | ||||
| +        bdrv_dirty_bitmap_set_busy(state->bitmap, false);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void block_dirty_bitmap_remove_commit(BlkActionState *common)
 | ||||
| +{
 | ||||
| +    BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
 | ||||
| +                                             common, common);
 | ||||
| +
 | ||||
| +    bdrv_dirty_bitmap_set_busy(state->bitmap, false);
 | ||||
| +    bdrv_release_dirty_bitmap(state->bs, state->bitmap);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void abort_prepare(BlkActionState *common, Error **errp) | ||||
|  { | ||||
|      error_setg(errp, "Transaction aborted using Abort action"); | ||||
| @@ -2211,6 +2256,12 @@ static const BlkActionOps actions[] = {
 | ||||
|          .commit = block_dirty_bitmap_free_backup, | ||||
|          .abort = block_dirty_bitmap_restore, | ||||
|      }, | ||||
| +    [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_REMOVE] = {
 | ||||
| +        .instance_size = sizeof(BlockDirtyBitmapState),
 | ||||
| +        .prepare = block_dirty_bitmap_remove_prepare,
 | ||||
| +        .commit = block_dirty_bitmap_remove_commit,
 | ||||
| +        .abort = block_dirty_bitmap_remove_abort,
 | ||||
| +    },
 | ||||
|      /* Where are transactions for MIRROR, COMMIT and STREAM? | ||||
|       * Although these blockjobs use transaction callbacks like the backup job, | ||||
|       * these jobs do not necessarily adhere to transaction semantics. | ||||
| @@ -2869,20 +2920,21 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
 | ||||
|      bdrv_dirty_bitmap_set_persistence(bitmap, persistent); | ||||
|  } | ||||
|   | ||||
| -void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
 | ||||
| -                                   Error **errp)
 | ||||
| +static BdrvDirtyBitmap *do_block_dirty_bitmap_remove(
 | ||||
| +        const char *node, const char *name, bool release,
 | ||||
| +        BlockDriverState **bitmap_bs, Error **errp)
 | ||||
|  { | ||||
|      BlockDriverState *bs; | ||||
|      BdrvDirtyBitmap *bitmap; | ||||
|   | ||||
|      bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp); | ||||
|      if (!bitmap || !bs) { | ||||
| -        return;
 | ||||
| +        return NULL;
 | ||||
|      } | ||||
|   | ||||
|      if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO, | ||||
|                                  errp)) { | ||||
| -        return;
 | ||||
| +        return NULL;
 | ||||
|      } | ||||
|   | ||||
|      if (bdrv_dirty_bitmap_get_persistence(bitmap)) { | ||||
| @@ -2892,13 +2944,28 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
 | ||||
|          aio_context_acquire(aio_context); | ||||
|          bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err); | ||||
|          aio_context_release(aio_context); | ||||
| +
 | ||||
|          if (local_err != NULL) { | ||||
|              error_propagate(errp, local_err); | ||||
| -            return;
 | ||||
| +            return NULL;
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| -    bdrv_release_dirty_bitmap(bs, bitmap);
 | ||||
| +    if (release) {
 | ||||
| +        bdrv_release_dirty_bitmap(bs, bitmap);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (bitmap_bs) {
 | ||||
| +        *bitmap_bs = bs;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    return release ? NULL : bitmap;
 | ||||
| +}
 | ||||
| +
 | ||||
| +void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
 | ||||
| +                                   Error **errp)
 | ||||
| +{
 | ||||
| +    do_block_dirty_bitmap_remove(node, name, true, NULL, errp);
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
 | ||||
| index 62682eb..a21d54a 100644
 | ||||
| --- a/include/block/dirty-bitmap.h
 | ||||
| +++ b/include/block/dirty-bitmap.h
 | ||||
| @@ -83,7 +83,7 @@ void bdrv_dirty_bitmap_set_inconsistent(BdrvDirtyBitmap *bitmap);
 | ||||
|  void bdrv_dirty_bitmap_set_busy(BdrvDirtyBitmap *bitmap, bool busy); | ||||
|  void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src, | ||||
|                               HBitmap **backup, Error **errp); | ||||
| -void bdrv_dirty_bitmap_set_migration(BdrvDirtyBitmap *bitmap, bool migration);
 | ||||
| +void bdrv_dirty_bitmap_skip_store(BdrvDirtyBitmap *bitmap, bool skip);
 | ||||
|   | ||||
|  /* Functions that require manual locking.  */ | ||||
|  void bdrv_dirty_bitmap_lock(BdrvDirtyBitmap *bitmap); | ||||
| diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
 | ||||
| index 4a896a0..d650ba4 100644
 | ||||
| --- a/migration/block-dirty-bitmap.c
 | ||||
| +++ b/migration/block-dirty-bitmap.c
 | ||||
| @@ -326,7 +326,7 @@ static int init_dirty_bitmap_migration(void)
 | ||||
|   | ||||
|      /* unset migration flags here, to not roll back it */ | ||||
|      QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) { | ||||
| -        bdrv_dirty_bitmap_set_migration(dbms->bitmap, true);
 | ||||
| +        bdrv_dirty_bitmap_skip_store(dbms->bitmap, true);
 | ||||
|      } | ||||
|   | ||||
|      if (QSIMPLEQ_EMPTY(&dirty_bitmap_mig_state.dbms_list)) { | ||||
| diff --git a/qapi/transaction.json b/qapi/transaction.json
 | ||||
| index 95edb78..0590dbc 100644
 | ||||
| --- a/qapi/transaction.json
 | ||||
| +++ b/qapi/transaction.json
 | ||||
| @@ -45,6 +45,7 @@
 | ||||
|  # | ||||
|  # - @abort: since 1.6 | ||||
|  # - @block-dirty-bitmap-add: since 2.5 | ||||
| +# - @block-dirty-bitmap-remove: since 4.2
 | ||||
|  # - @block-dirty-bitmap-clear: since 2.5 | ||||
|  # - @block-dirty-bitmap-enable: since 4.0 | ||||
|  # - @block-dirty-bitmap-disable: since 4.0 | ||||
| @@ -61,6 +62,7 @@
 | ||||
|    'data': { | ||||
|         'abort': 'Abort', | ||||
|         'block-dirty-bitmap-add': 'BlockDirtyBitmapAdd', | ||||
| +       'block-dirty-bitmap-remove': 'BlockDirtyBitmap',
 | ||||
|         'block-dirty-bitmap-clear': 'BlockDirtyBitmap', | ||||
|         'block-dirty-bitmap-enable': 'BlockDirtyBitmap', | ||||
|         'block-dirty-bitmap-disable': 'BlockDirtyBitmap', | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
| @ -0,0 +1,65 @@ | ||||
| From 3a7d0411addca79192ed60939f55ec019c27a72a Mon Sep 17 00:00:00 2001 | ||||
| From: David Gibson <dgibson@redhat.com> | ||||
| Date: Tue, 8 Oct 2019 05:08:36 +0100 | ||||
| Subject: [PATCH 4/6] spapr/xive: skip partially initialized vCPUs in presenter | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| RH-Author: David Gibson <dgibson@redhat.com> | ||||
| Message-id: <20191008050836.11479-1-dgibson@redhat.com> | ||||
| Patchwork-id: 90994 | ||||
| O-Subject: [RHEL-AV-8.1.1 qemu-kvm PATCH] spapr/xive: skip partially initialized vCPUs in presenter | ||||
| Bugzilla: 1754710 | ||||
| RH-Acked-by: Laurent Vivier <lvivier@redhat.com> | ||||
| RH-Acked-by: Thomas Huth <thuth@redhat.com> | ||||
| RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com> | ||||
| 
 | ||||
| From: Cédric Le Goater <clg@kaod.org> | ||||
| 
 | ||||
| When vCPUs are hotplugged, they are added to the QEMU CPU list before | ||||
| being fully realized. This can crash the XIVE presenter because the | ||||
| 'tctx' pointer is not necessarily initialized when looking for a | ||||
| matching target. | ||||
| 
 | ||||
| These vCPUs are not valid targets for the presenter. Skip them. | ||||
| 
 | ||||
| Signed-off-by: Cédric Le Goater <clg@kaod.org> | ||||
| Message-Id: <20191001085722.32755-1-clg@kaod.org> | ||||
| Signed-off-by: David Gibson <david@gibson.dropbear.id.au> | ||||
| Reviewed-by: Greg Kurz <groug@kaod.org> | ||||
| (cherry picked from commit 627fa61746f70f7c799f08e9048bb6a482402138) | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1754710 | ||||
| Branch: rhel-av-8.1.1 | ||||
| Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23900462 | ||||
| Testing: Could no longer reproduce bug with brewed qemu | ||||
| 
 | ||||
| Signed-off-by: David Gibson <dgibson@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  hw/intc/xive.c | 8 ++++++++ | ||||
|  1 file changed, 8 insertions(+) | ||||
| 
 | ||||
| diff --git a/hw/intc/xive.c b/hw/intc/xive.c
 | ||||
| index da148e9..8f639f6 100644
 | ||||
| --- a/hw/intc/xive.c
 | ||||
| +++ b/hw/intc/xive.c
 | ||||
| @@ -1345,6 +1345,14 @@ static bool xive_presenter_match(XiveRouter *xrtr, uint8_t format,
 | ||||
|          int ring; | ||||
|   | ||||
|          /* | ||||
| +         * Skip partially initialized vCPUs. This can happen when
 | ||||
| +         * vCPUs are hotplugged.
 | ||||
| +         */
 | ||||
| +        if (!tctx) {
 | ||||
| +            continue;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        /*
 | ||||
|           * HW checks that the CPU is enabled in the Physical Thread | ||||
|           * Enable Register (PTER). | ||||
|           */ | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
							
								
								
									
										73
									
								
								kvm-tests-Use-iothreads-during-iotest-223.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								kvm-tests-Use-iothreads-during-iotest-223.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| From c03d23733166328e70f98504d7dfaa528e889633 Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Blake <eblake@redhat.com> | ||||
| Date: Wed, 9 Oct 2019 14:10:08 +0100 | ||||
| Subject: [PATCH 6/6] tests: Use iothreads during iotest 223 | ||||
| 
 | ||||
| RH-Author: Eric Blake <eblake@redhat.com> | ||||
| Message-id: <20191009141008.24439-3-eblake@redhat.com> | ||||
| Patchwork-id: 91355 | ||||
| O-Subject: [RHEL-AV-8.1.1 qemu-kvm PATCH 2/2] tests: Use iothreads during iotest 223 | ||||
| Bugzilla: 1741094 | ||||
| RH-Acked-by: John Snow <jsnow@redhat.com> | ||||
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> | ||||
| RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com> | ||||
| 
 | ||||
| Doing so catches the bugs we just fixed with NBD not properly using | ||||
| correct contexts. | ||||
| 
 | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| Message-Id: <20190920220729.31801-1-eblake@redhat.com> | ||||
| (cherry picked from commit 506902c6fa80210b002e30ff33794bfc718b15c6) | ||||
| Signed-off-by: Eric Blake <eblake@redhat.com> | ||||
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> | ||||
| ---
 | ||||
|  tests/qemu-iotests/223     | 6 ++++-- | ||||
|  tests/qemu-iotests/223.out | 1 + | ||||
|  2 files changed, 5 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/tests/qemu-iotests/223 b/tests/qemu-iotests/223
 | ||||
| index cc48e78..2ba3d81 100755
 | ||||
| --- a/tests/qemu-iotests/223
 | ||||
| +++ b/tests/qemu-iotests/223
 | ||||
| @@ -2,7 +2,7 @@
 | ||||
|  # | ||||
|  # Test reading dirty bitmap over NBD | ||||
|  # | ||||
| -# Copyright (C) 2018 Red Hat, Inc.
 | ||||
| +# Copyright (C) 2018-2019 Red Hat, Inc.
 | ||||
|  # | ||||
|  # This program is free software; you can redistribute it and/or modify | ||||
|  # it under the terms of the GNU General Public License as published by | ||||
| @@ -109,7 +109,7 @@ echo
 | ||||
|  echo "=== End dirty bitmaps, and start serving image over NBD ===" | ||||
|  echo | ||||
|   | ||||
| -_launch_qemu 2> >(_filter_nbd)
 | ||||
| +_launch_qemu -object iothread,id=io0 2> >(_filter_nbd)
 | ||||
|   | ||||
|  # Intentionally provoke some errors as well, to check error handling | ||||
|  silent= | ||||
| @@ -117,6 +117,8 @@ _send_qemu_cmd $QEMU_HANDLE '{"execute":"qmp_capabilities"}' "return"
 | ||||
|  _send_qemu_cmd $QEMU_HANDLE '{"execute":"blockdev-add", | ||||
|    "arguments":{"driver":"qcow2", "node-name":"n", | ||||
|      "file":{"driver":"file", "filename":"'"$TEST_IMG"'"}}}' "return" | ||||
| +_send_qemu_cmd $QEMU_HANDLE '{"execute":"x-blockdev-set-iothread",
 | ||||
| +  "arguments":{"node-name":"n", "iothread":"io0"}}' "return"
 | ||||
|  _send_qemu_cmd $QEMU_HANDLE '{"execute":"block-dirty-bitmap-disable", | ||||
|    "arguments":{"node":"n", "name":"b"}}' "return" | ||||
|  _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add", | ||||
| diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out
 | ||||
| index d5201b2..90cc4b6 100644
 | ||||
| --- a/tests/qemu-iotests/223.out
 | ||||
| +++ b/tests/qemu-iotests/223.out
 | ||||
| @@ -27,6 +27,7 @@ wrote 2097152/2097152 bytes at offset 2097152
 | ||||
|  {"return": {}} | ||||
|  {"return": {}} | ||||
|  {"return": {}} | ||||
| +{"return": {}}
 | ||||
|  {"error": {"class": "GenericError", "desc": "NBD server not running"}} | ||||
|  {"return": {}} | ||||
|  {"error": {"class": "GenericError", "desc": "NBD server already running"}} | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
| @ -67,7 +67,7 @@ Obsoletes: %1-rhev | ||||
| Summary: QEMU is a machine emulator and virtualizer | ||||
| Name: qemu-kvm | ||||
| Version: 4.1.0 | ||||
| Release: 13%{?dist} | ||||
| Release: 14%{?dist} | ||||
| # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped | ||||
| Epoch: 15 | ||||
| License: GPLv2 and GPLv2+ and CC-BY | ||||
| @ -220,6 +220,18 @@ Patch67: kvm-qemu-iotests-Add-test-for-bz-1745922.patch | ||||
| Patch68: kvm-nbd-server-attach-client-channel-to-the-export-s-Aio.patch | ||||
| # For bz#1744955 - Qemu hang when block resize a qcow2 image | ||||
| Patch69: kvm-virtio-blk-schedule-virtio_notify_config-to-run-on-m.patch | ||||
| # For bz#1756413 - backport support for transactionable block-dirty-bitmap-remove for incremental backup support | ||||
| Patch70: kvm-blockdev-reduce-aio_context-locked-sections-in-bitma.patch | ||||
| # For bz#1756413 - backport support for transactionable block-dirty-bitmap-remove for incremental backup support | ||||
| Patch71: kvm-qapi-implement-block-dirty-bitmap-remove-transaction.patch | ||||
| # For bz#1756413 - backport support for transactionable block-dirty-bitmap-remove for incremental backup support | ||||
| Patch72: kvm-iotests-test-bitmap-moving-inside-254.patch | ||||
| # For bz#1754710 - qemu core dumped when hotpluging vcpus | ||||
| Patch73: kvm-spapr-xive-skip-partially-initialized-vCPUs-in-prese.patch | ||||
| # For bz#1741094 - [Upstream]Incremental backup: Qemu coredump when expose an active bitmap via pull mode(data plane enable) | ||||
| Patch74: kvm-nbd-Grab-aio-context-lock-in-more-places.patch | ||||
| # For bz#1741094 - [Upstream]Incremental backup: Qemu coredump when expose an active bitmap via pull mode(data plane enable) | ||||
| Patch75: kvm-tests-Use-iothreads-during-iotest-223.patch | ||||
| 
 | ||||
| BuildRequires: wget | ||||
| BuildRequires: rpm-build | ||||
| @ -1161,6 +1173,20 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ | ||||
| 
 | ||||
| 
 | ||||
| %changelog | ||||
| * Tue Nov 12 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.1.0-14.el8 | ||||
| - kvm-blockdev-reduce-aio_context-locked-sections-in-bitma.patch [bz#1756413] | ||||
| - kvm-qapi-implement-block-dirty-bitmap-remove-transaction.patch [bz#1756413] | ||||
| - kvm-iotests-test-bitmap-moving-inside-254.patch [bz#1756413] | ||||
| - kvm-spapr-xive-skip-partially-initialized-vCPUs-in-prese.patch [bz#1754710] | ||||
| - kvm-nbd-Grab-aio-context-lock-in-more-places.patch [bz#1741094] | ||||
| - kvm-tests-Use-iothreads-during-iotest-223.patch [bz#1741094] | ||||
| - Resolves: bz#1741094 | ||||
|   ([Upstream]Incremental backup: Qemu coredump when expose an active bitmap via pull mode(data plane enable)) | ||||
| - Resolves: bz#1754710 | ||||
|   (qemu core dumped when hotpluging vcpus) | ||||
| - Resolves: bz#1756413 | ||||
|   (backport support for transactionable block-dirty-bitmap-remove for incremental backup support) | ||||
| 
 | ||||
| * Fri Sep 27 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.1.0-13.el8 | ||||
| - kvm-nbd-server-attach-client-channel-to-the-export-s-Aio.patch [bz#1748253] | ||||
| - kvm-virtio-blk-schedule-virtio_notify_config-to-run-on-m.patch [bz#1744955] | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user