qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [Qemu-devel] [PATCH 08/17] throttle-groups: protect thr


From: Fam Zheng
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH 08/17] throttle-groups: protect throttled requests with a CoMutex
Date: Thu, 4 May 2017 14:57:48 +0800
User-agent: Mutt/1.8.0 (2017-02-23)

On Thu, 04/20 14:00, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>  block/block-backend.c          |  1 +
>  block/throttle-groups.c        | 11 +++++++++--
>  include/sysemu/block-backend.h |  7 ++-----
>  3 files changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/block/block-backend.c b/block/block-backend.c
> index 915ccc5..a37d74d 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -163,6 +163,7 @@ BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm)
>      blk->shared_perm = shared_perm;
>      blk_set_enable_write_cache(blk, true);
>  
> +    qemu_co_mutex_init(&blk->public.reqs_lock);
>      qemu_co_queue_init(&blk->public.throttled_reqs[0]);
>      qemu_co_queue_init(&blk->public.throttled_reqs[1]);
>  
> diff --git a/block/throttle-groups.c b/block/throttle-groups.c
> index d66bf62..695d28d 100644
> --- a/block/throttle-groups.c
> +++ b/block/throttle-groups.c
> @@ -268,8 +268,13 @@ static bool throttle_group_schedule_timer(BlockBackend 
> *blk, bool is_write)
>  static bool throttle_group_co_restart_queue(BlockBackend *blk, bool is_write)
>  {
>      BlockBackendPublic *blkp = blk_get_public(blk);
> +    bool ret;
>  
> -    return qemu_co_queue_next(&blkp->throttled_reqs[is_write]);
> +    qemu_co_mutex_lock(&blkp->reqs_lock);
> +    ret = qemu_co_queue_next(&blkp->throttled_reqs[is_write]);
> +    qemu_co_mutex_unlock(&blkp->reqs_lock);
> +
> +    return ret;
>  }
>  
>  /* Look for the next pending I/O request and schedule it.
> @@ -338,7 +343,9 @@ void coroutine_fn 
> throttle_group_co_io_limits_intercept(BlockBackend *blk,
>      if (must_wait || blkp->pending_reqs[is_write]) {
>          blkp->pending_reqs[is_write]++;
>          qemu_mutex_unlock(&tg->lock);
> -        qemu_co_queue_wait(&blkp->throttled_reqs[is_write], NULL);
> +        qemu_co_mutex_lock(&blkp->reqs_lock);
> +        qemu_co_queue_wait(&blkp->throttled_reqs[is_write], 
> &blkp->reqs_lock);
> +        qemu_co_mutex_unlock(&blkp->reqs_lock);
>          qemu_mutex_lock(&tg->lock);
>          blkp->pending_reqs[is_write]--;
>      }
> diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
> index 87a43b0..e9529fb 100644
> --- a/include/sysemu/block-backend.h
> +++ b/include/sysemu/block-backend.h
> @@ -72,11 +72,8 @@ typedef struct BlockDevOps {
>   * fields that must be public. This is in particular for QLIST_ENTRY() and
>   * friends so that BlockBackends can be kept in lists outside 
> block-backend.c */
>  typedef struct BlockBackendPublic {
> -    /* I/O throttling has its own locking, but also some fields are
> -     * protected by the AioContext lock.
> -     */
> -
> -    /* Protected by AioContext lock.  */
> +    /* reqs_lock protects the CoQueues for throttled requests.  */
> +    CoMutex      reqs_lock;

Bikeshedding: will it be more readable if it's called throttled_reqs_lock or
throttled_lock?

Fam

>      CoQueue      throttled_reqs[2];
>  
>      /* Nonzero if the I/O limits are currently being ignored; generally
> -- 
> 2.9.3
> 
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]