diff mbox

[3/3] blockdev: acquire AioContext in block_set_io_throttle

Message ID 1400077367-23409-4-git-send-email-stefanha@redhat.com
State New
Headers show

Commit Message

Stefan Hajnoczi May 14, 2014, 2:22 p.m. UTC
The block_set_io_throttle QMP and HMP commands modify I/O throttling
limits for block devices.

Acquire the BlockDriverState's AioContext to protect against race
conditions with an IOThread that is running I/O for this device.

Cc: Benoît Canet <benoit.canet@irqsave.net>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 blockdev.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Benoît Canet May 14, 2014, 3:11 p.m. UTC | #1
The Wednesday 14 May 2014 à 16:22:47 (+0200), Stefan Hajnoczi wrote :G
> The block_set_io_throttle QMP and HMP commands modify I/O throttling
> limits for block devices.
> 
> Acquire the BlockDriverState's AioContext to protect against race
> conditions with an IOThread that is running I/O for this device.
> 
> Cc: Benoît Canet <benoit.canet@irqsave.net>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>  blockdev.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/blockdev.c b/blockdev.c
> index 7810e9f..e0f1978 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1663,6 +1663,7 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
>  {
>      ThrottleConfig cfg;
>      BlockDriverState *bs;
> +    AioContext *aio_context;
>  
>      bs = bdrv_find(device);
>      if (!bs) {
> @@ -1706,6 +1707,9 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
>          return;
>      }
>  
> +    aio_context = bdrv_get_aio_context(bs);
> +    aio_context_acquire(aio_context);
> +
>      if (!bs->io_limits_enabled && throttle_enabled(&cfg)) {
>          bdrv_io_limits_enable(bs);
>      } else if (bs->io_limits_enabled && !throttle_enabled(&cfg)) {
> @@ -1715,6 +1719,8 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
>      if (bs->io_limits_enabled) {
>          bdrv_set_io_limits(bs, &cfg);
>      }
> +
> +    aio_context_release(aio_context);
>  }
>  
>  int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
> -- 
> 1.9.0
> 
Reviewed-by: Benoit Canet <benoit@irqsave.net>
diff mbox

Patch

diff --git a/blockdev.c b/blockdev.c
index 7810e9f..e0f1978 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1663,6 +1663,7 @@  void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
 {
     ThrottleConfig cfg;
     BlockDriverState *bs;
+    AioContext *aio_context;
 
     bs = bdrv_find(device);
     if (!bs) {
@@ -1706,6 +1707,9 @@  void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
         return;
     }
 
+    aio_context = bdrv_get_aio_context(bs);
+    aio_context_acquire(aio_context);
+
     if (!bs->io_limits_enabled && throttle_enabled(&cfg)) {
         bdrv_io_limits_enable(bs);
     } else if (bs->io_limits_enabled && !throttle_enabled(&cfg)) {
@@ -1715,6 +1719,8 @@  void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
     if (bs->io_limits_enabled) {
         bdrv_set_io_limits(bs, &cfg);
     }
+
+    aio_context_release(aio_context);
 }
 
 int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)