[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] Enable support for nested SVM



On 10/12/2010 04:46 AM, Daniel P. Berrange wrote:
This enables support for nested SVM using the regular CPU
model/features block. If the CPU model or features include
'svm', then the '-enable-nesting' flag will be added to the
QEMU command line. Latest out of tree patches for nested
'vmx', no longer require the '-enable-nesting' flag. They
instead just look at the cpu features. Several of the models
already include svm support, but QEMU was just masking out
the svm bit silently. So this will enable SVM on such
models

+
+bool
+cpuHasFeature(const char *arch,
+              const union cpuData *data,
+              const char *feature)
+{
+    struct cpuArchDriver *driver;
+
+    VIR_DEBUG("arch=%s, data=%p, feature=%s",
+              arch, data, feature);
+
+    if ((driver = cpuGetSubDriver(arch)) == NULL)
+        return -1;

Ouch.  -1 promotes to true.

+
+    if (driver->hasFeature == NULL) {
+        virCPUReportError(VIR_ERR_NO_SUPPORT,
+                _("cannot check guest CPU data for %s architecture"),
+                          arch);
+        return -1;

Likewise.

+    }
+
+    return driver->hasFeature(data, feature);
+}

You either need to change the return type to int and take a bool* parameter (return -1 on failure, 0 on success when *param was written to), or return an int value rather than a bool; since the caller needs to distinguish between feature-not-present and error-message-reported.

+
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index a745917..3a7b996 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -82,6 +82,10 @@ typedef int
  (*cpuArchUpdate)    (virCPUDefPtr guest,
                       const virCPUDefPtr host);

+typedef bool
+(*cpuArchHasFeature) (const union cpuData *data,
+                      const char *feature);

But this typedef is okay.

...
+    for (i = 0 ; i<  feature->ncpuid ; i++) {
+        struct cpuX86cpuid *cpuid;
+
+        cpuid = x86DataCpuid(data, feature->cpuid[i].function);
+        if (cpuid&&  x86cpuidMatchMasked(cpuid, feature->cpuid + i)) {
+            ret = true;
+            goto cleanup;

I probably would have used 'break' rather than 'goto cleanup', since it's shorter, but since you already have to have the label due to earlier code in the method, either way is fine.

+        }
+    }
+
+cleanup:
+    x86MapFree(map);
+    return ret;
+}


+++ b/src/qemu/qemu_conf.c
@@ -1210,6 +1210,8 @@ static unsigned long long qemudComputeCmdFlags(const char *help,
          flags |= QEMUD_CMD_FLAG_NO_KVM_PIT;
      if (strstr(help, "-tdf"))
          flags |= QEMUD_CMD_FLAG_TDF;
+    if (strstr(help, "-enable-nesting"))
+        flags |= QEMUD_CMD_FLAG_NESTING;
      if (strstr(help, ",menu=on"))
          flags |= QEMUD_CMD_FLAG_BOOT_MENU;
>

Any reason you didn't put the new feature at the end of the list, in enum order?

@@ -3555,6 +3560,12 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
          if (cpuDecode(guest, data, cpus, ncpus, preferred)<  0)
              goto cleanup;

+        /* Only 'svm' requires --enable-nesting. The out-of-tree
+         * 'vmx' patches now simply hook off the CPU features

This comment will be out-of-date once the vmx patches are no longer out of tree. Should we just say:

"Nested vmx support in qemu simply hooks off the CPU features"

--
Eric Blake   eblake redhat com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]