[libvirt] [PATCH] cpumap: optimize for clients that don't need online count

Laine Stump laine at laine.org
Fri Nov 2 02:17:42 UTC 2012


On 11/01/2012 09:57 PM, Eric Blake wrote:
> It turns out that calling virNodeGetCPUMap(conn, NULL, NULL, 0)
> is both useful, and with Viktor's patches, common enough to
> optimize.  Since this interface hasn't been released yet, we
> can change the RPC call.
>
> * src/nodeinfo.c (nodeGetCPUMap): Avoid bitmap when not needed.
> * src/remote/remote_protocol.x (remote_node_get_cpu_map_args):
> Supply two separate flags for needed arguments.
> * src/remote/remote_driver.c (remoteNodeGetCPUMap): Update
> caller.
> * daemon/remote.c (remoteDispatchNodeGetCPUMap): Likewise.
> * src/remote_protocol-structs: Regenerate.
> ---
>
> This has to be applied before 1.0.0 if we want it; otherwise the
> change to RPC wire protocol will render this patch an ABI break.
>
> I thought of one alternative, that wouldn't change the RPC size,
> but still would be a difference.  That would be using the old
> need_results int as a bitmap of which of the two arguments are
> needed, instead of just a 1 or 0.  But even that is risky enough
> that it should get in before we commit to this interface.
>
>  daemon/remote.c              | 8 ++++----
>  src/nodeinfo.c               | 3 +++
>  src/remote/remote_driver.c   | 3 ++-
>  src/remote/remote_protocol.x | 3 ++-
>  src/remote_protocol-structs  | 3 ++-
>  5 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 7a9df60..340d07d 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -4578,7 +4578,7 @@ remoteDispatchNodeGetCPUMap(virNetServerPtr server ATTRIBUTE_UNUSED,
>                              remote_node_get_cpu_map_ret *ret)
>  {
>      unsigned char *cpumap = NULL;
> -    unsigned int online;
> +    unsigned int online = 0;
>      unsigned int flags;
>      int cpunum;
>      int rv = -1;
> @@ -4592,13 +4592,13 @@ remoteDispatchNodeGetCPUMap(virNetServerPtr server ATTRIBUTE_UNUSED,
>
>      flags = args->flags;
>
> -    cpunum = virNodeGetCPUMap(priv->conn, args->need_results ? &cpumap : NULL,
> -                              &online, flags);
> +    cpunum = virNodeGetCPUMap(priv->conn, args->need_map ? &cpumap : NULL,
> +                              args->need_online ? &online : NULL, flags);
>      if (cpunum < 0)
>          goto cleanup;
>
>      /* 'serialize' return cpumap */
> -    if (args->need_results) {
> +    if (args->need_map) {
>          ret->cpumap.cpumap_len = VIR_CPU_MAPLEN(cpunum);
>          ret->cpumap.cpumap_val = (char *) cpumap;
>          cpumap = NULL;
> diff --git a/src/nodeinfo.c b/src/nodeinfo.c
> index 35c5f96..3348ae7 100644
> --- a/src/nodeinfo.c
> +++ b/src/nodeinfo.c
> @@ -1277,6 +1277,9 @@ nodeGetCPUMap(virConnectPtr conn ATTRIBUTE_UNUSED,
>
>      virCheckFlags(0, -1);
>
> +    if (!cpumap && !online)
> +        return nodeGetCPUCount();
> +
>      if (!(cpus = nodeGetCPUBitmap(&maxpresent)))
>          goto cleanup;
>
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 71218f0..5eca0fa 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -5793,7 +5793,8 @@ remoteNodeGetCPUMap(virConnectPtr conn,
>
>      remoteDriverLock(priv);
>
> -    args.need_results = !!cpumap;
> +    args.need_map = !!cpumap;
> +    args.need_online = !!online;
>      args.flags = flags;
>
>      memset (&ret, 0, sizeof(ret));
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 765ffcd..d6ac3c1 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -2671,7 +2671,8 @@ struct remote_node_get_memory_parameters_ret {
>  };
>
>  struct remote_node_get_cpu_map_args {
> -    int need_results;
> +    int need_map;
> +    int need_online;
>      unsigned int flags;
>  };
>
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index 567864a..6fe7213 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -2127,7 +2127,8 @@ struct remote_node_get_memory_parameters_ret {
>          int                        nparams;
>  };
>  struct remote_node_get_cpu_map_args {
> -        int                        need_results;
> +        int                        need_map;
> +        int                        need_online;
>          u_int                      flags;
>  };
>  struct remote_node_get_cpu_map_ret {


After a small bit of explaining the context surrounding the change on
IRC, I understand what's going on and the benefit, and I agree that it's
either now or never.

ACK.




More information about the libvir-list mailing list