
On Thu, Mar 20, 2014 at 09:39:23AM +0100, Wojciech Macek wrote:
New functionalities: - connectGetMaxVcpus - on bhyve hardcode this value to 16 - nodeGetFreeMemory - do not use physmem_get on FreeBSD, since it might get wrong value on systems with more than 100GB of RAM - nodeGetCPUMap - wrapper only for mapping function, currently not supported by FreeBSD - nodeSet/GetMemoryParameters - wrapper only for future improvements, currently not supported by FreeBSD --- src/bhyve/bhyve_driver.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ src/nodeinfo.c | 19 ++++++++++++++ 2 files changed, 85 insertions(+)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index baa3340..2e6a8cb 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -694,6 +694,67 @@ cleanup: return -1; }
+static int +bhyveConnectGetMaxVcpus(virConnectPtr conn ATTRIBUTE_UNUSED, + const char *type) {
Mis-aligned indent
+ if (virConnectGetMaxVcpusEnsureACL(conn) < 0) + return -1; + + /* + * Bhyve supports up to 16 VCPUs, but offers no method to check this + * value. Hardcode 16... + */ + if (!type || STRCASEEQ(type, "bhyve")) + return 16; + + virReportError(VIR_ERR_INVALID_ARG, _("unknown type '%s'"), type); + return -1; +} + +static unsigned long long +bhyveNodeGetFreeMemory(virConnectPtr conn) +{ + if (virNodeGetFreeMemoryEnsureACL(conn) < 0) + return 0; + + return nodeGetFreeMemory(); +} + +static int +bhyveNodeGetCPUMap(virConnectPtr conn, + unsigned char **cpumap, + unsigned int *online, + unsigned int flags)
miss-aligned indent
+{ + if (virNodeGetCPUMapEnsureACL(conn) < 0) + return -1; + + return nodeGetCPUMap(cpumap, online, flags); +} + +static int +bhyveNodeGetMemoryParameters(virConnectPtr conn, + virTypedParameterPtr params, + int *nparams, + unsigned int flags)
miss-aligned indent
+{ + if (virNodeGetMemoryParametersEnsureACL(conn) < 0) + return -1; + + return nodeGetMemoryParameters(params, nparams, flags); +} + +static int +bhyveNodeSetMemoryParameters(virConnectPtr conn, + virTypedParameterPtr params, + int nparams, + unsigned int flags) miss-aligned indent
+{ + if (virNodeSetMemoryParametersEnsureACL(conn) < 0) + return -1; + + return nodeSetMemoryParameters(params, nparams, flags); +}
static virDriver bhyveDriver = { .no = VIR_DRV_BHYVE, @@ -722,6 +783,11 @@ static virDriver bhyveDriver = { .nodeGetCPUStats = bhyveNodeGetCPUStats, /* 1.2.2 */ .nodeGetMemoryStats = bhyveNodeGetMemoryStats, /* 1.2.2 */ .nodeGetInfo = bhyveNodeGetInfo, /* 1.2.3 */ + .connectGetMaxVcpus = bhyveConnectGetMaxVcpus, /* 1.2.3 */ + .nodeGetFreeMemory = bhyveNodeGetFreeMemory, /* 1.2.3 */ + .nodeGetCPUMap = bhyveNodeGetCPUMap, /* 1.2.3 */ + .nodeGetMemoryParameters = bhyveNodeGetMemoryParameters, /* 1.2.3 */ + .nodeSetMemoryParameters = bhyveNodeSetMemoryParameters, /* 1.2.3 */ };
diff --git a/src/nodeinfo.c b/src/nodeinfo.c index 6d33f64..7996d55 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -1699,6 +1699,24 @@ nodeGetCellsFreeMemoryFake(unsigned long long *freeMems, static unsigned long long nodeGetFreeMemoryFake(void) { +#if defined(__FreeBSD__) + unsigned long pagesize = getpagesize(); + u_int value; + size_t value_size = sizeof(value); + unsigned long long freemem; + + if (sysctlbyname("vm.stats.vm.v_free_count", &value, + &value_size, NULL, 0) < 0) { + virReportSystemError(errno, "%s", + _("sysctl failed for vm.stats.vm.v_free_count")); + return 0; + } + + freemem = value; + freemem = freemem * (unsigned long long)pagesize;
Huh, why not just do it on 1 line freemem = value * (unsigned long long)pagesize;
+ + return freemem; +#else double avail = physmem_available(); unsigned long long ret;
@@ -1709,6 +1727,7 @@ nodeGetFreeMemoryFake(void) }
return ret; +#endif }
ACK if the nitpicks are fixed. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|