All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Cody <jcody@redhat.com>
To: John Snow <jsnow@redhat.com>
Cc: qemu-block@nongnu.org, kwolf@redhat.com, qemu-devel@nongnu.org,
	stefanha@redhat.com, mreitz@redhat.com, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2] blockjob: kick jobs on set-speed
Date: Thu, 14 Dec 2017 15:58:28 -0500	[thread overview]
Message-ID: <20171214205828.GG20604@localhost.localdomain> (raw)
In-Reply-To: <20171213204611.26276-1-jsnow@redhat.com>

On Wed, Dec 13, 2017 at 03:46:11PM -0500, John Snow wrote:
> If users set an unreasonably low speed (like one byte per second), the
> calculated delay may exceed many hours. While we like to punish users
> for asking for stupid things, we do also like to allow users to correct
> their wicked ways.
> 
> When a user provides a new speed, kick the job to allow it to recalculate
> its delay.
> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
> 
> RFC: Why is block_job_mutex shared between all jobs,
>      instead of being per-job?
>

The mutex protects job-specific fields of job->busy and job->sleep_timer, so
I think the mutex should be specific to job, not global across all jobs.


>  blockjob.c | 30 +++++++++++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/blockjob.c b/blockjob.c
> index 715c2c2680..6173e4728c 100644
> --- a/blockjob.c
> +++ b/blockjob.c
> @@ -59,6 +59,7 @@ static void __attribute__((__constructor__)) block_job_init(void)
>  
>  static void block_job_event_cancelled(BlockJob *job);
>  static void block_job_event_completed(BlockJob *job, const char *msg);
> +static void block_job_enter_cond(BlockJob *job, bool(*fn)(BlockJob *job));
>  
>  /* Transactional group of block jobs */
>  struct BlockJobTxn {
> @@ -480,9 +481,16 @@ static void block_job_completed_txn_success(BlockJob *job)
>      }
>  }
>  
> +/* Assumes the block_job_mutex is held */
> +static bool block_job_timer_pending(BlockJob *job)
> +{
> +    return timer_pending(&job->sleep_timer);
> +}
> +
>  void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
>  {
>      Error *local_err = NULL;
> +    int64_t old_speed = job->speed;
>  
>      if (!job->driver->set_speed) {
>          error_setg(errp, QERR_UNSUPPORTED);
> @@ -495,6 +503,12 @@ void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
>      }
>  
>      job->speed = speed;
> +    if (speed <= old_speed) {
> +        return;
> +    }
> +
> +    /* kick only if a timer is pending */
> +    block_job_enter_cond(job, block_job_timer_pending);
>  }
>  
>  void block_job_complete(BlockJob *job, Error **errp)
> @@ -821,7 +835,11 @@ void block_job_resume_all(void)
>      }
>  }
>  
> -void block_job_enter(BlockJob *job)
> +/*
> + * Conditionally enter a block_job pending a call to fn() while
> + * under the block_job_lock critical section.
> + */
> +static void block_job_enter_cond(BlockJob *job, bool(*fn)(BlockJob *job))
>  {
>      if (!block_job_started(job)) {
>          return;
> @@ -836,6 +854,11 @@ void block_job_enter(BlockJob *job)
>          return;
>      }
>  
> +    if (fn && !fn(job)) {
> +        block_job_unlock();
> +        return;
> +    }
> +
>      assert(!job->deferred_to_main_loop);
>      timer_del(&job->sleep_timer);
>      job->busy = true;
> @@ -843,6 +866,11 @@ void block_job_enter(BlockJob *job)
>      aio_co_wake(job->co);
>  }
>  
> +void block_job_enter(BlockJob *job)
> +{
> +    block_job_enter_cond(job, NULL);
> +}
> +
>  bool block_job_is_cancelled(BlockJob *job)
>  {
>      return job->cancelled;
> -- 
> 2.14.3
>



Thanks,

Applied to my block branch:

git://github.com/codyprime/qemu-kvm-jtc block

-Jeff

      parent reply	other threads:[~2017-12-14 20:58 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-13 20:46 [Qemu-devel] [PATCH v2] blockjob: kick jobs on set-speed John Snow
2017-12-13 21:19 ` Paolo Bonzini
2017-12-14  9:42 ` Stefan Hajnoczi
2017-12-14 20:58 ` Jeff Cody [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171214205828.GG20604@localhost.localdomain \
    --to=jcody@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.