[libvirt] [PATCH 1/4] qemu: Introduce qemuDomainAgentJob

John Ferlan jferlan at redhat.com
Wed Jun 13 22:04:57 UTC 2018



On 06/08/2018 09:45 AM, Michal Privoznik wrote:
> This enum will list all possible jobs for guest agent. The idea
> is when a thread needs to talk to guest agent only it will take
> the QEMU_AGENT_JOB instead of QEMU_JOB helping better
> concurrency.

Consider:

Introduce guest agent specific job categories to allow threads to run
agent monitor specific jobs while normal monitor jobs can also be running.

Alter _qemuDomainJobObj in order to duplicate certain fields that will
be used for guest agent specific tasks to increase concurrency and
throughput and reduce serialization.

> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c |  4 ++++
>  src/qemu/qemu_domain.h | 15 +++++++++++++++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 11c261db1a..b8e34c1c2c 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -93,6 +93,10 @@ VIR_ENUM_IMPL(qemuDomainJob, QEMU_JOB_LAST,
>                "async nested",
>  );
>  
> +VIR_ENUM_IMPL(qemuDomainAgentJob, QEMU_AGENT_JOB_LAST,
> +              "none"
> +);
> +

I think merging patch3 in here is perfectly reasonable, unless of course
you're looking to get your patch counts up to stay ahead of Peter ;-)

>  VIR_ENUM_IMPL(qemuDomainAsyncJob, QEMU_ASYNC_JOB_LAST,
>                "none",
>                "migration out",
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index f17157b951..709b42e6fd 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -82,6 +82,13 @@ typedef enum {
>  } qemuDomainJob;
>  VIR_ENUM_DECL(qemuDomainJob)
>  
> +typedef enum {
> +    QEMU_AGENT_JOB_NONE = 0,    /* No agent job. */
> +
> +    QEMU_AGENT_JOB_LAST
> +} qemuDomainAgentJob;
> +VIR_ENUM_DECL(qemuDomainAgentJob)
> +
>  /* Async job consists of a series of jobs that may change state. Independent
>   * jobs that do not change state (and possibly others if explicitly allowed by
>   * current async job) are allowed to be run even if async job is active.
> @@ -158,11 +165,19 @@ typedef struct _qemuDomainJobObj qemuDomainJobObj;
>  typedef qemuDomainJobObj *qemuDomainJobObjPtr;
>  struct _qemuDomainJobObj {
>      virCond cond;                       /* Use to coordinate jobs */
> +
> +    /* The following members are for QEMU_JOB_* */
>      qemuDomainJob active;               /* Currently running job */
>      unsigned long long owner;           /* Thread id which set current job */
>      const char *ownerAPI;               /* The API which owns the job */
>      unsigned long long started;         /* When the current job started */
>  
> +    /* The following members are for QEMU_AGENT_JOB_* */
> +    qemuDomainAgentJob agentActive;     /* Currently running agent job */

Hmm... I seem to recall a recent patch that spoke against using an enum
type for struct fields:

https://www.redhat.com/archives/libvir-list/2018-June/msg00486.html

While I know you're just copying the existing qemuDomainJob - this is
the kind of stuff that just gets copied around and used elsewhere.

> +    unsigned long long agentOwner;      /* Thread id which set current agent job */
> +    const char *agentOwnerAPI;          /* The API which owns the agent job */
> +    unsigned long long agentStarted;    /* When the current agent job started */
> +

FWIW: From the description in the next patch, I would think there would
need to be an agentCond variable too.  But reading patch 4 I know that's
not quite the case. I have concerns over the combined @cond usage, but
those are only towards some "future change" that misses some subtlety.

And the following few fields are for async jobs - may as well add a
comment here too...

John

>      virCond asyncCond;                  /* Use to coordinate with async jobs */
>      qemuDomainAsyncJob asyncJob;        /* Currently active async job */
>      unsigned long long asyncOwner;      /* Thread which set current async job */
> 




More information about the libvir-list mailing list