Chunyan Liu wrote:
Xen libxl can support Xen HVM direct kernel boot now. To support
Xen HVM direct kernel boot in libvirt, it still needs some changes
to libvirt code: accept HVM direct kernel boot related configuration
in xml, parse those info into virDomainDefPtr, and fill in related
parts of libxl_domain_build_info, so that libxl can handle. This
patch is just to do this.
Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
src/libxl/libxl_conf.c | 18 ++++++++++++++++
src/xenconfig/xen_common.c | 51 +++++++++++++++++++++++++++++++++-------------
2 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index acba69c..a5bda64 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -704,6 +704,15 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
if (VIR_STRDUP(b_info->u.hvm.boot, bootorder) < 0)
goto error;
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
+ if (VIR_STRDUP(b_info->cmdline, def->os.cmdline) < 0)
+ goto error;
+ if (VIR_STRDUP(b_info->kernel, def->os.kernel) < 0)
+ goto error;
+ if (VIR_STRDUP(b_info->ramdisk, def->os.initrd) < 0)
+ goto error;
+#endif
+
if (def->nserials) {
if (def->nserials > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -748,6 +757,14 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
virStringSplit(def->os.bootloaderArgs, " \t\n", 0)))
goto error;
}
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
+ if (VIR_STRDUP(b_info->cmdline, def->os.cmdline) < 0)
+ goto error;
+ if (VIR_STRDUP(b_info->kernel, def->os.kernel) < 0)
+ goto error;
+ if (VIR_STRDUP(b_info->ramdisk, def->os.initrd) < 0)
+ goto error;
+#else
if (VIR_STRDUP(b_info->u.pv.cmdline, def->os.cmdline) < 0)
goto error;
if (def->os.kernel) {
@@ -758,6 +775,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
}
if (VIR_STRDUP(b_info->u.pv.ramdisk, def->os.initrd) < 0)
goto error;
+#endif
}
return 0;
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
index 32954f3..290ba3d 100644
--- a/src/xenconfig/xen_common.c
+++ b/src/xenconfig/xen_common.c
@@ -1053,6 +1053,26 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def,
virCapsPtr caps)
return 0;
}
+static int xenParseCmdline(virConfPtr conf, virDomainDefPtr def)
Preferred pattern in libvirt would be
static int
xenParseCmdLine(virConfPtr conf, virDomainDefPtr def)
+{
+ const char *extra, *root;
+
+ if (xenConfigGetString(conf, "extra", &extra, NULL) < 0)
+ return -1;
+
+ if (xenConfigGetString(conf, "root", &root, NULL) < 0)
+ return -1;
+
+ if (root) {
+ if (virAsprintf(&def->os.cmdline, "root=%s %s", root, extra)
< 0)
+ return -1;
+ } else {
+ if (VIR_STRDUP(def->os.cmdline, extra) < 0)
+ return -1;
+ }
+
+ return 0;
+}
static int
xenParseOS(virConfPtr conf, virDomainDefPtr def)
@@ -1065,9 +1085,25 @@ xenParseOS(virConfPtr conf, virDomainDefPtr def)
if (STREQ(def->os.type, "hvm")) {
const char *boot;
+#ifdef LIBXL_HAVE_BUILDINFO_KERNEL
LIBXL_HAVE_BUILDINFO_KERNEL is defined in libxl.h, which is currently
not included in this file. You'll need to add something like
#if WITH_LIBXL
# include <libxl.h>
#endif
+ if (xenConfigCopyStringOpt(conf, "kernel",
&def->os.kernel) < 0)
If 'kernel' is not set in the Xen config, def->os.kernel will be NULL...
+ return -1;
+
+ if (strstr(def->os.kernel, "hvmloader")) {
which will result in a segfault here. Maybe it would be best to copy to
a temp variable, check the value, and only then assign to def->os.kernel.
+ /* 'kernel' set to 'hvmloader' will be
ignored in libxl */
+ virFree(def->os.kernel);
+ }
+
+ if (xenConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd)
< 0)
+ return -1;
+
+ if (xenParseCmdline(conf, def) < 0)
+ return -1;
+#else
if (VIR_ALLOC(def->os.loader) < 0 ||
xenConfigCopyString(conf, "kernel",
&def->os.loader->path) < 0)
Pre-existing, but this should be xenConfigCopyStringOpt since specifying
'kernel=' is not required.
Regards,
Jim
return -1;
+#endif
if (xenConfigGetString(conf, "boot", &boot, "c") <
0)
return -1;
@@ -1091,8 +1127,6 @@ xenParseOS(virConfPtr conf, virDomainDefPtr def)
def->os.nBootDevs++;
}
} else {
- const char *extra, *root;
-
if (xenConfigCopyStringOpt(conf, "bootloader",
&def->os.bootloader) < 0)
return -1;
if (xenConfigCopyStringOpt(conf, "bootargs",
&def->os.bootloaderArgs) < 0)
@@ -1104,19 +1138,8 @@ xenParseOS(virConfPtr conf, virDomainDefPtr def)
if (xenConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd)
< 0)
return -1;
- if (xenConfigGetString(conf, "extra", &extra, NULL) < 0)
+ if (xenParseCmdline(conf, def) < 0)
return -1;
-
- if (xenConfigGetString(conf, "root", &root, NULL) < 0)
- return -1;
-
- if (root) {
- if (virAsprintf(&def->os.cmdline, "root=%s %s", root,
extra) < 0)
- return -1;
- } else {
- if (VIR_STRDUP(def->os.cmdline, extra) < 0)
- return -1;
- }
}
return 0;