[libvirt] [PATCH 17/40] Simplify the Xen domain get/set (max) memory driver methods

Jim Fehlig jfehlig at suse.com
Tue May 7 04:18:30 UTC 2013


Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Simplify the Xen memory limit driver methods to directly call
> the most appropriate sub-driver
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/xen/xen_driver.c     | 50 ++++++++++-----------------
>  src/xen/xen_driver.h     |  3 --
>  src/xen/xen_hypervisor.c | 35 ++++---------------
>  src/xen/xen_hypervisor.h |  3 +-
>  src/xen/xend_internal.c  | 15 --------
>  src/xen/xm_internal.c    | 16 +++++----
>  src/xen/xs_internal.c    | 90 ------------------------------------------------
>  src/xen/xs_internal.h    |  4 ---
>  8 files changed, 36 insertions(+), 180 deletions(-)
>   

Another nice cleanup. I've tested this one as well and didn't notice any
problems. ACK.

I'll have to continue with the reviews tomorrow.

Regards,
Jim

> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 8ee3c4c..7d09c6b 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -801,53 +801,41 @@ static unsigned long long
>  xenUnifiedDomainGetMaxMemory(virDomainPtr dom)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    int i;
> -    unsigned long long ret;
> -
> -    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (priv->opened[i] && drivers[i]->xenDomainGetMaxMemory) {
> -            ret = drivers[i]->xenDomainGetMaxMemory(dom);
> -            if (ret != 0) return ret;
> -        }
>  
> -    return 0;
> +    if (dom->id < 0) {
> +        if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> +            return xenXMDomainGetMaxMemory(dom);
> +        else
> +            return xenDaemonDomainGetMaxMemory(dom);
> +    } else {
> +        return xenHypervisorGetMaxMemory(dom);
> +    }
>  }
>  
>  static int
>  xenUnifiedDomainSetMaxMemory(virDomainPtr dom, unsigned long memory)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    int i;
>  
> -    /* Prefer xend for setting max memory */
> -    if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
> -        if (xenDaemonDomainSetMaxMemory(dom, memory) == 0)
> -            return 0;
> +    if (dom->id < 0) {
> +        if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> +            return xenXMDomainSetMaxMemory(dom, memory);
> +        else
> +            return xenDaemonDomainSetMaxMemory(dom, memory);
> +    } else {
> +        return xenHypervisorSetMaxMemory(dom, memory);
>      }
> -
> -    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (i != XEN_UNIFIED_XEND_OFFSET &&
> -            priv->opened[i] &&
> -            drivers[i]->xenDomainSetMaxMemory &&
> -            drivers[i]->xenDomainSetMaxMemory(dom, memory) == 0)
> -            return 0;
> -
> -    return -1;
>  }
>  
>  static int
>  xenUnifiedDomainSetMemory(virDomainPtr dom, unsigned long memory)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    int i;
> -
> -    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (priv->opened[i] &&
> -            drivers[i]->xenDomainSetMemory &&
> -            drivers[i]->xenDomainSetMemory(dom, memory) == 0)
> -            return 0;
>  
> -    return -1;
> +    if (dom->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> +        return xenXMDomainSetMemory(dom, memory);
> +    else
> +        return xenDaemonDomainSetMemory(dom, memory);
>  }
>  
>  static int
> diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
> index 16e9743..4509161 100644
> --- a/src/xen/xen_driver.h
> +++ b/src/xen/xen_driver.h
> @@ -93,9 +93,6 @@ extern int xenRegister (void);
>   * structure with direct calls in xen_unified.c.
>   */
>  struct xenUnifiedDriver {
> -    virDrvDomainGetMaxMemory xenDomainGetMaxMemory;
> -    virDrvDomainSetMaxMemory xenDomainSetMaxMemory;
> -    virDrvDomainSetMemory xenDomainSetMemory;
>      virDrvDomainGetInfo xenDomainGetInfo;
>      virDrvDomainPinVcpu xenDomainPinVcpu;
>      virDrvDomainGetVcpus xenDomainGetVcpus;
> diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
> index 8636d52..7662843 100644
> --- a/src/xen/xen_hypervisor.c
> +++ b/src/xen/xen_hypervisor.c
> @@ -870,11 +870,7 @@ typedef struct xen_op_v2_dom xen_op_v2_dom;
>  # error "unsupported platform"
>  #endif
>  
> -static unsigned long long xenHypervisorGetMaxMemory(virDomainPtr domain);
> -
>  struct xenUnifiedDriver xenHypervisorDriver = {
> -    .xenDomainGetMaxMemory = xenHypervisorGetMaxMemory,
> -    .xenDomainSetMaxMemory = xenHypervisorSetMaxMemory,
>      .xenDomainGetInfo = xenHypervisorGetDomainInfo,
>      .xenDomainPinVcpu = xenHypervisorPinVcpu,
>      .xenDomainGetVcpus = xenHypervisorGetVcpus,
> @@ -2763,9 +2759,8 @@ xenHypervisorGetMaxVcpus(virConnectPtr conn ATTRIBUTE_UNUSED,
>  }
>  
>  /**
> - * xenHypervisorGetDomMaxMemory:
> - * @conn: connection data
> - * @id: domain id
> + * xenHypervisorDomMaxMemory:
> + * @dom: domain
>   *
>   * Retrieve the maximum amount of physical memory allocated to a
>   * domain.
> @@ -2773,9 +2768,9 @@ xenHypervisorGetMaxVcpus(virConnectPtr conn ATTRIBUTE_UNUSED,
>   * Returns the memory size in kilobytes or 0 in case of error.
>   */
>  unsigned long
> -xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id)
> +xenHypervisorGetMaxMemory(virDomainPtr dom)
>  {
> -    xenUnifiedPrivatePtr priv = conn->privateData;
> +    xenUnifiedPrivatePtr priv = dom->conn->privateData;
>      xen_getdomaininfo dominfo;
>      int ret;
>  
> @@ -2787,32 +2782,14 @@ xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id)
>  
>      XEN_GETDOMAININFO_CLEAR(dominfo);
>  
> -    ret = virXen_getdomaininfo(priv->handle, id, &dominfo);
> +    ret = virXen_getdomaininfo(priv->handle, dom->id, &dominfo);
>  
> -    if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id))
> +    if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != dom->id))
>          return 0;
>  
>      return (unsigned long) XEN_GETDOMAININFO_MAX_PAGES(dominfo) * kb_per_pages;
>  }
>  
> -/**
> - * xenHypervisorGetMaxMemory:
> - * @domain: a domain object or NULL
> - *
> - * Retrieve the maximum amount of physical memory allocated to a
> - * domain. If domain is NULL, then this get the amount of memory reserved
> - * to Domain0 i.e. the domain where the application runs.
> - *
> - * Returns the memory size in kilobytes or 0 in case of error.
> - */
> -static unsigned long long ATTRIBUTE_NONNULL(1)
> -xenHypervisorGetMaxMemory(virDomainPtr domain)
> -{
> -    if (domain->id < 0)
> -        return 0;
> -
> -    return xenHypervisorGetDomMaxMemory(domain->conn, domain->id);
> -}
>  
>  /**
>   * xenHypervisorGetDomInfo:
> diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h
> index 450b4f1..9748cf8 100644
> --- a/src/xen/xen_hypervisor.h
> +++ b/src/xen/xen_hypervisor.h
> @@ -68,8 +68,7 @@ virCapsPtr
>  char *
>          xenHypervisorGetCapabilities    (virConnectPtr conn);
>  unsigned long
> -        xenHypervisorGetDomMaxMemory    (virConnectPtr conn,
> -                                         int id);
> +        xenHypervisorGetMaxMemory(virDomainPtr dom);
>  int     xenHypervisorGetMaxVcpus        (virConnectPtr conn,
>                                           const char *type);
>  int     xenHypervisorGetDomainInfo        (virDomainPtr domain,
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 75c1514..ce7d3f6 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -1491,10 +1491,6 @@ xenDaemonDomainGetMaxMemory(virDomainPtr domain)
>  {
>      unsigned long long ret = 0;
>      struct sexpr *root;
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> -
> -    if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        return 0;
>  
>      /* can we ask for a subset ? worth it ? */
>      root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
> @@ -1523,10 +1519,6 @@ int
>  xenDaemonDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
>  {
>      char buf[1024];
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> -
> -    if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        return -1;
>  
>      snprintf(buf, sizeof(buf), "%lu", VIR_DIV_UP(memory, 1024));
>      return xend_op(domain->conn, domain->name, "op", "maxmem_set", "memory",
> @@ -1553,10 +1545,6 @@ int
>  xenDaemonDomainSetMemory(virDomainPtr domain, unsigned long memory)
>  {
>      char buf[1024];
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> -
> -    if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        return -1;
>  
>      snprintf(buf, sizeof(buf), "%lu", VIR_DIV_UP(memory, 1024));
>      return xend_op(domain->conn, domain->name, "op", "mem_target_set",
> @@ -3437,9 +3425,6 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
>  }
>  
>  struct xenUnifiedDriver xenDaemonDriver = {
> -    .xenDomainGetMaxMemory = xenDaemonDomainGetMaxMemory,
> -    .xenDomainSetMaxMemory = xenDaemonDomainSetMaxMemory,
> -    .xenDomainSetMemory = xenDaemonDomainSetMemory,
>      .xenDomainGetInfo = xenDaemonDomainGetInfo,
>      .xenDomainPinVcpu = xenDaemonDomainPinVcpu,
>      .xenDomainGetVcpus = xenDaemonDomainGetVcpus,
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 34339c5..eddaca0 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -81,9 +81,6 @@ static int xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
>  #define XM_XML_ERROR "Invalid xml"
>  
>  struct xenUnifiedDriver xenXMDriver = {
> -    .xenDomainGetMaxMemory = xenXMDomainGetMaxMemory,
> -    .xenDomainSetMaxMemory = xenXMDomainSetMaxMemory,
> -    .xenDomainSetMemory = xenXMDomainSetMemory,
>      .xenDomainGetInfo = xenXMDomainGetInfo,
>      .xenDomainPinVcpu = xenXMDomainPinVcpu,
>      .xenListDefinedDomains = xenXMListDefinedDomains,
> @@ -564,9 +561,12 @@ xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory)
>      xenXMConfCachePtr entry;
>      int ret = -1;
>  
> -    if (domain->id != -1 ||
> -        memory < 1024 * MIN_XEN_GUEST_SIZE)
> +    if (memory < 1024 * MIN_XEN_GUEST_SIZE) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("Memory %lu too small, min %lu"),
> +                       memory, (unsigned long)1024 * MIN_XEN_GUEST_SIZE);
>          return -1;
> +    }
>  
>      xenUnifiedLock(priv);
>  
> @@ -603,8 +603,12 @@ xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
>      xenXMConfCachePtr entry;
>      int ret = -1;
>  
> -    if (domain->id != -1)
> +    if (memory < 1024 * MIN_XEN_GUEST_SIZE) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("Memory %lu too small, min %lu"),
> +                       memory, (unsigned long)1024 * MIN_XEN_GUEST_SIZE);
>          return -1;
> +    }
>  
>      xenUnifiedLock(priv);
>  
> diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
> index 40d0be2..dd1f2a0 100644
> --- a/src/xen/xs_internal.c
> +++ b/src/xen/xs_internal.c
> @@ -57,8 +57,6 @@ static void xenStoreWatchEvent(int watch, int fd, int events, void *data);
>  static void xenStoreWatchListFree(xenStoreWatchListPtr list);
>  
>  struct xenUnifiedDriver xenStoreDriver = {
> -    .xenDomainGetMaxMemory = xenStoreDomainGetMaxMemory,
> -    .xenDomainSetMemory = xenStoreDomainSetMemory,
>      .xenDomainGetInfo = xenStoreGetDomainInfo,
>  };
>  
> @@ -111,36 +109,6 @@ virDomainDoStoreQuery(virConnectPtr conn, int domid, const char *path)
>      return xs_read(priv->xshandle, 0, &s[0], &len);
>  }
>  
> -/**
> - * virDomainDoStoreWrite:
> - * @domain: a domain object
> - * @path: the relative path of the data in the store to retrieve
> - *
> - * Internal API setting up a string value in the Xenstore
> - * Requires write access to the XenStore
> - *
> - * Returns 0 in case of success, -1 in case of failure
> - */
> -static int
> -virDomainDoStoreWrite(virDomainPtr domain, const char *path, const char *value)
> -{
> -    char s[256];
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> -    int ret = -1;
> -
> -    if (priv->xshandle == NULL)
> -        return -1;
> -
> -    snprintf(s, 255, "/local/domain/%d/%s", domain->id, path);
> -    s[255] = 0;
> -
> -    if (xs_write(priv->xshandle, 0, &s[0], value, strlen(value)))
> -        ret = 0;
> -
> -    return ret;
> -}
> -
> -
>  /************************************************************************
>   *									*
>   *		Canonical internal APIs					*
> @@ -359,64 +327,6 @@ xenStoreDomainGetState(virDomainPtr domain,
>      return 0;
>  }
>  
> -/**
> - * xenStoreDomainSetMemory:
> - * @domain: pointer to the domain block
> - * @memory: the max memory size in kilobytes.
> - *
> - * Change the maximum amount of memory allowed in the xen store
> - *
> - * Returns 0 in case of success, -1 in case of error.
> - */
> -int
> -xenStoreDomainSetMemory(virDomainPtr domain, unsigned long memory)
> -{
> -    int ret;
> -    char value[20];
> -
> -    if (memory < 1024 * MIN_XEN_GUEST_SIZE) {
> -        virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> -        return -1;
> -    }
> -    if (domain->id == -1)
> -        return -1;
> -    if ((domain->id == 0) && (memory < (2 * MIN_XEN_GUEST_SIZE * 1024)))
> -        return -1;
> -    snprintf(value, 19, "%lu", memory);
> -    value[19] = 0;
> -    ret = virDomainDoStoreWrite(domain, "memory/target", &value[0]);
> -    if (ret < 0)
> -        return -1;
> -    return 0;
> -}
> -
> -/**
> - * xenStoreDomainGetMaxMemory:
> - * @domain: pointer to the domain block
> - *
> - * Ask the xenstore for the maximum memory allowed for a domain
> - *
> - * Returns the memory size in kilobytes or 0 in case of error.
> - */
> -unsigned long long
> -xenStoreDomainGetMaxMemory(virDomainPtr domain)
> -{
> -    char *tmp;
> -    unsigned long long ret = 0;
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> -
> -    if (domain->id == -1)
> -        return 0;
> -
> -    xenUnifiedLock(priv);
> -    tmp = virDomainDoStoreQuery(domain->conn, domain->id, "memory/target");
> -    if (tmp != NULL) {
> -        ret = atol(tmp);
> -        VIR_FREE(tmp);
> -    }
> -    xenUnifiedUnlock(priv);
> -    return ret;
> -}
>  
>  /**
>   * xenStoreNumOfDomains:
> diff --git a/src/xen/xs_internal.h b/src/xen/xs_internal.h
> index da98eea..4390733 100644
> --- a/src/xen/xs_internal.h
> +++ b/src/xen/xs_internal.h
> @@ -43,10 +43,6 @@ int		xenStoreNumOfDomains	(virConnectPtr conn);
>  int		xenStoreListDomains	(virConnectPtr conn,
>                                           int *ids,
>                                           int maxids);
> -unsigned long	xenStoreGetMaxMemory	(virDomainPtr domain);
> -int		xenStoreDomainSetMemory	(virDomainPtr domain,
> -                                         unsigned long memory);
> -unsigned long long xenStoreDomainGetMaxMemory(virDomainPtr domain);
>  
>  int             xenStoreDomainGetVNCPort(virConnectPtr conn,
>                                           int domid);
>   




More information about the libvir-list mailing list