diff mbox

block-backend: Preserve AioContext of root across medium change

Message ID 1474628299-27134-1-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng Sept. 23, 2016, 10:58 a.m. UTC
This is nop for non-dataplane case, but it prevents crash
(virtio_scsi_ctx_check assertion failure) when a scsi-cd change
operation happens on a virtio-scsi dataplane device.

Cc: qemu-stable@nongnu.org
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block/block-backend.c     | 7 +++++++
 include/block/block_int.h | 1 +
 2 files changed, 8 insertions(+)

Comments

Paolo Bonzini Sept. 23, 2016, 12:11 p.m. UTC | #1
On 23/09/2016 12:58, Fam Zheng wrote:
> This is nop for non-dataplane case, but it prevents crash
> (virtio_scsi_ctx_check assertion failure) when a scsi-cd change
> operation happens on a virtio-scsi dataplane device.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block/block-backend.c     | 7 +++++++
>  include/block/block_int.h | 1 +
>  2 files changed, 8 insertions(+)
> 
> diff --git a/block/block-backend.c b/block/block-backend.c
> index d1349d9..c2cae9a 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -1570,6 +1570,7 @@ void blk_update_root_state(BlockBackend *blk)
>      blk->root_state.open_flags    = blk->root->bs->open_flags;
>      blk->root_state.read_only     = blk->root->bs->read_only;
>      blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes;
> +    blk->root_state.aio_context   = blk->root->bs->aio_context;
>  }
>  
>  /*
> @@ -1579,7 +1580,13 @@ void blk_update_root_state(BlockBackend *blk)
>   */
>  void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs)
>  {
> +    AioContext *ctx = blk->root_state.aio_context;
>      bs->detect_zeroes = blk->root_state.detect_zeroes;
> +    if (ctx && ctx != qemu_get_aio_context()) {
> +        aio_context_acquire(ctx);
> +        bdrv_set_aio_context(bs, ctx);
> +        aio_context_release(ctx);
> +    }
>  }
>  
>  /*
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index ef3c047..23c64d2 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -534,6 +534,7 @@ struct BlockBackendRootState {
>      int open_flags;
>      bool read_only;
>      BlockdevDetectZeroesOptions detect_zeroes;
> +    AioContext *aio_context;
>  };
>  
>  typedef enum BlockMirrorBackingMode {
> 

Looks good.

I look forward to when we can drop bdrv_set_aio_context altogether...
It's only 70 patches away! :)

Paolo
Max Reitz Sept. 23, 2016, 3:54 p.m. UTC | #2
On 23.09.2016 12:58, Fam Zheng wrote:
> This is nop for non-dataplane case, but it prevents crash
> (virtio_scsi_ctx_check assertion failure) when a scsi-cd change
> operation happens on a virtio-scsi dataplane device.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block/block-backend.c     | 7 +++++++
>  include/block/block_int.h | 1 +
>  2 files changed, 8 insertions(+)
> 
> diff --git a/block/block-backend.c b/block/block-backend.c
> index d1349d9..c2cae9a 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -1570,6 +1570,7 @@ void blk_update_root_state(BlockBackend *blk)
>      blk->root_state.open_flags    = blk->root->bs->open_flags;
>      blk->root_state.read_only     = blk->root->bs->read_only;
>      blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes;
> +    blk->root_state.aio_context   = blk->root->bs->aio_context;
>  }
>  
>  /*
> @@ -1579,7 +1580,13 @@ void blk_update_root_state(BlockBackend *blk)
>   */
>  void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs)
>  {
> +    AioContext *ctx = blk->root_state.aio_context;
>      bs->detect_zeroes = blk->root_state.detect_zeroes;
> +    if (ctx && ctx != qemu_get_aio_context()) {
> +        aio_context_acquire(ctx);
> +        bdrv_set_aio_context(bs, ctx);
> +        aio_context_release(ctx);
> +    }
>  }
>  
>  /*
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index ef3c047..23c64d2 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -534,6 +534,7 @@ struct BlockBackendRootState {
>      int open_flags;
>      bool read_only;
>      BlockdevDetectZeroesOptions detect_zeroes;
> +    AioContext *aio_context;
>  };
>  
>  typedef enum BlockMirrorBackingMode {

The issue with using the BBRS is that it won't work with
x-blockdev-{insert,remove}-medium. Instead, I think the AioContext
should just be stored in the BB, for which Stefan sent an RFC back in April:

http://lists.nongnu.org/archive/html/qemu-devel/2016-04/msg01844.html

Max
diff mbox

Patch

diff --git a/block/block-backend.c b/block/block-backend.c
index d1349d9..c2cae9a 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1570,6 +1570,7 @@  void blk_update_root_state(BlockBackend *blk)
     blk->root_state.open_flags    = blk->root->bs->open_flags;
     blk->root_state.read_only     = blk->root->bs->read_only;
     blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes;
+    blk->root_state.aio_context   = blk->root->bs->aio_context;
 }
 
 /*
@@ -1579,7 +1580,13 @@  void blk_update_root_state(BlockBackend *blk)
  */
 void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs)
 {
+    AioContext *ctx = blk->root_state.aio_context;
     bs->detect_zeroes = blk->root_state.detect_zeroes;
+    if (ctx && ctx != qemu_get_aio_context()) {
+        aio_context_acquire(ctx);
+        bdrv_set_aio_context(bs, ctx);
+        aio_context_release(ctx);
+    }
 }
 
 /*
diff --git a/include/block/block_int.h b/include/block/block_int.h
index ef3c047..23c64d2 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -534,6 +534,7 @@  struct BlockBackendRootState {
     int open_flags;
     bool read_only;
     BlockdevDetectZeroesOptions detect_zeroes;
+    AioContext *aio_context;
 };
 
 typedef enum BlockMirrorBackingMode {