Message ID | 1446220661-18792-1-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, Oct 30, 2015 at 03:57:41PM +0000, Stefan Hajnoczi wrote: > This one slipped through. Although we acquire AioContext when > committing all devices we don't for just a single device. > > AioContext must be acquired before calling bdrv_*() functions to > synchronize access with other threads that may be using the AioContext. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > blockdev.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/blockdev.c b/blockdev.c > index 18712d2..d611779 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -1120,6 +1120,9 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > if (!strcmp(device, "all")) { > ret = bdrv_commit_all(); > } else { > + BlockDriverState *bs; > + AioContext *aio_context; > + > blk = blk_by_name(device); > if (!blk) { > monitor_printf(mon, "Device '%s' not found\n", device); > @@ -1129,7 +1132,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > monitor_printf(mon, "Device '%s' has no medium\n", device); > return; > } > - ret = bdrv_commit(blk_bs(blk)); > + > + bs = blk_bs(blk); > + aio_context = bdrv_get_aio_context(bs); > + aio_context_acquire(aio_context); > + > + ret = bdrv_commit(bs); > + > + aio_context_release(aio_context); > } > if (ret < 0) { > monitor_printf(mon, "'commit' error for '%s': %s\n", device, > -- > 2.4.3 > > Reviewed-by: Jeff Cody <jcody@redhat.com>
On 10/30/2015 06:57 PM, Stefan Hajnoczi wrote: > This one slipped through. Although we acquire AioContext when > committing all devices we don't for just a single device. > > AioContext must be acquired before calling bdrv_*() functions to > synchronize access with other threads that may be using the AioContext. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > blockdev.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/blockdev.c b/blockdev.c > index 18712d2..d611779 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -1120,6 +1120,9 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > if (!strcmp(device, "all")) { > ret = bdrv_commit_all(); > } else { > + BlockDriverState *bs; > + AioContext *aio_context; > + > blk = blk_by_name(device); > if (!blk) { > monitor_printf(mon, "Device '%s' not found\n", device); > @@ -1129,7 +1132,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > monitor_printf(mon, "Device '%s' has no medium\n", device); > return; > } > - ret = bdrv_commit(blk_bs(blk)); > + > + bs = blk_bs(blk); > + aio_context = bdrv_get_aio_context(bs); > + aio_context_acquire(aio_context); > + > + ret = bdrv_commit(bs); > + > + aio_context_release(aio_context); > } > if (ret < 0) { > monitor_printf(mon, "'commit' error for '%s': %s\n", device, I like it in general, but could you pls wait a bit before pushing it up. I am working at the moment on a more generic series. I am going to attach this patch to it to consider the situation as a whole. It would be much trickier than my previous one. There are several other places discovered. Den
On Sun, Nov 01, 2015 at 08:50:36PM +0300, Denis V. Lunev wrote: > On 10/30/2015 06:57 PM, Stefan Hajnoczi wrote: > >This one slipped through. Although we acquire AioContext when > >committing all devices we don't for just a single device. > > > >AioContext must be acquired before calling bdrv_*() functions to > >synchronize access with other threads that may be using the AioContext. > > > >Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > >--- > > blockdev.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > >diff --git a/blockdev.c b/blockdev.c > >index 18712d2..d611779 100644 > >--- a/blockdev.c > >+++ b/blockdev.c > >@@ -1120,6 +1120,9 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > > if (!strcmp(device, "all")) { > > ret = bdrv_commit_all(); > > } else { > >+ BlockDriverState *bs; > >+ AioContext *aio_context; > >+ > > blk = blk_by_name(device); > > if (!blk) { > > monitor_printf(mon, "Device '%s' not found\n", device); > >@@ -1129,7 +1132,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict) > > monitor_printf(mon, "Device '%s' has no medium\n", device); > > return; > > } > >- ret = bdrv_commit(blk_bs(blk)); > >+ > >+ bs = blk_bs(blk); > >+ aio_context = bdrv_get_aio_context(bs); > >+ aio_context_acquire(aio_context); > >+ > >+ ret = bdrv_commit(bs); > >+ > >+ aio_context_release(aio_context); > > } > > if (ret < 0) { > > monitor_printf(mon, "'commit' error for '%s': %s\n", device, > I like it in general, but could you pls wait a bit before pushing > it up. I am working at the moment on a more generic series. > I am going to attach this patch to it to consider the situation > as a whole. > > It would be much trickier than my previous one. There are > several other places discovered. Sure. We need to solve the missing AioContext acquires by hard freeze (2015-11-12, see http://qemu-project.org/Planning/2.5). Until then we can discuss different solutions. Stefan
diff --git a/blockdev.c b/blockdev.c index 18712d2..d611779 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1120,6 +1120,9 @@ void hmp_commit(Monitor *mon, const QDict *qdict) if (!strcmp(device, "all")) { ret = bdrv_commit_all(); } else { + BlockDriverState *bs; + AioContext *aio_context; + blk = blk_by_name(device); if (!blk) { monitor_printf(mon, "Device '%s' not found\n", device); @@ -1129,7 +1132,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict) monitor_printf(mon, "Device '%s' has no medium\n", device); return; } - ret = bdrv_commit(blk_bs(blk)); + + bs = blk_bs(blk); + aio_context = bdrv_get_aio_context(bs); + aio_context_acquire(aio_context); + + ret = bdrv_commit(bs); + + aio_context_release(aio_context); } if (ret < 0) { monitor_printf(mon, "'commit' error for '%s': %s\n", device,
This one slipped through. Although we acquire AioContext when committing all devices we don't for just a single device. AioContext must be acquired before calling bdrv_*() functions to synchronize access with other threads that may be using the AioContext. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- blockdev.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)