From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Simplify the Xen memory limit driver methods to directly call the most appropriate sub-driver Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- 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(-) 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); -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list