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@xxxxxxxx> > --- > 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; > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list