<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>