All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-stable@nongnu.org, jsnow@redhat.com,
	qemu-devel@nongnu.org, mreitz@redhat.com
Subject: Re: [PATCH v3 1/9] job: refactor progress to separate object
Date: Tue, 10 Mar 2020 15:22:19 +0300	[thread overview]
Message-ID: <2807c754-8528-ee58-bf67-beeaea13cdfd@virtuozzo.com> (raw)
In-Reply-To: <20200306073831.7737-2-vsementsov@virtuozzo.com>

On 06/03/2020 10:38, Vladimir Sementsov-Ogievskiy wrote:
> We need it in separate to pass to the block-copy object in the next
> commit.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
> ---
>   include/qemu/job.h            | 11 ++-----
>   include/qemu/progress_meter.h | 58 +++++++++++++++++++++++++++++++++++
>   blockjob.c                    | 16 +++++-----
>   job-qmp.c                     |  4 +--
>   job.c                         |  6 ++--
>   qemu-img.c                    |  6 ++--
>   6 files changed, 76 insertions(+), 25 deletions(-)
>   create mode 100644 include/qemu/progress_meter.h
> 
> diff --git a/include/qemu/job.h b/include/qemu/job.h
> index bd59cd8944..32aabb1c60 100644
> --- a/include/qemu/job.h
> +++ b/include/qemu/job.h
> @@ -28,6 +28,7 @@
>   
>   #include "qapi/qapi-types-job.h"
>   #include "qemu/queue.h"
> +#include "qemu/progress_meter.h"
>   #include "qemu/coroutine.h"
>   #include "block/aio.h"
>   
> @@ -117,15 +118,7 @@ typedef struct Job {
>       /** True if this job should automatically dismiss itself */
>       bool auto_dismiss;
>   
> -    /**
> -     * Current progress. The unit is arbitrary as long as the ratio between
> -     * progress_current and progress_total represents the estimated percentage
> -     * of work already done.
> -     */
> -    int64_t progress_current;
> -
> -    /** Estimated progress_current value at the completion of the job */
> -    int64_t progress_total;
> +    ProgressMeter progress;
>   
>       /**
>        * Return code from @run and/or @prepare callback(s).
> diff --git a/include/qemu/progress_meter.h b/include/qemu/progress_meter.h
> new file mode 100644
> index 0000000000..9a23ff071c
> --- /dev/null
> +++ b/include/qemu/progress_meter.h
> @@ -0,0 +1,58 @@
> +/*
> + * Helper functionality for some process progress tracking.
> + *
> + * Copyright (c) 2011 IBM Corp.
> + * Copyright (c) 2012, 2018 Red Hat, Inc.
> + * Copyright (c) 2020 Virtuozzo International GmbH
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#ifndef QEMU_PROGRESS_METER_H
> +#define QEMU_PROGRESS_METER_H
> +
> +typedef struct ProgressMeter {
> +    /**
> +     * Current progress. The unit is arbitrary as long as the ratio between
> +     * current and total represents the estimated percentage
> +     * of work already done.
> +     */
> +    uint64_t current;
> +
> +    /** Estimated current value at the completion of the process */
> +    uint64_t total;
> +} ProgressMeter;
> +
> +static inline void progress_work_done(ProgressMeter *pm, uint64_t done)
> +{
> +    pm->current += done;
> +}
> +
> +static inline void progress_set_remaining(ProgressMeter *pm, uint64_t remaining)
> +{
> +    pm->total = pm->current + remaining;
> +}
> +
> +static inline void progress_increase_remaining(ProgressMeter *pm,
> +                                               uint64_t delta)
> +{
> +    pm->total += delta;
> +}
> +
> +#endif /* QEMU_PROGRESS_METER_H */
> diff --git a/blockjob.c b/blockjob.c
> index 5d63b1e89d..fc850312c1 100644
> --- a/blockjob.c
> +++ b/blockjob.c
> @@ -299,8 +299,8 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
>       info->device    = g_strdup(job->job.id);
>       info->busy      = atomic_read(&job->job.busy);
>       info->paused    = job->job.pause_count > 0;
> -    info->offset    = job->job.progress_current;
> -    info->len       = job->job.progress_total;
> +    info->offset    = job->job.progress.current;
> +    info->len       = job->job.progress.total;
>       info->speed     = job->speed;
>       info->io_status = job->iostatus;
>       info->ready     = job_is_ready(&job->job),
> @@ -330,8 +330,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
>   
>       qapi_event_send_block_job_cancelled(job_type(&job->job),
>                                           job->job.id,
> -                                        job->job.progress_total,
> -                                        job->job.progress_current,
> +                                        job->job.progress.total,
> +                                        job->job.progress.current,
>                                           job->speed);
>   }
>   
> @@ -350,8 +350,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
>   
>       qapi_event_send_block_job_completed(job_type(&job->job),
>                                           job->job.id,
> -                                        job->job.progress_total,
> -                                        job->job.progress_current,
> +                                        job->job.progress.total,
> +                                        job->job.progress.current,
>                                           job->speed,
>                                           !!msg,
>                                           msg);
> @@ -379,8 +379,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)
>   
>       qapi_event_send_block_job_ready(job_type(&job->job),
>                                       job->job.id,
> -                                    job->job.progress_total,
> -                                    job->job.progress_current,
> +                                    job->job.progress.total,
> +                                    job->job.progress.current,
>                                       job->speed);
>   }
>   
> diff --git a/job-qmp.c b/job-qmp.c
> index fbfed25a00..fecc939ebd 100644
> --- a/job-qmp.c
> +++ b/job-qmp.c
> @@ -143,8 +143,8 @@ static JobInfo *job_query_single(Job *job, Error **errp)
>           .id                 = g_strdup(job->id),
>           .type               = job_type(job),
>           .status             = job->status,
> -        .current_progress   = job->progress_current,
> -        .total_progress     = job->progress_total,
> +        .current_progress   = job->progress.current,
> +        .total_progress     = job->progress.total,
>           .has_error          = !!job->err,
>           .error              = job->err ? \
>                                 g_strdup(error_get_pretty(job->err)) : NULL,
> diff --git a/job.c b/job.c
> index 04409b40aa..134a07b92e 100644
> --- a/job.c
> +++ b/job.c
> @@ -369,17 +369,17 @@ void job_unref(Job *job)
>   
>   void job_progress_update(Job *job, uint64_t done)
>   {
> -    job->progress_current += done;
> +    progress_work_done(&job->progress, done);
>   }
>   
>   void job_progress_set_remaining(Job *job, uint64_t remaining)
>   {
> -    job->progress_total = job->progress_current + remaining;
> +    progress_set_remaining(&job->progress, remaining);
>   }
>   
>   void job_progress_increase_remaining(Job *job, uint64_t delta)
>   {
> -    job->progress_total += delta;
> +    progress_increase_remaining(&job->progress, delta);
>   }
>   
>   void job_event_cancelled(Job *job)
> diff --git a/qemu-img.c b/qemu-img.c
> index 804630a368..59a720abf6 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -882,9 +882,9 @@ static void run_block_job(BlockJob *job, Error **errp)
>       do {
>           float progress = 0.0f;
>           aio_poll(aio_context, true);
> -        if (job->job.progress_total) {
> -            progress = (float)job->job.progress_current /
> -                       job->job.progress_total * 100.f;
> +        if (job->job.progress.total) {
> +            progress = (float)job->job.progress.current /
> +                       job->job.progress.total * 100.f;
>           }
>           qemu_progress_print(progress, 0);
>       } while (!job_is_ready(&job->job) && !job_is_completed(&job->job));
> 

Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
-- 
With the best regards,
Andrey Shinkevich


  reply	other threads:[~2020-03-10 12:23 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-06  7:38 [PATCH v3 0/9] block-copy improvements: part I Vladimir Sementsov-Ogievskiy
2020-03-06  7:38 ` [PATCH v3 1/9] job: refactor progress to separate object Vladimir Sementsov-Ogievskiy
2020-03-10 12:22   ` Andrey Shinkevich [this message]
2020-03-10 12:40   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 2/9] block/block-copy: fix progress calculation Vladimir Sementsov-Ogievskiy
2020-03-10 13:32   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 3/9] block/block-copy: specialcase first copy_range request Vladimir Sementsov-Ogievskiy
2020-03-10 13:42   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 4/9] block/block-copy: use block_status Vladimir Sementsov-Ogievskiy
2020-03-10 14:21   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 5/9] block/block-copy: factor out find_conflicting_inflight_req Vladimir Sementsov-Ogievskiy
2020-03-10 14:27   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 6/9] block/block-copy: refactor interfaces to use bytes instead of end Vladimir Sementsov-Ogievskiy
2020-03-10 14:44   ` Max Reitz
2020-03-06  7:38 ` [PATCH v3 7/9] block/block-copy: rename start to offset in interfaces Vladimir Sementsov-Ogievskiy
2020-03-10 14:50   ` Max Reitz
2020-03-10 14:55     ` Andrey Shinkevich
2020-03-10 15:14       ` Max Reitz
2020-03-10 16:15         ` Andrey Shinkevich
2020-03-06  7:38 ` [PATCH v3 8/9] block/block-copy: reduce intersecting request lock Vladimir Sementsov-Ogievskiy
2020-03-10 15:32   ` Max Reitz
2020-03-11  9:39     ` Vladimir Sementsov-Ogievskiy
2020-03-06  7:38 ` [PATCH v3 9/9] block/block-copy: hide structure definitions Vladimir Sementsov-Ogievskiy
2020-03-10 14:55   ` Andrey Shinkevich
2020-03-10 15:38   ` Max Reitz

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=2807c754-8528-ee58-bf67-beeaea13cdfd@virtuozzo.com \
    --to=andrey.shinkevich@virtuozzo.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    --cc=vsementsov@virtuozzo.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.