<div dir="ltr"><div>Oh, sorry. I will definitely run this check with all further patches.<br></div><div>Thanks for pushing!<br></div><div><br></div>Wojtek<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">
2014-04-07 15:42 GMT+02:00 Michal Privoznik <span dir="ltr"><<a href="mailto:mprivozn@redhat.com" target="_blank">mprivozn@redhat.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 07.04.2014 07:06, Wojciech Macek wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- Move all capabilities functions to separate file<br>
- Add initCPU<br>
---<br>
src/Makefile.am | 2 +<br>
src/bhyve/bhyve_capabilities.c | 105 ++++++++++++++++++++++++++++++<u></u>+++++++++++<br>
src/bhyve/bhyve_capabilities.h | 30 ++++++++++++<br>
src/bhyve/bhyve_driver.c | 56 +++++++++++++---------<br>
4 files changed, 171 insertions(+), 22 deletions(-)<br>
create mode 100644 src/bhyve/bhyve_capabilities.c<br>
create mode 100644 src/bhyve/bhyve_capabilities.h<br>
<br>
diff --git a/src/Makefile.am b/src/Makefile.am<br>
index f6690b6..21d56fc 100644<br>
--- a/src/Makefile.am<br>
+++ b/src/Makefile.am<br>
@@ -778,6 +778,8 @@ PARALLELS_DRIVER_SOURCES = \<br>
parallels/parallels_network.c<br>
<br>
BHYVE_DRIVER_SOURCES = \<br>
+ bhyve/bhyve_capabilities.c \<br>
+ bhyve/bhyve_capabilities.h \<br>
bhyve/bhyve_command.c \<br>
bhyve/bhyve_command.h \<br>
bhyve/bhyve_driver.h \<br>
diff --git a/src/bhyve/bhyve_<u></u>capabilities.c b/src/bhyve/bhyve_<u></u>capabilities.c<br>
new file mode 100644<br>
index 0000000..b591357<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_<u></u>capabilities.c<br>
@@ -0,0 +1,105 @@<br>
+/*<br>
+ * bhyve_capabilities.c: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Roman Bogorodskiy<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>><u></u>.<br>
+ *<br>
+ */<br>
+#include <config.h><br>
+#include <sys/utsname.h><br>
+<br>
+#include "viralloc.h"<br>
+#include "virlog.h"<br>
+#include "virstring.h"<br>
+#include "cpu/cpu.h"<br>
+#include "nodeinfo.h"<br>
+#include "bhyve_utils.h"<br>
+#include "domain_conf.h"<br>
+#include "vircommand.h"<br>
+#include "bhyve_capabilities.h"<br>
+<br>
+#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
+<br>
+VIR_LOG_INIT("bhyve.bhyve_<u></u>capabilities");<br>
+<br>
+static int<br>
+virBhyveCapsInitCPU(<u></u>virCapsPtr caps,<br>
+ virArch arch)<br>
+{<br>
+ virCPUDefPtr cpu = NULL;<br>
+ virCPUDataPtr data = NULL;<br>
+ virNodeInfo nodeinfo;<br>
+ int ret = -1;<br>
+<br>
+ if (VIR_ALLOC(cpu) < 0)<br>
+ goto error;<br>
+<br>
+ cpu->arch = arch;<br>
+<br>
+ if (nodeGetInfo(&nodeinfo))<br>
+ goto error;<br>
+<br>
+ cpu->type = VIR_CPU_TYPE_HOST;<br>
+ cpu->sockets = nodeinfo.sockets;<br>
+ cpu->cores = nodeinfo.cores;<br>
+ cpu->threads = nodeinfo.threads;<br>
+ caps->host.cpu = cpu;<br>
+<br>
+ if (!(data = cpuNodeData(arch))<br>
+ || cpuDecode(cpu, data, NULL, 0, NULL) < 0)<br>
+ goto cleanup;<br>
+<br>
+ ret = 0;<br>
+<br>
+ cleanup:<br>
+ cpuDataFree(data);<br>
+<br>
+ return ret;<br>
+<br>
+ error:<br>
+ virCPUDefFree(cpu);<br>
+ goto cleanup;<br>
+}<br>
+<br>
+virCapsPtr<br>
+virBhyveCapsBuild(void)<br>
+{<br>
+ virCapsPtr caps;<br>
+ virCapsGuestPtr guest;<br>
+<br>
+ if ((caps = virCapabilitiesNew(<u></u>virArchFromHost(),<br>
+ 0, 0)) == NULL)<br>
+ return NULL;<br>
+<br>
+ if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
+ VIR_ARCH_X86_64,<br>
+ "bhyve",<br>
+ NULL, 0, NULL)) == NULL)<br>
+ goto error;<br>
+<br>
+ if (<u></u>virCapabilitiesAddGuestDomain(<u></u>guest,<br>
+ "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
+ goto error;<br>
+<br>
+ if (virBhyveCapsInitCPU(caps, virArchFromHost()) < 0)<br>
+ VIR_WARN("Failed to get host CPU");<br>
+<br>
+ return caps;<br>
+<br>
+ error:<br>
+ virObjectUnref(caps);<br>
+ return NULL;<br>
+}<br>
diff --git a/src/bhyve/bhyve_<u></u>capabilities.h b/src/bhyve/bhyve_<u></u>capabilities.h<br>
new file mode 100644<br>
index 0000000..741c631<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_<u></u>capabilities.h<br>
@@ -0,0 +1,30 @@<br>
+/*<br>
+ * bhyve_capabilities.h: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Semihalf<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>><u></u>.<br>
+ *<br>
+ */<br>
+<br>
+#ifndef _BHYVE_CAPABILITIES<br>
+#define _BHYVE_CAPABILITIES<br>
+<br>
+#include "capabilities.h"<br>
</blockquote>
<br></div></div>
There need to be a space after hash tag.<div class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+virCapsPtr virBhyveCapsBuild(void);<br>
+<br>
+#endif<br>
+<br>
</blockquote>
<br></div>
Empty line at EOF.<div><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c<br>
index f70eff5..728ab2b 100644<br>
--- a/src/bhyve/bhyve_driver.c<br>
+++ b/src/bhyve/bhyve_driver.c<br>
@@ -54,6 +54,7 @@<br>
#include "bhyve_driver.h"<br>
#include "bhyve_process.h"<br>
#include "bhyve_utils.h"<br>
+#include "bhyve_capabilities.h"<br>
<br>
#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
<br>
@@ -111,44 +112,49 @@ bhyveAutostartDomains(<u></u>bhyveConnPtr driver)<br>
virObjectUnref(conn);<br>
}<br>
<br>
+/**<br>
+ * bhyveDriverGetCapabilities:<br>
+ *<br>
+ * Get a reference to the virCapsPtr instance for the<br>
+ * driver.<br>
+ *<br>
+ * The caller must release the reference with virObjetUnref<br>
+ *<br>
+ * Returns: a reference to a virCapsPtr instance or NULL<br>
+ */<br>
static virCapsPtr<br>
-bhyveBuildCapabilities(void)<br>
+bhyveDriverGetCapabilities(<u></u>bhyveConnPtr driver)<br>
{<br>
- virCapsPtr caps;<br>
- virCapsGuestPtr guest;<br>
+ virCapsPtr ret = NULL;<br>
<br>
- if ((caps = virCapabilitiesNew(<u></u>virArchFromHost(),<br>
- 0, 0)) == NULL)<br>
+ if(driver == NULL)<br>
</blockquote>
<br></div></div>
missing space between 'if' and bracket.<div><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
return NULL;<br>
<br>
- if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
- VIR_ARCH_X86_64,<br>
- "bhyve",<br>
- NULL, 0, NULL)) == NULL)<br>
- goto error;<br>
+ ret = virObjectRef(driver->caps);<br>
<br>
- if (<u></u>virCapabilitiesAddGuestDomain(<u></u>guest,<br>
- "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
- goto error;<br>
-<br>
- return caps;<br>
-<br>
- error:<br>
- virObjectUnref(caps);<br>
- return NULL;<br>
+ return ret;<br>
}<br>
<br>
static char *<br>
bhyveConnectGetCapabilities(<u></u>virConnectPtr conn)<br>
{<br>
bhyveConnPtr privconn = conn->privateData;<br>
+ virCapsPtr caps;<br>
char *xml;<br>
<br>
if (<u></u>virConnectGetCapabilitiesEnsur<u></u>eACL(conn) < 0)<br>
return NULL;<br>
<br>
- if ((xml = virCapabilitiesFormatXML(<u></u>privconn->caps)) == NULL)<br>
+ caps = bhyveDriverGetCapabilities(<u></u>privconn);<br>
+ if (!caps)<br>
+ virReportError(VIR_ERR_<u></u>INTERNAL_ERROR,<br>
</blockquote>
<br></div></div>
s/,/, "%s"/<div><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ _("Unable to get Capabilities"));<br>
+<br>
+ if ((xml = virCapabilitiesFormatXML(<u></u>privconn->caps)) == NULL) {<br>
+ virObjectUnref(caps);<br>
virReportOOMError();<br>
+ }<br>
+ virObjectUnref(caps);<br>
<br>
return xml;<br>
}<br>
@@ -448,8 +454,13 @@ bhyveDomainDefineXML(<u></u>virConnectPtr conn, const char *xml)<br>
virDomainDefPtr def = NULL;<br>
virDomainDefPtr oldDef = NULL;<br>
virDomainObjPtr vm = NULL;<br>
+ virCapsPtr caps = NULL;<br>
+<br>
+ caps = bhyveDriverGetCapabilities(<u></u>privconn);<br>
+ if (!caps)<br>
+ return NULL;<br>
<br>
- if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt,<br>
+ if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,<br>
1 << VIR_DOMAIN_VIRT_BHYVE,<br>
VIR_DOMAIN_XML_INACTIVE)) == NULL)<br>
goto cleanup;<br>
@@ -472,6 +483,7 @@ bhyveDomainDefineXML(<u></u>virConnectPtr conn, const char *xml)<br>
goto cleanup;<br>
<br>
cleanup:<br>
+ virObjectUnref(caps);<br>
virDomainDefFree(def);<br>
virObjectUnlock(vm);<br>
<br>
@@ -869,7 +881,7 @@ bhyveStateInitialize(bool priveleged ATTRIBUTE_UNUSED,<br>
if (!(bhyve_driver-><u></u>closeCallbacks = virCloseCallbacksNew()))<br>
goto cleanup;<br>
<br>
- if (!(bhyve_driver->caps = bhyveBuildCapabilities()))<br>
+ if (!(bhyve_driver->caps = virBhyveCapsBuild()))<br>
goto cleanup;<br>
<br>
if (!(bhyve_driver->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))<br>
<br>
</blockquote>
<br></div></div>
You can catch many of these by running 'make syntax-check'.<span class="HOEnZb"><font color="#888888"><br>
<br>
Michal<br>
</font></span></blockquote></div><br></div>