[GSoC][PATCH v2 3/6] qemu_domainjob: `maxQueuedJobs` added to `qemuDomainJobPrivate`

Erik Skultety eskultet at redhat.com
Tue Aug 18 08:48:23 UTC 2020


On Mon, Aug 17, 2020 at 10:37:18AM +0530, Prathamesh Chavan wrote:
> Reference to `maxQueuedJobs` required us to access
> config of the qemu-driver. And creating its copy in
> the `qemuDomainJob` helped us access the variable
> without referencing the driver's config.
>
> Signed-off-by: Prathamesh Chavan <pc44800 at gmail.com>
> ---
>  src/qemu/qemu_domain.c    |  5 ++++-
>  src/qemu/qemu_domainjob.c | 13 +++++++------
>  src/qemu/qemu_domainjob.h |  4 +++-
>  3 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 1ae44ae39f..677fa7ea91 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -2085,11 +2085,14 @@ static void *
>  qemuDomainObjPrivateAlloc(void *opaque)
>  {
>      qemuDomainObjPrivatePtr priv;
> +    virQEMUDriverPtr driver = opaque;
> +    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
>
>      if (VIR_ALLOC(priv) < 0)
>          return NULL;
>
> -    if (qemuDomainObjInitJob(&priv->job, &qemuPrivateJobCallbacks) < 0) {
> +    if (qemuDomainObjInitJob(&priv->job, &qemuPrivateJobCallbacks,
> +                             cfg->maxQueuedJobs) < 0) {
>          virReportSystemError(errno, "%s",
>                               _("Unable to init qemu driver mutexes"));
>          goto error;
> diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c
> index 7cd1aabd9e..eebc144747 100644
> --- a/src/qemu/qemu_domainjob.c
> +++ b/src/qemu/qemu_domainjob.c
> @@ -117,10 +117,12 @@ qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
>
>  int
>  qemuDomainObjInitJob(qemuDomainJobObjPtr job,
> -                     qemuDomainObjPrivateJobCallbacksPtr cb)
> +                     qemuDomainObjPrivateJobCallbacksPtr cb,
> +                     unsigned int maxQueuedJobs)
>  {
>      memset(job, 0, sizeof(*job));
>      job->cb = cb;
> +    job->maxQueuedJobs = maxQueuedJobs;
>
>      if (!(job->privateData = job->cb->allocJobPrivate()))
>          return -1;
> @@ -344,7 +346,6 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
>      unsigned long long then;
>      bool nested = job == QEMU_JOB_ASYNC_NESTED;
>      bool async = job == QEMU_JOB_ASYNC;
> -    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
>      const char *blocker = NULL;
>      const char *agentBlocker = NULL;
>      int ret = -1;
> @@ -370,8 +371,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
>
>   retry:
>      if ((!async && job != QEMU_JOB_DESTROY) &&
> -        cfg->maxQueuedJobs &&
> -        priv->job.jobs_queued > cfg->maxQueuedJobs) {
> +        priv->job.maxQueuedJobs &&
> +        priv->job.jobs_queued > priv->job.maxQueuedJobs) {
>          goto error;
>      }
>
> @@ -501,8 +502,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
>                             _("cannot acquire state change lock"));
>          }
>          ret = -2;
> -    } else if (cfg->maxQueuedJobs &&
> -               priv->job.jobs_queued > cfg->maxQueuedJobs) {
> +    } else if (priv->job.maxQueuedJobs &&
> +               priv->job.jobs_queued > priv->job.maxQueuedJobs) {
>          if (blocker && agentBlocker) {
>              virReportError(VIR_ERR_OPERATION_FAILED,
>                             _("cannot acquire state change "
> diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h
> index 0696b79fe3..11e7f2f432 100644
> --- a/src/qemu/qemu_domainjob.h
> +++ b/src/qemu/qemu_domainjob.h
> @@ -153,6 +153,7 @@ struct _qemuDomainJobObj {
>      unsigned long apiFlags; /* flags passed to the API which started the async job */
>
>      int jobs_queued;
> +    unsigned int maxQueuedJobs;
>
>      void *privateData;                  /* job specific collection of data */
>      qemuDomainObjPrivateJobCallbacksPtr cb;

The comment below applies to both 2/6 and 3/6.

Looking at this again, I don't think we want to move any of the jobs_queued or
maxQueuedJobs attributes to the job structure, I'm sorry I didn't spot this
right away in the previous revision of the series, I take responsibility for
it.
The job structure represents a single job, so from the design POV,
referencing both jobs_queued (which is really tied to a domain) and
maxQueuedJobs (which is a global driver setting) from within the job structure
simply doesn't feel right. Instead, I think qemuDomainObjBeginJobInternal will
simply have to be split in parts specific to QEMU that have access to the
driver and hypervisor-agnostic bits that can be moved to src/hypervisor.

Erik




More information about the libvir-list mailing list