[libvirt] [PATCH 11/17] Introduce remoteDomainPinHypervisorFlags and remoteDomainGetHypervisorPinInfo functions in remote driver.

Eric Blake eblake at redhat.com
Tue Aug 7 17:14:21 UTC 2012


On 08/03/2012 12:36 AM, Hu Tao wrote:
> From: Tang Chen <tangchen at cn.fujitsu.com>

Again, a long subject line.  Given Dan's rename suggestion, I propose:

remote: introduce emulator pinning RPCs

>  
>  static int
> +remoteDispatchDomainPinHypervisorFlags(virNetServerPtr server ATTRIBUTE_UNUSED,

No need for the 'Flags' suffix in the name.

> +
> +static int
> +remoteDispatchDomainGetHypervisorPinInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                         virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +                                         virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                         virNetMessageErrorPtr rerr,
> +                                         remote_domain_get_hypervisor_pin_info_args *args,
> +                                         remote_domain_get_hypervisor_pin_info_ret *ret)
> +{
> +    virDomainPtr dom = NULL;
> +    unsigned char *cpumaps = NULL;
> +    int num;
> +    int rv = -1;
> +    struct daemonClientPrivate *priv =
> +        virNetServerClientGetPrivateData(client);
> +
> +    if (!priv->conn) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
> +        goto cleanup;
> +    }
> +
> +    if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
> +        goto cleanup;
> +
> +    /* There is only one cpumap struct for all hypervisor threads */
> +    if (args->ncpumaps != 1) {

If that's true, then we don't need args->ncpumaps in the first place.
That's a tweak to make in the .x file.

> +++ b/src/remote/remote_driver.c
> @@ -1841,6 +1841,106 @@ done:
>  }
>  
>  static int
> +remoteDomainPinHypervisorFlags (virDomainPtr dom,
> +                                unsigned char *cpumap,
> +                                int cpumaplen,
> +                                unsigned int flags)
> +{
> +    int rv = -1;
> +    struct private_data *priv = dom->conn->privateData;
> +    remote_domain_pin_hypervisor_flags_args args;
> +
> +    remoteDriverLock(priv);
> +
> +    if (cpumaplen > REMOTE_CPUMAP_MAX) {
> +        virReportError(VIR_ERR_RPC,
> +                       _("%s length greater than maximum: %d > %d"),
> +                       "cpumap", (int)cpumaplen, REMOTE_CPUMAP_MAX);

Why are we casting cpumaplen, which is already an int?


> +static int
> +remoteDomainGetHypervisorPinInfo (virDomainPtr domain,
> +                                  unsigned char *cpumaps,
> +                                  int maplen,
> +                                  unsigned int flags)
> +{
> +    int rv = -1;
> +    int i;
> +    remote_domain_get_hypervisor_pin_info_args args;
> +    remote_domain_get_hypervisor_pin_info_ret ret;
> +    struct private_data *priv = domain->conn->privateData;
> +
> +    remoteDriverLock(priv);
> +
> +    /* There is only one cpumap for all hypervisor threads */
> +    if (INT_MULTIPLY_OVERFLOW(1, maplen) ||

This expression is always false ('1 * anything' cannot overflow), and
therefore dead code worth simplifying.

> @@ -5254,6 +5354,8 @@ static virDriver remote_driver = {
>      .domainPinVcpu = remoteDomainPinVcpu, /* 0.3.0 */
>      .domainPinVcpuFlags = remoteDomainPinVcpuFlags, /* 0.9.3 */
>      .domainGetVcpuPinInfo = remoteDomainGetVcpuPinInfo, /* 0.9.3 */
> +    .domainPinHypervisorFlags = remoteDomainPinHypervisorFlags, /* 0.9.13 */
> +    .domainGetHypervisorPinInfo = remoteDomainGetHypervisorPinInfo, /* 0.9.13 */

0.10.0

> +++ b/src/remote/remote_protocol.x
> @@ -1054,6 +1054,25 @@ struct remote_domain_get_vcpu_pin_info_ret {
>      int num;
>  };
>  
> +struct remote_domain_pin_hypervisor_flags_args {

Again, no need for '_flags' in the name.

> +    remote_nonnull_domain dom;
> +    unsigned int vcpu;

No need for a wasted 'vcpu' arg.

> +    opaque cpumap<REMOTE_CPUMAP_MAX>; /* (unsigned char *) */
> +    unsigned int flags;
> +};
> +
> +struct remote_domain_get_hypervisor_pin_info_args {
> +    remote_nonnull_domain dom;
> +    int ncpumaps;

No need for an 'ncpumaps' arg.

> +    int maplen;
> +    unsigned int flags;
> +};
> +
> +struct remote_domain_get_hypervisor_pin_info_ret {
> +    opaque cpumaps<REMOTE_CPUMAPS_MAX>;
> +    int num;

'num' is a bit misleading for a name, and probably not necessary.  The
return value of virDomainGetHypervisorPinInfo is either 0 (no pinning
present) or 1 (pinning present and details returned) (or negative for
error, but that doesn't go through this RPC struct).  If RPC allows for
0-length cpumaps<>, then you don't need num; otherwise, I'd rename num
to 'ret', since it is recording the return value of 0 or 1.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120807/8175beeb/attachment-0001.sig>


More information about the libvir-list mailing list