mirror of https://gitee.com/openkylin/libvirt.git
Convert libxl driver to Xen 4.2
Based on a patch originally authored by Daniel De Graaf http://lists.xen.org/archives/html/xen-devel/2012-05/msg00565.html This patch converts the Xen libxl driver to support only Xen >= 4.2. Support for Xen 4.1 libxl is dropped since that version of libxl is designated 'technology preview' only and is incompatible with Xen 4.2 libxl. Additionally, the default toolstack in Xen 4.1 is still xend, for which libvirt has a stable, functional driver.
This commit is contained in:
parent
6856b93710
commit
dfa1e1dd53
|
@ -718,16 +718,14 @@ if test "$with_libxl" != "no" ; then
|
||||||
fi
|
fi
|
||||||
CFLAGS="$CFLAGS $LIBXL_CFLAGS"
|
CFLAGS="$CFLAGS $LIBXL_CFLAGS"
|
||||||
LIBS="$LIBS $LIBXL_LIBS"
|
LIBS="$LIBS $LIBXL_LIBS"
|
||||||
AC_CHECK_LIB([xenlight], [libxl_domain_create_new], [
|
AC_CHECK_LIB([xenlight], [libxl_ctx_alloc], [
|
||||||
with_libxl=yes
|
with_libxl=yes
|
||||||
LIBXL_LIBS="$LIBXL_LIBS -lxenlight -lxenstore -lxenctrl -lxenguest -luuid -lutil -lblktapctl"
|
LIBXL_LIBS="$LIBXL_LIBS -lxenlight"
|
||||||
],[
|
],[
|
||||||
if test "$with_libxl" = "yes"; then
|
if test "$with_libxl" = "yes"; then
|
||||||
fail=1
|
fail=1
|
||||||
fi
|
fi
|
||||||
with_libxl=no
|
with_libxl=no
|
||||||
],[
|
|
||||||
-lxenstore -lxenctrl -lxenguest -luuid -lutil -lblktapctl
|
|
||||||
])
|
])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -735,7 +733,7 @@ LIBS="$old_LIBS"
|
||||||
CFLAGS="$old_CFLAGS"
|
CFLAGS="$old_CFLAGS"
|
||||||
|
|
||||||
if test $fail = 1; then
|
if test $fail = 1; then
|
||||||
AC_MSG_ERROR([You must install the libxl Library to compile libxenlight driver with -lxl])
|
AC_MSG_ERROR([You must install the libxl Library from Xen >= 4.2 to compile libxenlight driver with -lxl])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$with_libxl" = "yes"; then
|
if test "$with_libxl" = "yes"; then
|
||||||
|
|
|
@ -53,6 +53,14 @@
|
||||||
the <code>/etc/xen</code> directory. It is important not to place
|
the <code>/etc/xen</code> directory. It is important not to place
|
||||||
any other non-config files in this directory.
|
any other non-config files in this directory.
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>libxl</strong>: Starting with Xen 4.2, the legacy XenD/xm
|
||||||
|
toolstack is deprecated in favor of libxl, also commonly called
|
||||||
|
libxenlight. libvirt supports this new Xen toolstack via the
|
||||||
|
libxl driver. If XenD is enabled, the legacy xen driver consisting
|
||||||
|
of the above mentioned channels will be used. If XenD is disabled,
|
||||||
|
the libxl driver will be used.
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a name="uri">Connections to Xen driver</a></h2>
|
<h2><a name="uri">Connections to Xen driver</a></h2>
|
||||||
|
|
|
@ -189,8 +189,8 @@
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
# Fedora doesn't have new enough Xen for libxl until F16
|
# Fedora doesn't have new enough Xen for libxl until F18
|
||||||
%if 0%{?fedora} && 0%{?fedora} < 16
|
%if 0%{?fedora} && 0%{?fedora} < 18
|
||||||
%define with_libxl 0
|
%define with_libxl 0
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
|
@ -36,11 +36,13 @@
|
||||||
#include "virterror_internal.h"
|
#include "virterror_internal.h"
|
||||||
#include "datatypes.h"
|
#include "datatypes.h"
|
||||||
#include "virfile.h"
|
#include "virfile.h"
|
||||||
|
#include "virstring.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "uuid.h"
|
#include "uuid.h"
|
||||||
#include "capabilities.h"
|
#include "capabilities.h"
|
||||||
#include "libxl_driver.h"
|
#include "libxl_driver.h"
|
||||||
#include "libxl_conf.h"
|
#include "libxl_conf.h"
|
||||||
|
#include "libxl_utils.h"
|
||||||
#include "storage_file.h"
|
#include "storage_file.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -360,18 +362,36 @@ libxlMakeCapabilitiesInternal(const char *hostmachine,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
libxlMakeDomCreateInfo(virDomainDefPtr def, libxl_domain_create_info *c_info)
|
libxlMakeDomCreateInfo(libxlDriverPrivatePtr driver,
|
||||||
|
virDomainDefPtr def,
|
||||||
|
libxl_domain_create_info *c_info)
|
||||||
{
|
{
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
|
||||||
libxl_init_create_info(c_info);
|
libxl_domain_create_info_init(c_info);
|
||||||
|
|
||||||
|
if (STREQ(def->os.type, "hvm"))
|
||||||
|
c_info->type = LIBXL_DOMAIN_TYPE_HVM;
|
||||||
|
else
|
||||||
|
c_info->type = LIBXL_DOMAIN_TYPE_PV;
|
||||||
|
|
||||||
c_info->hvm = STREQ(def->os.type, "hvm");
|
|
||||||
if ((c_info->name = strdup(def->name)) == NULL) {
|
if ((c_info->name = strdup(def->name)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (def->nseclabels &&
|
||||||
|
def->seclabels[0]->type == VIR_DOMAIN_SECLABEL_STATIC) {
|
||||||
|
if (libxl_flask_context_to_sid(driver->ctx,
|
||||||
|
def->seclabels[0]->label,
|
||||||
|
strlen(def->seclabels[0]->label),
|
||||||
|
&c_info->ssidref)) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("libxenlight failed to resolve security label '%s'"),
|
||||||
|
def->seclabels[0]->label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virUUIDFormat(def->uuid, uuidstr);
|
virUUIDFormat(def->uuid, uuidstr);
|
||||||
if (libxl_uuid_from_string(&c_info->uuid, uuidstr)) {
|
if (libxl_uuid_from_string(&c_info->uuid, uuidstr)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
@ -382,7 +402,7 @@ libxlMakeDomCreateInfo(virDomainDefPtr def, libxl_domain_create_info *c_info)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
libxl_domain_create_info_destroy(c_info);
|
libxl_domain_create_info_dispose(c_info);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,26 +413,14 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
int hvm = STREQ(def->os.type, "hvm");
|
int hvm = STREQ(def->os.type, "hvm");
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Currently, libxenlight only supports 32 vcpus per domain.
|
libxl_domain_build_info_init(b_info);
|
||||||
* cur_vcpus member of struct libxl_domain_build_info is defined
|
|
||||||
* as an int, but its semantic is a bitmap of online vcpus, so
|
|
||||||
* only 32 can be represented.
|
|
||||||
*/
|
|
||||||
if (def->maxvcpus > 32 || def->vcpus > 32) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("This version of libxenlight only supports 32 "
|
|
||||||
"vcpus per domain"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
libxl_init_build_info(b_info, &d_config->c_info);
|
if (hvm)
|
||||||
|
libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_HVM);
|
||||||
b_info->hvm = hvm;
|
|
||||||
b_info->max_vcpus = def->maxvcpus;
|
|
||||||
if (def->vcpus == 32)
|
|
||||||
b_info->cur_vcpus = (uint32_t) -1;
|
|
||||||
else
|
else
|
||||||
b_info->cur_vcpus = (1 << def->vcpus) - 1;
|
libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_PV);
|
||||||
|
b_info->max_vcpus = def->maxvcpus;
|
||||||
|
libxl_bitmap_set((&b_info->avail_vcpus), def->vcpus);
|
||||||
if (def->clock.ntimers > 0 &&
|
if (def->clock.ntimers > 0 &&
|
||||||
def->clock.timers[0]->name == VIR_DOMAIN_TIMER_NAME_TSC) {
|
def->clock.timers[0]->name == VIR_DOMAIN_TIMER_NAME_TSC) {
|
||||||
switch (def->clock.timers[0]->mode) {
|
switch (def->clock.timers[0]->mode) {
|
||||||
|
@ -426,16 +434,20 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
b_info->tsc_mode = 1;
|
b_info->tsc_mode = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
b_info->sched_params.weight = 1000;
|
||||||
b_info->max_memkb = def->mem.max_balloon;
|
b_info->max_memkb = def->mem.max_balloon;
|
||||||
b_info->target_memkb = def->mem.cur_balloon;
|
b_info->target_memkb = def->mem.cur_balloon;
|
||||||
if (hvm) {
|
if (hvm) {
|
||||||
b_info->u.hvm.pae = def->features & (1 << VIR_DOMAIN_FEATURE_PAE);
|
libxl_defbool_set(&b_info->u.hvm.pae,
|
||||||
b_info->u.hvm.apic = def->features & (1 << VIR_DOMAIN_FEATURE_APIC);
|
def->features & (1 << VIR_DOMAIN_FEATURE_PAE));
|
||||||
b_info->u.hvm.acpi = def->features & (1 << VIR_DOMAIN_FEATURE_ACPI);
|
libxl_defbool_set(&b_info->u.hvm.apic,
|
||||||
|
def->features & (1 << VIR_DOMAIN_FEATURE_APIC));
|
||||||
|
libxl_defbool_set(&b_info->u.hvm.acpi,
|
||||||
|
def->features & (1 << VIR_DOMAIN_FEATURE_ACPI));
|
||||||
for (i = 0; i < def->clock.ntimers; i++) {
|
for (i = 0; i < def->clock.ntimers; i++) {
|
||||||
if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
|
if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
|
||||||
def->clock.timers[i]->present == 1) {
|
def->clock.timers[i]->present == 1) {
|
||||||
b_info->u.hvm.hpet = 1;
|
libxl_defbool_set(&b_info->u.hvm.hpet, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +458,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
* 256 pages (1MB) per vcpu, plus 1 page per MiB of RAM for the P2M map,
|
* 256 pages (1MB) per vcpu, plus 1 page per MiB of RAM for the P2M map,
|
||||||
* plus 1 page per MiB of RAM to shadow the resident processes.
|
* plus 1 page per MiB of RAM to shadow the resident processes.
|
||||||
*/
|
*/
|
||||||
b_info->shadow_memkb = 4 * (256 * b_info->cur_vcpus +
|
b_info->shadow_memkb = 4 * (256 * libxl_bitmap_count_set(&b_info->avail_vcpus) +
|
||||||
2 * (b_info->max_memkb / 1024));
|
2 * (b_info->max_memkb / 1024));
|
||||||
} else {
|
} else {
|
||||||
if (def->os.bootloader) {
|
if (def->os.bootloader) {
|
||||||
|
@ -456,10 +468,9 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (def->os.bootloaderArgs) {
|
if (def->os.bootloaderArgs) {
|
||||||
if ((b_info->u.pv.bootloader_args = strdup(def->os.bootloaderArgs)) == NULL) {
|
if (!(b_info->u.pv.bootloader_args =
|
||||||
virReportOOMError();
|
virStringSplit(def->os.bootloaderArgs, " \t\n", 0)))
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (def->os.cmdline) {
|
if (def->os.cmdline) {
|
||||||
if ((b_info->u.pv.cmdline = strdup(def->os.cmdline)) == NULL) {
|
if ((b_info->u.pv.cmdline = strdup(def->os.cmdline)) == NULL) {
|
||||||
|
@ -469,14 +480,14 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
}
|
}
|
||||||
if (def->os.kernel) {
|
if (def->os.kernel) {
|
||||||
/* libxl_init_build_info() sets kernel.path = strdup("hvmloader") */
|
/* libxl_init_build_info() sets kernel.path = strdup("hvmloader") */
|
||||||
VIR_FREE(b_info->kernel.path);
|
VIR_FREE(b_info->u.pv.kernel);
|
||||||
if ((b_info->kernel.path = strdup(def->os.kernel)) == NULL) {
|
if ((b_info->u.pv.kernel = strdup(def->os.kernel)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (def->os.initrd) {
|
if (def->os.initrd) {
|
||||||
if ((b_info->u.pv.ramdisk.path = strdup(def->os.initrd)) == NULL) {
|
if ((b_info->u.pv.ramdisk = strdup(def->os.initrd)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -486,13 +497,12 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
libxl_domain_build_info_destroy(b_info);
|
libxl_domain_build_info_dispose(b_info);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
|
libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
|
||||||
libxl_device_disk *x_disk)
|
|
||||||
{
|
{
|
||||||
if (l_disk->src && (x_disk->pdev_path = strdup(l_disk->src)) == NULL) {
|
if (l_disk->src && (x_disk->pdev_path = strdup(l_disk->src)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
|
@ -509,22 +519,22 @@ libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
|
||||||
STREQ(l_disk->driverName, "tap2")) {
|
STREQ(l_disk->driverName, "tap2")) {
|
||||||
switch (l_disk->format) {
|
switch (l_disk->format) {
|
||||||
case VIR_STORAGE_FILE_QCOW:
|
case VIR_STORAGE_FILE_QCOW:
|
||||||
x_disk->format = DISK_FORMAT_QCOW;
|
x_disk->format = LIBXL_DISK_FORMAT_QCOW;
|
||||||
x_disk->backend = DISK_BACKEND_QDISK;
|
x_disk->backend = LIBXL_DISK_BACKEND_QDISK;
|
||||||
break;
|
break;
|
||||||
case VIR_STORAGE_FILE_QCOW2:
|
case VIR_STORAGE_FILE_QCOW2:
|
||||||
x_disk->format = DISK_FORMAT_QCOW2;
|
x_disk->format = LIBXL_DISK_FORMAT_QCOW2;
|
||||||
x_disk->backend = DISK_BACKEND_QDISK;
|
x_disk->backend = LIBXL_DISK_BACKEND_QDISK;
|
||||||
break;
|
break;
|
||||||
case VIR_STORAGE_FILE_VHD:
|
case VIR_STORAGE_FILE_VHD:
|
||||||
x_disk->format = DISK_FORMAT_VHD;
|
x_disk->format = LIBXL_DISK_FORMAT_VHD;
|
||||||
x_disk->backend = DISK_BACKEND_TAP;
|
x_disk->backend = LIBXL_DISK_BACKEND_TAP;
|
||||||
break;
|
break;
|
||||||
case VIR_STORAGE_FILE_NONE:
|
case VIR_STORAGE_FILE_NONE:
|
||||||
/* No subtype specified, default to raw/tap */
|
/* No subtype specified, default to raw/tap */
|
||||||
case VIR_STORAGE_FILE_RAW:
|
case VIR_STORAGE_FILE_RAW:
|
||||||
x_disk->format = DISK_FORMAT_RAW;
|
x_disk->format = LIBXL_DISK_FORMAT_RAW;
|
||||||
x_disk->backend = DISK_BACKEND_TAP;
|
x_disk->backend = LIBXL_DISK_BACKEND_TAP;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
@ -533,11 +543,11 @@ libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (STREQ(l_disk->driverName, "file")) {
|
} else if (STREQ(l_disk->driverName, "file")) {
|
||||||
x_disk->format = DISK_FORMAT_RAW;
|
x_disk->format = LIBXL_DISK_FORMAT_RAW;
|
||||||
x_disk->backend = DISK_BACKEND_TAP;
|
x_disk->backend = LIBXL_DISK_BACKEND_TAP;
|
||||||
} else if (STREQ(l_disk->driverName, "phy")) {
|
} else if (STREQ(l_disk->driverName, "phy")) {
|
||||||
x_disk->format = DISK_FORMAT_RAW;
|
x_disk->format = LIBXL_DISK_FORMAT_RAW;
|
||||||
x_disk->backend = DISK_BACKEND_PHY;
|
x_disk->backend = LIBXL_DISK_BACKEND_PHY;
|
||||||
} else {
|
} else {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("libxenlight does not support disk driver %s"),
|
_("libxenlight does not support disk driver %s"),
|
||||||
|
@ -546,12 +556,12 @@ libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* No driverName - default to raw/tap?? */
|
/* No driverName - default to raw/tap?? */
|
||||||
x_disk->format = DISK_FORMAT_RAW;
|
x_disk->format = LIBXL_DISK_FORMAT_RAW;
|
||||||
x_disk->backend = DISK_BACKEND_TAP;
|
x_disk->backend = LIBXL_DISK_BACKEND_TAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* How to set unpluggable? */
|
/* XXX is this right? */
|
||||||
x_disk->unpluggable = 1;
|
x_disk->removable = 1;
|
||||||
x_disk->readwrite = !l_disk->readonly;
|
x_disk->readwrite = !l_disk->readonly;
|
||||||
x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
|
x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
|
||||||
if (l_disk->transient) {
|
if (l_disk->transient) {
|
||||||
|
@ -560,8 +570,6 @@ libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
x_disk->domid = def->id;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,7 +587,7 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ndisks; i++) {
|
for (i = 0; i < ndisks; i++) {
|
||||||
if (libxlMakeDisk(def, l_disks[i], &x_disks[i]) < 0)
|
if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,19 +598,19 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
|
|
||||||
error:
|
error:
|
||||||
for (i = 0; i < ndisks; i++)
|
for (i = 0; i < ndisks; i++)
|
||||||
libxl_device_disk_destroy(&x_disks[i]);
|
libxl_device_disk_dispose(&x_disks[i]);
|
||||||
VIR_FREE(x_disks);
|
VIR_FREE(x_disks);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
libxlMakeNic(virDomainDefPtr def, virDomainNetDefPtr l_nic,
|
libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
|
||||||
libxl_device_nic *x_nic)
|
|
||||||
{
|
{
|
||||||
// TODO: Where is mtu stored?
|
/* TODO: Where is mtu stored?
|
||||||
//x_nics[i].mtu = 1492;
|
*
|
||||||
|
* x_nics[i].mtu = 1492;
|
||||||
|
*/
|
||||||
|
|
||||||
x_nic->domid = def->id;
|
|
||||||
virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
|
virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
|
||||||
|
|
||||||
if (l_nic->model && !STREQ(l_nic->model, "netfront")) {
|
if (l_nic->model && !STREQ(l_nic->model, "netfront")) {
|
||||||
|
@ -610,9 +618,9 @@ libxlMakeNic(virDomainDefPtr def, virDomainNetDefPtr l_nic,
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
x_nic->nictype = NICTYPE_IOEMU;
|
x_nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
|
||||||
} else {
|
} else {
|
||||||
x_nic->nictype = NICTYPE_VIF;
|
x_nic->nictype = LIBXL_NIC_TYPE_VIF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l_nic->ifname && (x_nic->ifname = strdup(l_nic->ifname)) == NULL) {
|
if (l_nic->ifname && (x_nic->ifname = strdup(l_nic->ifname)) == NULL) {
|
||||||
|
@ -659,48 +667,49 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
for (i = 0; i < nnics; i++) {
|
for (i = 0; i < nnics; i++) {
|
||||||
x_nics[i].devid = i;
|
x_nics[i].devid = i;
|
||||||
|
|
||||||
if (libxlMakeNic(def, l_nics[i], &x_nics[i]))
|
if (libxlMakeNic(l_nics[i], &x_nics[i]))
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
d_config->vifs = x_nics;
|
d_config->nics = x_nics;
|
||||||
d_config->num_vifs = nnics;
|
d_config->num_nics = nnics;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
for (i = 0; i < nnics; i++)
|
for (i = 0; i < nnics; i++)
|
||||||
libxl_device_nic_destroy(&x_nics[i]);
|
libxl_device_nic_dispose(&x_nics[i]);
|
||||||
VIR_FREE(x_nics);
|
VIR_FREE(x_nics);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainDefPtr def,
|
libxlMakeVfb(libxlDriverPrivatePtr driver,
|
||||||
virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb)
|
virDomainGraphicsDefPtr l_vfb,
|
||||||
|
libxl_device_vfb *x_vfb)
|
||||||
{
|
{
|
||||||
int port;
|
int port;
|
||||||
const char *listenAddr;
|
const char *listenAddr;
|
||||||
|
|
||||||
switch (l_vfb->type) {
|
switch (l_vfb->type) {
|
||||||
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
|
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
|
||||||
x_vfb->sdl = 1;
|
libxl_defbool_set(&x_vfb->sdl.enable, 1);
|
||||||
if (l_vfb->data.sdl.display &&
|
if (l_vfb->data.sdl.display &&
|
||||||
(x_vfb->display = strdup(l_vfb->data.sdl.display)) == NULL) {
|
(x_vfb->sdl.display = strdup(l_vfb->data.sdl.display)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (l_vfb->data.sdl.xauth &&
|
if (l_vfb->data.sdl.xauth &&
|
||||||
(x_vfb->xauthority =
|
(x_vfb->sdl.xauthority =
|
||||||
strdup(l_vfb->data.sdl.xauth)) == NULL) {
|
strdup(l_vfb->data.sdl.xauth)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
|
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
|
||||||
x_vfb->vnc = 1;
|
libxl_defbool_set(&x_vfb->vnc.enable, 1);
|
||||||
/* driver handles selection of free port */
|
/* driver handles selection of free port */
|
||||||
x_vfb->vncunused = 0;
|
libxl_defbool_set(&x_vfb->vnc.findunused, 0);
|
||||||
if (l_vfb->data.vnc.autoport) {
|
if (l_vfb->data.vnc.autoport) {
|
||||||
port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
|
port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
|
||||||
if (port < 0) {
|
if (port < 0) {
|
||||||
|
@ -710,13 +719,13 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainDefPtr def,
|
||||||
}
|
}
|
||||||
l_vfb->data.vnc.port = port;
|
l_vfb->data.vnc.port = port;
|
||||||
}
|
}
|
||||||
x_vfb->vncdisplay = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
|
x_vfb->vnc.display = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
|
||||||
|
|
||||||
listenAddr = virDomainGraphicsListenGetAddress(l_vfb, 0);
|
listenAddr = virDomainGraphicsListenGetAddress(l_vfb, 0);
|
||||||
if (listenAddr) {
|
if (listenAddr) {
|
||||||
/* libxl_device_vfb_init() does strdup("127.0.0.1") */
|
/* libxl_device_vfb_init() does strdup("127.0.0.1") */
|
||||||
VIR_FREE(x_vfb->vnclisten);
|
VIR_FREE(x_vfb->vnc.listen);
|
||||||
if ((x_vfb->vnclisten = strdup(listenAddr)) == NULL) {
|
if ((x_vfb->vnc.listen = strdup(listenAddr)) == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -729,13 +738,14 @@ libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainDefPtr def,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
x_vfb->domid = def->id;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
libxlMakeVfbList(libxlDriverPrivatePtr driver,
|
libxlMakeVfbList(libxlDriverPrivatePtr driver,
|
||||||
virDomainDefPtr def, libxl_domain_config *d_config)
|
virDomainDefPtr def,
|
||||||
|
libxl_domain_config *d_config)
|
||||||
{
|
{
|
||||||
virDomainGraphicsDefPtr *l_vfbs = def->graphics;
|
virDomainGraphicsDefPtr *l_vfbs = def->graphics;
|
||||||
int nvfbs = def->ngraphics;
|
int nvfbs = def->ngraphics;
|
||||||
|
@ -757,10 +767,10 @@ libxlMakeVfbList(libxlDriverPrivatePtr driver,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nvfbs; i++) {
|
for (i = 0; i < nvfbs; i++) {
|
||||||
libxl_device_vfb_init(&x_vfbs[i], i);
|
libxl_device_vfb_init(&x_vfbs[i]);
|
||||||
libxl_device_vkb_init(&x_vkbs[i], i);
|
libxl_device_vkb_init(&x_vkbs[i]);
|
||||||
|
|
||||||
if (libxlMakeVfb(driver, def, l_vfbs[i], &x_vfbs[i]) < 0)
|
if (libxlMakeVfb(driver, l_vfbs[i], &x_vfbs[i]) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -772,148 +782,14 @@ libxlMakeVfbList(libxlDriverPrivatePtr driver,
|
||||||
|
|
||||||
error:
|
error:
|
||||||
for (i = 0; i < nvfbs; i++) {
|
for (i = 0; i < nvfbs; i++) {
|
||||||
libxl_device_vfb_destroy(&x_vfbs[i]);
|
libxl_device_vfb_dispose(&x_vfbs[i]);
|
||||||
libxl_device_vkb_destroy(&x_vkbs[i]);
|
libxl_device_vkb_dispose(&x_vkbs[i]);
|
||||||
}
|
}
|
||||||
VIR_FREE(x_vfbs);
|
VIR_FREE(x_vfbs);
|
||||||
VIR_FREE(x_vkbs);
|
VIR_FREE(x_vkbs);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf)
|
|
||||||
{
|
|
||||||
const char *type = virDomainChrTypeToString(def->source.type);
|
|
||||||
|
|
||||||
if (!type) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
"%s", _("unexpected chr device type"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (def->source.type) {
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_NULL:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_STDIO:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_VC:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_PTY:
|
|
||||||
if (virAsprintf(buf, "%s", type) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_FILE:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
|
||||||
if (virAsprintf(buf, "%s:%s", type,
|
|
||||||
def->source.data.file.path) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_DEV:
|
|
||||||
if (virAsprintf(buf, "%s", def->source.data.file.path) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
libxlMakeDeviceModelInfo(virDomainDefPtr def, libxl_domain_config *d_config)
|
|
||||||
{
|
|
||||||
libxl_device_model_info *dm_info = &d_config->dm_info;
|
|
||||||
int i;
|
|
||||||
char b_order[VIR_DOMAIN_BOOT_LAST+1];
|
|
||||||
|
|
||||||
libxl_init_dm_info(dm_info, &d_config->c_info, &d_config->b_info);
|
|
||||||
|
|
||||||
if (d_config->b_info.hvm) {
|
|
||||||
/* HVM-specific device model info */
|
|
||||||
dm_info->type = XENFV;
|
|
||||||
if (def->os.nBootDevs > 0) {
|
|
||||||
VIR_FREE(dm_info->boot);
|
|
||||||
for (i = 0; i < def->os.nBootDevs; i++) {
|
|
||||||
switch (def->os.bootDevs[i]) {
|
|
||||||
case VIR_DOMAIN_BOOT_FLOPPY:
|
|
||||||
b_order[i] = 'a';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
case VIR_DOMAIN_BOOT_DISK:
|
|
||||||
b_order[i] = 'c';
|
|
||||||
break;
|
|
||||||
case VIR_DOMAIN_BOOT_CDROM:
|
|
||||||
b_order[i] = 'd';
|
|
||||||
break;
|
|
||||||
case VIR_DOMAIN_BOOT_NET:
|
|
||||||
b_order[i] = 'n';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b_order[def->os.nBootDevs] = '\0';
|
|
||||||
if ((dm_info->boot = strdup(b_order)) == NULL) {
|
|
||||||
virReportOOMError();
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (def->serials &&
|
|
||||||
(libxlMakeChrdevStr(def->serials[0], &dm_info->serial) < 0))
|
|
||||||
goto error;
|
|
||||||
} else {
|
|
||||||
/* PV-specific device model info */
|
|
||||||
dm_info->type = XENPV;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build qemu graphics options from previously parsed vfb */
|
|
||||||
if (d_config->num_vfbs > 0) {
|
|
||||||
if (d_config->vfbs[0].vnc) {
|
|
||||||
dm_info->vnc = 1;
|
|
||||||
/* driver handles selection of free port */
|
|
||||||
dm_info->vncunused = 0;
|
|
||||||
if (d_config->vfbs[0].vnclisten) {
|
|
||||||
VIR_FREE(dm_info->vnclisten);
|
|
||||||
if ((dm_info->vnclisten =
|
|
||||||
strdup(d_config->vfbs[0].vnclisten)) == NULL) {
|
|
||||||
virReportOOMError();
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (d_config->vfbs[0].keymap &&
|
|
||||||
(dm_info->keymap = strdup(d_config->vfbs[0].keymap)) == NULL) {
|
|
||||||
virReportOOMError();
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
dm_info->vncdisplay = d_config->vfbs[0].vncdisplay;
|
|
||||||
if (d_config->vfbs[0].vncpasswd &&
|
|
||||||
(dm_info->vncpasswd =
|
|
||||||
strdup(d_config->vfbs[0].vncpasswd)) == NULL) {
|
|
||||||
virReportOOMError();
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else if (d_config->vfbs[0].sdl) {
|
|
||||||
dm_info->sdl = 1;
|
|
||||||
dm_info->vnc = 0;
|
|
||||||
}
|
|
||||||
} else if (d_config->num_vfbs == 0) {
|
|
||||||
dm_info->nographic = 1;
|
|
||||||
dm_info->vnc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
//dm_info->usb = ;
|
|
||||||
//dm_info->usbdevice = ;
|
|
||||||
//dm_info->soundhw = ;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
libxl_device_model_info_destroy(dm_info);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virCapsPtr
|
virCapsPtr
|
||||||
libxlMakeCapabilities(libxl_ctx *ctx)
|
libxlMakeCapabilities(libxl_ctx *ctx)
|
||||||
{
|
{
|
||||||
|
@ -947,7 +823,7 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
|
||||||
virDomainDefPtr def, libxl_domain_config *d_config)
|
virDomainDefPtr def, libxl_domain_config *d_config)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (libxlMakeDomCreateInfo(def, &d_config->c_info) < 0)
|
if (libxlMakeDomCreateInfo(driver, def, &d_config->c_info) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (libxlMakeDomBuildInfo(def, d_config) < 0) {
|
if (libxlMakeDomBuildInfo(def, d_config) < 0) {
|
||||||
|
@ -966,10 +842,6 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxlMakeDeviceModelInfo(def, d_config) < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
d_config->on_reboot = def->onReboot;
|
d_config->on_reboot = def->onReboot;
|
||||||
d_config->on_poweroff = def->onPoweroff;
|
d_config->on_poweroff = def->onPoweroff;
|
||||||
d_config->on_crash = def->onCrash;
|
d_config->on_crash = def->onCrash;
|
||||||
|
@ -977,6 +849,6 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
libxl_domain_config_destroy(d_config);
|
libxl_domain_config_dispose(d_config);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ struct _libxlDriverPrivate {
|
||||||
FILE *logger_file;
|
FILE *logger_file;
|
||||||
xentoollog_logger *logger;
|
xentoollog_logger *logger;
|
||||||
/* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
|
/* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
|
||||||
libxl_ctx ctx;
|
libxl_ctx *ctx;
|
||||||
|
|
||||||
virBitmapPtr reservedVNCPorts;
|
virBitmapPtr reservedVNCPorts;
|
||||||
|
|
||||||
|
@ -82,10 +82,8 @@ typedef struct _libxlDomainObjPrivate libxlDomainObjPrivate;
|
||||||
typedef libxlDomainObjPrivate *libxlDomainObjPrivatePtr;
|
typedef libxlDomainObjPrivate *libxlDomainObjPrivatePtr;
|
||||||
struct _libxlDomainObjPrivate {
|
struct _libxlDomainObjPrivate {
|
||||||
/* per domain libxl ctx */
|
/* per domain libxl ctx */
|
||||||
libxl_ctx ctx;
|
libxl_ctx *ctx;
|
||||||
libxl_waiter *dWaiter;
|
libxl_evgen_domain_death *deathW;
|
||||||
int waiterFD;
|
|
||||||
int eventHdl;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# define LIBXL_SAVE_MAGIC "libvirt-xml\n \0 \r"
|
# define LIBXL_SAVE_MAGIC "libvirt-xml\n \0 \r"
|
||||||
|
@ -105,13 +103,11 @@ virCapsPtr
|
||||||
libxlMakeCapabilities(libxl_ctx *ctx);
|
libxlMakeCapabilities(libxl_ctx *ctx);
|
||||||
|
|
||||||
int
|
int
|
||||||
libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_dev,
|
libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
|
||||||
libxl_device_disk *x_dev);
|
|
||||||
int
|
int
|
||||||
libxlMakeNic(virDomainDefPtr def, virDomainNetDefPtr l_nic,
|
libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
|
||||||
libxl_device_nic *x_nic);
|
|
||||||
int
|
int
|
||||||
libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainDefPtr def,
|
libxlMakeVfb(libxlDriverPrivatePtr driver,
|
||||||
virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);
|
virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "uuid.h"
|
#include "uuid.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
#include "libxl.h"
|
||||||
#include "libxl_driver.h"
|
#include "libxl_driver.h"
|
||||||
#include "libxl_conf.h"
|
#include "libxl_conf.h"
|
||||||
#include "xen_xm.h"
|
#include "xen_xm.h"
|
||||||
|
@ -59,6 +60,19 @@
|
||||||
/* Number of Xen scheduler parameters */
|
/* Number of Xen scheduler parameters */
|
||||||
#define XEN_SCHED_CREDIT_NPARAM 2
|
#define XEN_SCHED_CREDIT_NPARAM 2
|
||||||
|
|
||||||
|
struct libxlOSEventHookFDInfo {
|
||||||
|
libxlDomainObjPrivatePtr priv;
|
||||||
|
void *xl_priv;
|
||||||
|
int watch;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct libxlOSEventHookTimerInfo {
|
||||||
|
libxlDomainObjPrivatePtr priv;
|
||||||
|
void *xl_priv;
|
||||||
|
int id;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static void libxlDomainManagedSaveLoad(void *payload,
|
static void libxlDomainManagedSaveLoad(void *payload,
|
||||||
const void *n ATTRIBUTE_UNUSED,
|
const void *n ATTRIBUTE_UNUSED,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
@ -84,6 +98,163 @@ libxlDriverUnlock(libxlDriverPrivatePtr driver)
|
||||||
virMutexUnlock(&driver->lock);
|
virMutexUnlock(&driver->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void libxlFDEventCallback(int watch ATTRIBUTE_UNUSED,
|
||||||
|
int fd,
|
||||||
|
int vir_events,
|
||||||
|
void *fdinfo)
|
||||||
|
{
|
||||||
|
struct libxlOSEventHookFDInfo *info = fdinfo;
|
||||||
|
int events = 0;
|
||||||
|
|
||||||
|
if (vir_events & VIR_EVENT_HANDLE_READABLE)
|
||||||
|
events |= POLLIN;
|
||||||
|
if (vir_events & VIR_EVENT_HANDLE_WRITABLE)
|
||||||
|
events |= POLLOUT;
|
||||||
|
if (vir_events & VIR_EVENT_HANDLE_ERROR)
|
||||||
|
events |= POLLERR;
|
||||||
|
if (vir_events & VIR_EVENT_HANDLE_HANGUP)
|
||||||
|
events |= POLLHUP;
|
||||||
|
|
||||||
|
libxl_osevent_occurred_fd(info->priv->ctx, info->xl_priv, fd, 0, events);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void libxlFreeFDInfo(void *obj)
|
||||||
|
{
|
||||||
|
VIR_FREE(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int libxlFDRegisterEventHook(void *priv, int fd, void **hndp,
|
||||||
|
short events, void *xl_priv)
|
||||||
|
{
|
||||||
|
int vir_events = VIR_EVENT_HANDLE_ERROR;
|
||||||
|
struct libxlOSEventHookFDInfo *fdinfo;
|
||||||
|
|
||||||
|
if (VIR_ALLOC(fdinfo) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fdinfo->priv = priv;
|
||||||
|
fdinfo->xl_priv = xl_priv;
|
||||||
|
*hndp = fdinfo;
|
||||||
|
|
||||||
|
if (events & POLLIN)
|
||||||
|
vir_events |= VIR_EVENT_HANDLE_READABLE;
|
||||||
|
if (events & POLLOUT)
|
||||||
|
vir_events |= VIR_EVENT_HANDLE_WRITABLE;
|
||||||
|
fdinfo->watch = virEventAddHandle(fd, vir_events, libxlFDEventCallback,
|
||||||
|
fdinfo, libxlFreeFDInfo);
|
||||||
|
if (fdinfo->watch < 0) {
|
||||||
|
VIR_FREE(fdinfo);
|
||||||
|
return fdinfo->watch;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int libxlFDModifyEventHook(void *priv ATTRIBUTE_UNUSED,
|
||||||
|
int fd ATTRIBUTE_UNUSED,
|
||||||
|
void **hndp,
|
||||||
|
short events)
|
||||||
|
{
|
||||||
|
struct libxlOSEventHookFDInfo *fdinfo = *hndp;
|
||||||
|
int vir_events = VIR_EVENT_HANDLE_ERROR;
|
||||||
|
|
||||||
|
if (events & POLLIN)
|
||||||
|
vir_events |= VIR_EVENT_HANDLE_READABLE;
|
||||||
|
if (events & POLLOUT)
|
||||||
|
vir_events |= VIR_EVENT_HANDLE_WRITABLE;
|
||||||
|
|
||||||
|
virEventUpdateHandle(fdinfo->watch, vir_events);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void libxlFDDeregisterEventHook(void *priv ATTRIBUTE_UNUSED,
|
||||||
|
int fd ATTRIBUTE_UNUSED,
|
||||||
|
void *hnd)
|
||||||
|
{
|
||||||
|
struct libxlOSEventHookFDInfo *fdinfo = hnd;
|
||||||
|
|
||||||
|
virEventRemoveHandle(fdinfo->watch);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void libxlTimerCallback(int timer ATTRIBUTE_UNUSED, void *timer_v)
|
||||||
|
{
|
||||||
|
struct libxlOSEventHookTimerInfo *timer_info = timer_v;
|
||||||
|
|
||||||
|
libxl_osevent_occurred_timeout(timer_info->priv->ctx, timer_info->xl_priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void libxlTimerInfoFree(void* obj)
|
||||||
|
{
|
||||||
|
VIR_FREE(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int libxlTimeoutRegisterEventHook(void *priv,
|
||||||
|
void **hndp,
|
||||||
|
struct timeval abs_t,
|
||||||
|
void *for_libxl)
|
||||||
|
{
|
||||||
|
struct timeval now;
|
||||||
|
struct libxlOSEventHookTimerInfo *timer_info;
|
||||||
|
int timeout, timer_id;
|
||||||
|
|
||||||
|
if (VIR_ALLOC(timer_info) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
timeout = (abs_t.tv_usec - now.tv_usec) / 1000;
|
||||||
|
timeout += (abs_t.tv_sec - now.tv_sec) * 1000;
|
||||||
|
timer_id = virEventAddTimeout(timeout, libxlTimerCallback,
|
||||||
|
timer_info, libxlTimerInfoFree);
|
||||||
|
if (timer_id < 0) {
|
||||||
|
VIR_FREE(timer_info);
|
||||||
|
return timer_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer_info->priv = priv;
|
||||||
|
timer_info->xl_priv = for_libxl;
|
||||||
|
timer_info->id = timer_id;
|
||||||
|
*hndp = timer_info;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int libxlTimeoutModifyEventHook(void *priv ATTRIBUTE_UNUSED,
|
||||||
|
void **hndp,
|
||||||
|
struct timeval abs_t)
|
||||||
|
{
|
||||||
|
struct timeval now;
|
||||||
|
int timeout;
|
||||||
|
struct libxlOSEventHookTimerInfo *timer_info = *hndp;
|
||||||
|
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
timeout = (abs_t.tv_usec - now.tv_usec) / 1000;
|
||||||
|
timeout += (abs_t.tv_sec - now.tv_sec) * 1000;
|
||||||
|
virEventUpdateTimeout(timer_info->id, timeout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void libxlTimeoutDeregisterEventHook(void *priv ATTRIBUTE_UNUSED,
|
||||||
|
void *hnd)
|
||||||
|
{
|
||||||
|
struct libxlOSEventHookTimerInfo *timer_info = hnd;
|
||||||
|
|
||||||
|
virEventRemoveTimeout(timer_info->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const libxl_osevent_hooks libxl_event_callbacks = {
|
||||||
|
.fd_register = libxlFDRegisterEventHook,
|
||||||
|
.fd_modify = libxlFDModifyEventHook,
|
||||||
|
.fd_deregister = libxlFDDeregisterEventHook,
|
||||||
|
.timeout_register = libxlTimeoutRegisterEventHook,
|
||||||
|
.timeout_modify = libxlTimeoutModifyEventHook,
|
||||||
|
.timeout_deregister = libxlTimeoutDeregisterEventHook,
|
||||||
|
};
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
libxlDomainObjPrivateAlloc(void)
|
libxlDomainObjPrivateAlloc(void)
|
||||||
{
|
{
|
||||||
|
@ -92,9 +263,9 @@ libxlDomainObjPrivateAlloc(void)
|
||||||
if (VIR_ALLOC(priv) < 0)
|
if (VIR_ALLOC(priv) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
libxl_ctx_init(&priv->ctx, LIBXL_VERSION, libxl_driver->logger);
|
libxl_ctx_alloc(&priv->ctx, LIBXL_VERSION, 0, libxl_driver->logger);
|
||||||
priv->waiterFD = -1;
|
priv->deathW = NULL;
|
||||||
priv->eventHdl = -1;
|
libxl_osevent_register_hooks(priv->ctx, &libxl_event_callbacks, priv);
|
||||||
|
|
||||||
return priv;
|
return priv;
|
||||||
}
|
}
|
||||||
|
@ -104,16 +275,12 @@ libxlDomainObjPrivateFree(void *data)
|
||||||
{
|
{
|
||||||
libxlDomainObjPrivatePtr priv = data;
|
libxlDomainObjPrivatePtr priv = data;
|
||||||
|
|
||||||
if (priv->eventHdl >= 0)
|
if (priv->deathW) {
|
||||||
virEventRemoveHandle(priv->eventHdl);
|
libxl_evdisable_domain_death(priv->ctx, priv->deathW);
|
||||||
|
VIR_FREE(priv->deathW);
|
||||||
if (priv->dWaiter) {
|
|
||||||
libxl_stop_waiting(&priv->ctx, priv->dWaiter);
|
|
||||||
libxl_free_waiter(priv->dWaiter);
|
|
||||||
VIR_FREE(priv->dWaiter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
libxl_ctx_free(&priv->ctx);
|
libxl_ctx_free(priv->ctx);
|
||||||
VIR_FREE(priv);
|
VIR_FREE(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,17 +292,6 @@ libxlDomainEventQueue(libxlDriverPrivatePtr driver, virDomainEventPtr event)
|
||||||
virDomainEventStateQueue(driver->domainEventState, event);
|
virDomainEventStateQueue(driver->domainEventState, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove reference to domain object.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
libxlDomainObjUnref(void *data)
|
|
||||||
{
|
|
||||||
virDomainObjPtr vm = data;
|
|
||||||
|
|
||||||
virObjectUnref(vm);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
libxlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED,
|
libxlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED,
|
||||||
void *opaque)
|
void *opaque)
|
||||||
|
@ -166,13 +322,13 @@ libxlDoNodeGetInfo(libxlDriverPrivatePtr driver, virNodeInfoPtr info)
|
||||||
const libxl_version_info* ver_info;
|
const libxl_version_info* ver_info;
|
||||||
struct utsname utsname;
|
struct utsname utsname;
|
||||||
|
|
||||||
if (libxl_get_physinfo(&driver->ctx, &phy_info)) {
|
if (libxl_get_physinfo(driver->ctx, &phy_info)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("libxl_get_physinfo_info failed"));
|
_("libxl_get_physinfo_info failed"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
|
if ((ver_info = libxl_get_version_info(driver->ctx)) == NULL) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("libxl_get_version_info failed"));
|
_("libxl_get_version_info failed"));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -296,15 +452,9 @@ libxlVmCleanup(libxlDriverPrivatePtr driver,
|
||||||
char *file;
|
char *file;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (priv->eventHdl >= 0) {
|
if (priv->deathW) {
|
||||||
virEventRemoveHandle(priv->eventHdl);
|
libxl_evdisable_domain_death(priv->ctx, priv->deathW);
|
||||||
priv->eventHdl = -1;
|
priv->deathW = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->dWaiter) {
|
|
||||||
libxl_stop_waiting(&priv->ctx, priv->dWaiter);
|
|
||||||
libxl_free_waiter(priv->dWaiter);
|
|
||||||
VIR_FREE(priv->dWaiter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vm->persistent) {
|
if (vm->persistent) {
|
||||||
|
@ -359,12 +509,11 @@ libxlVmCleanup(libxlDriverPrivatePtr driver,
|
||||||
static int
|
static int
|
||||||
libxlVmReap(libxlDriverPrivatePtr driver,
|
libxlVmReap(libxlDriverPrivatePtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
int force,
|
|
||||||
virDomainShutoffReason reason)
|
virDomainShutoffReason reason)
|
||||||
{
|
{
|
||||||
libxlDomainObjPrivatePtr priv = vm->privateData;
|
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
|
||||||
if (libxl_domain_destroy(&priv->ctx, vm->def->id, force) < 0) {
|
if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Unable to cleanup domain %d"), vm->def->id);
|
_("Unable to cleanup domain %d"), vm->def->id);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -377,56 +526,26 @@ libxlVmReap(libxlDriverPrivatePtr driver,
|
||||||
/*
|
/*
|
||||||
* Handle previously registered event notification from libxenlight
|
* Handle previously registered event notification from libxenlight
|
||||||
*/
|
*/
|
||||||
static void libxlEventHandler(int watch,
|
static void libxlEventHandler(void *data, const libxl_event *event)
|
||||||
int fd,
|
|
||||||
int events,
|
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
libxlDriverPrivatePtr driver = libxl_driver;
|
libxlDriverPrivatePtr driver = libxl_driver;
|
||||||
virDomainObjPtr vm = data;
|
virDomainObjPtr vm = data;
|
||||||
libxlDomainObjPrivatePtr priv;
|
|
||||||
virDomainEventPtr dom_event = NULL;
|
virDomainEventPtr dom_event = NULL;
|
||||||
libxl_event event;
|
|
||||||
libxl_dominfo info;
|
|
||||||
|
|
||||||
libxlDriverLock(driver);
|
libxlDriverLock(driver);
|
||||||
virDomainObjLock(vm);
|
virDomainObjLock(vm);
|
||||||
libxlDriverUnlock(driver);
|
libxlDriverUnlock(driver);
|
||||||
|
|
||||||
priv = vm->privateData;
|
if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
|
||||||
|
|
||||||
memset(&event, 0, sizeof(event));
|
|
||||||
memset(&info, 0, sizeof(info));
|
|
||||||
|
|
||||||
if (priv->waiterFD != fd || priv->eventHdl != watch) {
|
|
||||||
virEventRemoveHandle(watch);
|
|
||||||
priv->eventHdl = -1;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(events & VIR_EVENT_HANDLE_READABLE))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (libxl_get_event(&priv->ctx, &event))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (event.type == LIBXL_EVENT_DOMAIN_DEATH) {
|
|
||||||
virDomainShutoffReason reason;
|
virDomainShutoffReason reason;
|
||||||
|
|
||||||
/* libxl_event_get_domain_death_info returns 1 if death
|
if (event->domid != vm->def->id)
|
||||||
* event was for this domid */
|
|
||||||
if (libxl_event_get_domain_death_info(&priv->ctx,
|
|
||||||
vm->def->id,
|
|
||||||
&event,
|
|
||||||
&info) != 1)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virEventRemoveHandle(watch);
|
switch (event->u.domain_shutdown.shutdown_reason) {
|
||||||
priv->eventHdl = -1;
|
case LIBXL_SHUTDOWN_REASON_POWEROFF:
|
||||||
switch (info.shutdown_reason) {
|
case LIBXL_SHUTDOWN_REASON_CRASH:
|
||||||
case SHUTDOWN_poweroff:
|
if (event->u.domain_shutdown.shutdown_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
|
||||||
case SHUTDOWN_crash:
|
|
||||||
if (info.shutdown_reason == SHUTDOWN_crash) {
|
|
||||||
dom_event = virDomainEventNewFromObj(vm,
|
dom_event = virDomainEventNewFromObj(vm,
|
||||||
VIR_DOMAIN_EVENT_STOPPED,
|
VIR_DOMAIN_EVENT_STOPPED,
|
||||||
VIR_DOMAIN_EVENT_STOPPED_CRASHED);
|
VIR_DOMAIN_EVENT_STOPPED_CRASHED);
|
||||||
|
@ -434,18 +553,18 @@ static void libxlEventHandler(int watch,
|
||||||
} else {
|
} else {
|
||||||
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
|
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
|
||||||
}
|
}
|
||||||
libxlVmReap(driver, vm, 0, reason);
|
libxlVmReap(driver, vm, reason);
|
||||||
if (!vm->persistent) {
|
if (!vm->persistent) {
|
||||||
virDomainRemoveInactive(&driver->domains, vm);
|
virDomainRemoveInactive(&driver->domains, vm);
|
||||||
vm = NULL;
|
vm = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SHUTDOWN_reboot:
|
case LIBXL_SHUTDOWN_REASON_REBOOT:
|
||||||
libxlVmReap(driver, vm, 0, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
|
libxlVmReap(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
|
||||||
libxlVmStart(driver, vm, 0, -1);
|
libxlVmStart(driver, vm, 0, -1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
VIR_INFO("Unhandled shutdown_reason %d", info.shutdown_reason);
|
VIR_INFO("Unhandled shutdown_reason %d", event->u.domain_shutdown.shutdown_reason);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -458,9 +577,14 @@ cleanup:
|
||||||
libxlDomainEventQueue(driver, dom_event);
|
libxlDomainEventQueue(driver, dom_event);
|
||||||
libxlDriverUnlock(driver);
|
libxlDriverUnlock(driver);
|
||||||
}
|
}
|
||||||
libxl_free_event(&event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct libxl_event_hooks ev_hooks = {
|
||||||
|
.event_occurs_mask = LIBXL_EVENTMASK_ALL,
|
||||||
|
.event_occurs = libxlEventHandler,
|
||||||
|
.disaster = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register domain events with libxenlight and insert event handles
|
* Register domain events with libxenlight and insert event handles
|
||||||
* in libvirt's event loop.
|
* in libvirt's event loop.
|
||||||
|
@ -469,40 +593,18 @@ static int
|
||||||
libxlCreateDomEvents(virDomainObjPtr vm)
|
libxlCreateDomEvents(virDomainObjPtr vm)
|
||||||
{
|
{
|
||||||
libxlDomainObjPrivatePtr priv = vm->privateData;
|
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||||
int fd;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(priv->dWaiter) < 0) {
|
libxl_event_register_callbacks(priv->ctx, &ev_hooks, vm);
|
||||||
virReportOOMError();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (libxl_wait_for_domain_death(&priv->ctx, vm->def->id, priv->dWaiter))
|
if (libxl_evenable_domain_death(priv->ctx, vm->def->id, 0, &priv->deathW))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
libxl_get_wait_fd(&priv->ctx, &fd);
|
|
||||||
if (fd < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
priv->waiterFD = fd;
|
|
||||||
/* Add a reference to the domain object while it is injected in
|
|
||||||
* the event loop.
|
|
||||||
*/
|
|
||||||
virObjectRef(vm);
|
|
||||||
if ((priv->eventHdl = virEventAddHandle(
|
|
||||||
fd,
|
|
||||||
VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_ERROR,
|
|
||||||
libxlEventHandler,
|
|
||||||
vm, libxlDomainObjUnref)) < 0) {
|
|
||||||
virObjectUnref(vm);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
libxl_free_waiter(priv->dWaiter);
|
if (priv->deathW)
|
||||||
VIR_FREE(priv->dWaiter);
|
libxl_evdisable_domain_death(priv->ctx, priv->deathW);
|
||||||
priv->eventHdl = -1;
|
VIR_FREE(priv->deathW);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -511,7 +613,7 @@ libxlDomainSetVcpuAffinites(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
|
||||||
{
|
{
|
||||||
libxlDomainObjPrivatePtr priv = vm->privateData;
|
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||||
virDomainDefPtr def = vm->def;
|
virDomainDefPtr def = vm->def;
|
||||||
libxl_cpumap map;
|
libxl_bitmap map;
|
||||||
uint8_t *cpumask = NULL;
|
uint8_t *cpumask = NULL;
|
||||||
uint8_t *cpumap = NULL;
|
uint8_t *cpumap = NULL;
|
||||||
virNodeInfo nodeinfo;
|
virNodeInfo nodeinfo;
|
||||||
|
@ -543,7 +645,7 @@ libxlDomainSetVcpuAffinites(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
|
||||||
map.size = cpumaplen;
|
map.size = cpumaplen;
|
||||||
map.map = cpumap;
|
map.map = cpumap;
|
||||||
|
|
||||||
if (libxl_set_vcpuaffinity(&priv->ctx, def->id, vcpu, &map) != 0) {
|
if (libxl_set_vcpuaffinity(priv->ctx, def->id, vcpu, &map) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to pin vcpu '%d' with libxenlight"), vcpu);
|
_("Failed to pin vcpu '%d' with libxenlight"), vcpu);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -569,11 +671,10 @@ libxlFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config)
|
||||||
int tries = 3;
|
int tries = 3;
|
||||||
int wait_secs = 10;
|
int wait_secs = 10;
|
||||||
|
|
||||||
if ((ret = libxl_domain_need_memory(&priv->ctx, &d_config->b_info,
|
if ((ret = libxl_domain_need_memory(priv->ctx, &d_config->b_info,
|
||||||
&d_config->dm_info,
|
|
||||||
&needed_mem)) >= 0) {
|
&needed_mem)) >= 0) {
|
||||||
for (i = 0; i < tries; ++i) {
|
for (i = 0; i < tries; ++i) {
|
||||||
if ((ret = libxl_get_free_memory(&priv->ctx, &free_mem)) < 0)
|
if ((ret = libxl_get_free_memory(priv->ctx, &free_mem)) < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (free_mem >= needed_mem) {
|
if (free_mem >= needed_mem) {
|
||||||
|
@ -581,17 +682,17 @@ libxlFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = libxl_set_memory_target(&priv->ctx, 0,
|
if ((ret = libxl_set_memory_target(priv->ctx, 0,
|
||||||
free_mem - needed_mem,
|
free_mem - needed_mem,
|
||||||
/* relative */ 1, 0)) < 0)
|
/* relative */ 1, 0)) < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ret = libxl_wait_for_free_memory(&priv->ctx, 0, needed_mem,
|
ret = libxl_wait_for_free_memory(priv->ctx, 0, needed_mem,
|
||||||
wait_secs);
|
wait_secs);
|
||||||
if (ret == 0 || ret != ERROR_NOMEM)
|
if (ret == 0 || ret != ERROR_NOMEM)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ((ret = libxl_wait_for_memory_target(&priv->ctx, 0, 1)) < 0)
|
if ((ret = libxl_wait_for_memory_target(priv->ctx, 0, 1)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -617,7 +718,6 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
char *dom_xml = NULL;
|
char *dom_xml = NULL;
|
||||||
char *managed_save_path = NULL;
|
char *managed_save_path = NULL;
|
||||||
int managed_save_fd = -1;
|
int managed_save_fd = -1;
|
||||||
pid_t child_console_pid = -1;
|
|
||||||
libxlDomainObjPrivatePtr priv = vm->privateData;
|
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
|
||||||
/* If there is a managed saved state restore it instead of starting
|
/* If there is a managed saved state restore it instead of starting
|
||||||
|
@ -661,7 +761,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
VIR_FREE(managed_save_path);
|
VIR_FREE(managed_save_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&d_config, 0, sizeof(d_config));
|
libxl_domain_config_init(&d_config);
|
||||||
|
|
||||||
if (libxlBuildDomainConfig(driver, vm->def, &d_config) < 0)
|
if (libxlBuildDomainConfig(driver, vm->def, &d_config) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -673,13 +773,14 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* use as synchronous operations => ao_how = NULL and no intermediate reports => ao_progress = NULL */
|
||||||
|
|
||||||
if (restore_fd < 0)
|
if (restore_fd < 0)
|
||||||
ret = libxl_domain_create_new(&priv->ctx, &d_config,
|
ret = libxl_domain_create_new(priv->ctx, &d_config,
|
||||||
NULL, &child_console_pid, &domid);
|
&domid, NULL, NULL);
|
||||||
else
|
else
|
||||||
ret = libxl_domain_create_restore(&priv->ctx, &d_config, NULL,
|
ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid,
|
||||||
&child_console_pid, &domid,
|
restore_fd, NULL, NULL);
|
||||||
restore_fd);
|
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (restore_fd < 0)
|
if (restore_fd < 0)
|
||||||
|
@ -697,7 +798,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
if ((dom_xml = virDomainDefFormat(vm->def, 0)) == NULL)
|
if ((dom_xml = virDomainDefFormat(vm->def, 0)) == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (libxl_userdata_store(&priv->ctx, domid, "libvirt-xml",
|
if (libxl_userdata_store(priv->ctx, domid, "libvirt-xml",
|
||||||
(uint8_t *)dom_xml, strlen(dom_xml) + 1)) {
|
(uint8_t *)dom_xml, strlen(dom_xml) + 1)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("libxenlight failed to store userdata"));
|
_("libxenlight failed to store userdata"));
|
||||||
|
@ -711,7 +812,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (!start_paused) {
|
if (!start_paused) {
|
||||||
libxl_domain_unpause(&priv->ctx, domid);
|
libxl_domain_unpause(priv->ctx, domid);
|
||||||
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
|
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
|
||||||
} else {
|
} else {
|
||||||
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
|
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
|
||||||
|
@ -731,18 +832,18 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
VIR_DOMAIN_EVENT_STARTED_RESTORED);
|
VIR_DOMAIN_EVENT_STARTED_RESTORED);
|
||||||
libxlDomainEventQueue(driver, event);
|
libxlDomainEventQueue(driver, event);
|
||||||
|
|
||||||
libxl_domain_config_destroy(&d_config);
|
libxl_domain_config_dispose(&d_config);
|
||||||
VIR_FREE(dom_xml);
|
VIR_FREE(dom_xml);
|
||||||
VIR_FORCE_CLOSE(managed_save_fd);
|
VIR_FORCE_CLOSE(managed_save_fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (domid > 0) {
|
if (domid > 0) {
|
||||||
libxl_domain_destroy(&priv->ctx, domid, 0);
|
libxl_domain_destroy(priv->ctx, domid, NULL);
|
||||||
vm->def->id = -1;
|
vm->def->id = -1;
|
||||||
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);
|
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);
|
||||||
}
|
}
|
||||||
libxl_domain_config_destroy(&d_config);
|
libxl_domain_config_dispose(&d_config);
|
||||||
VIR_FREE(dom_xml);
|
VIR_FREE(dom_xml);
|
||||||
VIR_FREE(managed_save_path);
|
VIR_FREE(managed_save_path);
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
|
@ -770,7 +871,7 @@ libxlReconnectDomain(void *payload,
|
||||||
virDomainObjLock(vm);
|
virDomainObjLock(vm);
|
||||||
|
|
||||||
/* Does domain still exist? */
|
/* Does domain still exist? */
|
||||||
rc = libxl_domain_info(&driver->ctx, &d_info, vm->def->id);
|
rc = libxl_domain_info(driver->ctx, &d_info, vm->def->id);
|
||||||
if (rc == ERROR_INVAL) {
|
if (rc == ERROR_INVAL) {
|
||||||
goto out;
|
goto out;
|
||||||
} else if (rc != 0) {
|
} else if (rc != 0) {
|
||||||
|
@ -780,7 +881,7 @@ libxlReconnectDomain(void *payload,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is this a domain that was under libvirt control? */
|
/* Is this a domain that was under libvirt control? */
|
||||||
if (libxl_userdata_retrieve(&driver->ctx, vm->def->id,
|
if (libxl_userdata_retrieve(driver->ctx, vm->def->id,
|
||||||
"libvirt-xml", &data, &len)) {
|
"libvirt-xml", &data, &len)) {
|
||||||
VIR_DEBUG("libxl_userdata_retrieve failed, ignoring domain %d", vm->def->id);
|
VIR_DEBUG("libxl_userdata_retrieve failed, ignoring domain %d", vm->def->id);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -822,7 +923,7 @@ libxlShutdown(void)
|
||||||
libxlDriverLock(libxl_driver);
|
libxlDriverLock(libxl_driver);
|
||||||
virCapabilitiesFree(libxl_driver->caps);
|
virCapabilitiesFree(libxl_driver->caps);
|
||||||
virDomainObjListDeinit(&libxl_driver->domains);
|
virDomainObjListDeinit(&libxl_driver->domains);
|
||||||
libxl_ctx_free(&libxl_driver->ctx);
|
libxl_ctx_free(libxl_driver->ctx);
|
||||||
xtl_logger_destroy(libxl_driver->logger);
|
xtl_logger_destroy(libxl_driver->logger);
|
||||||
if (libxl_driver->logger_file)
|
if (libxl_driver->logger_file)
|
||||||
VIR_FORCE_FCLOSE(libxl_driver->logger_file);
|
VIR_FORCE_FCLOSE(libxl_driver->logger_file);
|
||||||
|
@ -958,14 +1059,14 @@ libxlStartup(bool privileged,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_ctx_init(&libxl_driver->ctx,
|
if (libxl_ctx_alloc(&libxl_driver->ctx,
|
||||||
LIBXL_VERSION,
|
LIBXL_VERSION, 0,
|
||||||
libxl_driver->logger)) {
|
libxl_driver->logger)) {
|
||||||
VIR_INFO("cannot initialize libxenlight context, probably not running in a Xen Dom0, disabling driver");
|
VIR_INFO("cannot initialize libxenlight context, probably not running in a Xen Dom0, disabling driver");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ver_info = libxl_get_version_info(&libxl_driver->ctx)) == NULL) {
|
if ((ver_info = libxl_get_version_info(libxl_driver->ctx)) == NULL) {
|
||||||
VIR_INFO("cannot version information from libxenlight, disabling driver");
|
VIR_INFO("cannot version information from libxenlight, disabling driver");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -973,7 +1074,7 @@ libxlStartup(bool privileged,
|
||||||
(ver_info->xen_version_minor * 1000);
|
(ver_info->xen_version_minor * 1000);
|
||||||
|
|
||||||
if ((libxl_driver->caps =
|
if ((libxl_driver->caps =
|
||||||
libxlMakeCapabilities(&libxl_driver->ctx)) == NULL) {
|
libxlMakeCapabilities(libxl_driver->ctx)) == NULL) {
|
||||||
VIR_ERROR(_("cannot create capabilities for libxenlight"));
|
VIR_ERROR(_("cannot create capabilities for libxenlight"));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1223,7 @@ libxlGetMaxVcpus(virConnectPtr conn, const char *type ATTRIBUTE_UNUSED)
|
||||||
int ret;
|
int ret;
|
||||||
libxlDriverPrivatePtr driver = conn->privateData;
|
libxlDriverPrivatePtr driver = conn->privateData;
|
||||||
|
|
||||||
ret = libxl_get_max_cpus(&driver->ctx);
|
ret = libxl_get_max_cpus(driver->ctx);
|
||||||
/* libxl_get_max_cpus() will return 0 if there were any failures,
|
/* libxl_get_max_cpus() will return 0 if there were any failures,
|
||||||
e.g. xc_physinfo() failing */
|
e.g. xc_physinfo() failing */
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -1327,7 +1428,7 @@ libxlDomainSuspend(virDomainPtr dom)
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
|
if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) {
|
||||||
if (libxl_domain_pause(&priv->ctx, dom->id) != 0) {
|
if (libxl_domain_pause(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to suspend domain '%d' with libxenlight"),
|
_("Failed to suspend domain '%d' with libxenlight"),
|
||||||
dom->id);
|
dom->id);
|
||||||
|
@ -1386,7 +1487,7 @@ libxlDomainResume(virDomainPtr dom)
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
|
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
|
||||||
if (libxl_domain_unpause(&priv->ctx, dom->id) != 0) {
|
if (libxl_domain_unpause(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to resume domain '%d' with libxenlight"),
|
_("Failed to resume domain '%d' with libxenlight"),
|
||||||
dom->id);
|
dom->id);
|
||||||
|
@ -1443,7 +1544,7 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if (libxl_domain_shutdown(&priv->ctx, dom->id, LIBXL_DOM_REQ_POWEROFF) != 0) {
|
if (libxl_domain_shutdown(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to shutdown domain '%d' with libxenlight"),
|
_("Failed to shutdown domain '%d' with libxenlight"),
|
||||||
dom->id);
|
dom->id);
|
||||||
|
@ -1496,7 +1597,7 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if (libxl_domain_shutdown(&priv->ctx, dom->id, LIBXL_DOM_REQ_REBOOT) != 0) {
|
if (libxl_domain_reboot(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to reboot domain '%d' with libxenlight"),
|
_("Failed to reboot domain '%d' with libxenlight"),
|
||||||
dom->id);
|
dom->id);
|
||||||
|
@ -1541,7 +1642,7 @@ libxlDomainDestroyFlags(virDomainPtr dom,
|
||||||
event = virDomainEventNewFromObj(vm,VIR_DOMAIN_EVENT_STOPPED,
|
event = virDomainEventNewFromObj(vm,VIR_DOMAIN_EVENT_STOPPED,
|
||||||
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
|
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
|
||||||
|
|
||||||
if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_DESTROYED) != 0) {
|
if (libxlVmReap(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to destroy domain '%d'"), dom->id);
|
_("Failed to destroy domain '%d'"), dom->id);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -1679,7 +1780,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
|
||||||
|
|
||||||
if (flags & VIR_DOMAIN_MEM_LIVE) {
|
if (flags & VIR_DOMAIN_MEM_LIVE) {
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if (libxl_domain_setmaxmem(&priv->ctx, dom->id, newmem) < 0) {
|
if (libxl_domain_setmaxmem(priv->ctx, dom->id, newmem) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to set maximum memory for domain '%d'"
|
_("Failed to set maximum memory for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
@ -1708,7 +1809,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
|
||||||
|
|
||||||
if (flags & VIR_DOMAIN_MEM_LIVE) {
|
if (flags & VIR_DOMAIN_MEM_LIVE) {
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if (libxl_set_memory_target(&priv->ctx, dom->id, newmem, 0,
|
if (libxl_set_memory_target(priv->ctx, dom->id, newmem, 0,
|
||||||
/* force */ 1) < 0) {
|
/* force */ 1) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to set memory for domain '%d'"
|
_("Failed to set memory for domain '%d'"
|
||||||
|
@ -1768,7 +1869,7 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
|
||||||
info->memory = vm->def->mem.cur_balloon;
|
info->memory = vm->def->mem.cur_balloon;
|
||||||
info->maxMem = vm->def->mem.max_balloon;
|
info->maxMem = vm->def->mem.max_balloon;
|
||||||
} else {
|
} else {
|
||||||
if (libxl_domain_info(&driver->ctx, &d_info, dom->id) != 0) {
|
if (libxl_domain_info(driver->ctx, &d_info, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("libxl_domain_info failed for domain '%d'"), dom->id);
|
_("libxl_domain_info failed for domain '%d'"), dom->id);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -1868,7 +1969,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_domain_suspend(&priv->ctx, NULL, vm->def->id, fd) != 0) {
|
if (libxl_domain_suspend(priv->ctx, vm->def->id, fd, 0, NULL) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to save domain '%d' with libxenlight"),
|
_("Failed to save domain '%d' with libxenlight"),
|
||||||
vm->def->id);
|
vm->def->id);
|
||||||
|
@ -1878,7 +1979,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
|
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
|
||||||
VIR_DOMAIN_EVENT_STOPPED_SAVED);
|
VIR_DOMAIN_EVENT_STOPPED_SAVED);
|
||||||
|
|
||||||
if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_SAVED) != 0) {
|
if (libxlVmReap(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to destroy domain '%d'"), vm->def->id);
|
_("Failed to destroy domain '%d'"), vm->def->id);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -2035,7 +2136,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
|
||||||
|
|
||||||
if (!(flags & VIR_DUMP_LIVE) &&
|
if (!(flags & VIR_DUMP_LIVE) &&
|
||||||
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
||||||
if (libxl_domain_pause(&priv->ctx, dom->id) != 0) {
|
if (libxl_domain_pause(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Before dumping core, failed to suspend domain '%d'"
|
_("Before dumping core, failed to suspend domain '%d'"
|
||||||
" with libxenlight"),
|
" with libxenlight"),
|
||||||
|
@ -2046,7 +2147,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
|
||||||
paused = true;
|
paused = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_domain_core_dump(&priv->ctx, dom->id, to) != 0) {
|
if (libxl_domain_core_dump(priv->ctx, dom->id, to, NULL) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to dump core of domain '%d' with libxenlight"),
|
_("Failed to dump core of domain '%d' with libxenlight"),
|
||||||
dom->id);
|
dom->id);
|
||||||
|
@ -2055,7 +2156,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
|
||||||
|
|
||||||
libxlDriverLock(driver);
|
libxlDriverLock(driver);
|
||||||
if (flags & VIR_DUMP_CRASH) {
|
if (flags & VIR_DUMP_CRASH) {
|
||||||
if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_CRASHED) != 0) {
|
if (libxlVmReap(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to destroy domain '%d'"), dom->id);
|
_("Failed to destroy domain '%d'"), dom->id);
|
||||||
goto cleanup_unlock;
|
goto cleanup_unlock;
|
||||||
|
@ -2076,7 +2177,7 @@ cleanup_unlock:
|
||||||
libxlDriverUnlock(driver);
|
libxlDriverUnlock(driver);
|
||||||
cleanup_unpause:
|
cleanup_unpause:
|
||||||
if (virDomainObjIsActive(vm) && paused) {
|
if (virDomainObjIsActive(vm) && paused) {
|
||||||
if (libxl_domain_unpause(&priv->ctx, dom->id) != 0) {
|
if (libxl_domain_unpause(priv->ctx, dom->id) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("After dumping core, failed to resume domain '%d' with"
|
_("After dumping core, failed to resume domain '%d' with"
|
||||||
" libxenlight"), dom->id);
|
" libxenlight"), dom->id);
|
||||||
|
@ -2234,7 +2335,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
||||||
libxlDomainObjPrivatePtr priv;
|
libxlDomainObjPrivatePtr priv;
|
||||||
virDomainDefPtr def;
|
virDomainDefPtr def;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
libxl_cpumap map;
|
libxl_bitmap map;
|
||||||
uint8_t *bitmask = NULL;
|
uint8_t *bitmask = NULL;
|
||||||
unsigned int maplen;
|
unsigned int maplen;
|
||||||
unsigned int i, pos;
|
unsigned int i, pos;
|
||||||
|
@ -2329,7 +2430,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_VCPU_LIVE:
|
case VIR_DOMAIN_VCPU_LIVE:
|
||||||
if (libxl_set_vcpuonline(&priv->ctx, dom->id, &map) != 0) {
|
if (libxl_set_vcpuonline(priv->ctx, dom->id, &map) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to set vcpus for domain '%d'"
|
_("Failed to set vcpus for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
@ -2338,7 +2439,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
|
case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
|
||||||
if (libxl_set_vcpuonline(&priv->ctx, dom->id, &map) != 0) {
|
if (libxl_set_vcpuonline(priv->ctx, dom->id, &map) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to set vcpus for domain '%d'"
|
_("Failed to set vcpus for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
@ -2434,7 +2535,7 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap,
|
||||||
libxlDomainObjPrivatePtr priv;
|
libxlDomainObjPrivatePtr priv;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
libxl_cpumap map;
|
libxl_bitmap map;
|
||||||
|
|
||||||
libxlDriverLock(driver);
|
libxlDriverLock(driver);
|
||||||
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
||||||
|
@ -2455,7 +2556,7 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap,
|
||||||
|
|
||||||
map.size = maplen;
|
map.size = maplen;
|
||||||
map.map = cpumap;
|
map.map = cpumap;
|
||||||
if (libxl_set_vcpuaffinity(&priv->ctx, dom->id, vcpu, &map) != 0) {
|
if (libxl_set_vcpuaffinity(priv->ctx, dom->id, vcpu, &map) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to pin vcpu '%d' with libxenlight"), vcpu);
|
_("Failed to pin vcpu '%d' with libxenlight"), vcpu);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -2518,7 +2619,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if ((vcpuinfo = libxl_list_vcpu(&priv->ctx, dom->id, &maxcpu,
|
if ((vcpuinfo = libxl_list_vcpu(priv->ctx, dom->id, &maxcpu,
|
||||||
&hostcpus)) == NULL) {
|
&hostcpus)) == NULL) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to list vcpus for domain '%d' with libxenlight"),
|
_("Failed to list vcpus for domain '%d' with libxenlight"),
|
||||||
|
@ -2545,7 +2646,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo,
|
||||||
MIN(maplen, vcpuinfo[i].cpumap.size));
|
MIN(maplen, vcpuinfo[i].cpumap.size));
|
||||||
}
|
}
|
||||||
|
|
||||||
libxl_vcpuinfo_destroy(&vcpuinfo[i]);
|
libxl_vcpuinfo_dispose(&vcpuinfo[i]);
|
||||||
}
|
}
|
||||||
VIR_FREE(vcpuinfo);
|
VIR_FREE(vcpuinfo);
|
||||||
|
|
||||||
|
@ -2603,7 +2704,7 @@ libxlDomainXMLFromNative(virConnectPtr conn, const char * nativeFormat,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
|
if ((ver_info = libxl_get_version_info(driver->ctx)) == NULL) {
|
||||||
VIR_ERROR(_("cannot get version information from libxenlight"));
|
VIR_ERROR(_("cannot get version information from libxenlight"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -2646,7 +2747,7 @@ libxlDomainXMLToNative(virConnectPtr conn, const char * nativeFormat,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
|
if ((ver_info = libxl_get_version_info(driver->ctx)) == NULL) {
|
||||||
VIR_ERROR(_("cannot get version information from libxenlight"));
|
VIR_ERROR(_("cannot get version information from libxenlight"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -2906,10 +3007,10 @@ libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxlMakeDisk(vm->def, disk, &x_disk) < 0)
|
if (libxlMakeDisk(disk, &x_disk) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((ret = libxl_cdrom_insert(&priv->ctx, vm->def->id, &x_disk)) < 0) {
|
if ((ret = libxl_cdrom_insert(priv->ctx, vm->def->id, &x_disk, NULL)) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("libxenlight failed to change media for disk '%s'"),
|
_("libxenlight failed to change media for disk '%s'"),
|
||||||
disk->dst);
|
disk->dst);
|
||||||
|
@ -2961,11 +3062,11 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxlMakeDisk(vm->def, l_disk, &x_disk) < 0)
|
if (libxlMakeDisk(l_disk, &x_disk) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((ret = libxl_device_disk_add(&priv->ctx, vm->def->id,
|
if ((ret = libxl_device_disk_add(priv->ctx, vm->def->id,
|
||||||
&x_disk)) < 0) {
|
&x_disk, NULL)) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("libxenlight failed to attach disk '%s'"),
|
_("libxenlight failed to attach disk '%s'"),
|
||||||
l_disk->dst);
|
l_disk->dst);
|
||||||
|
@ -2998,7 +3099,6 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
|
||||||
virDomainDiskDefPtr l_disk = NULL;
|
virDomainDiskDefPtr l_disk = NULL;
|
||||||
libxl_device_disk x_disk;
|
libxl_device_disk x_disk;
|
||||||
int i;
|
int i;
|
||||||
int wait_secs = 2;
|
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
switch (dev->data.disk->device) {
|
switch (dev->data.disk->device) {
|
||||||
|
@ -3015,11 +3115,11 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
|
||||||
|
|
||||||
l_disk = vm->def->disks[i];
|
l_disk = vm->def->disks[i];
|
||||||
|
|
||||||
if (libxlMakeDisk(vm->def, l_disk, &x_disk) < 0)
|
if (libxlMakeDisk(l_disk, &x_disk) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((ret = libxl_device_disk_del(&priv->ctx, &x_disk,
|
if ((ret = libxl_device_disk_remove(priv->ctx, vm->def->id,
|
||||||
wait_secs)) < 0) {
|
&x_disk, NULL)) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("libxenlight failed to detach disk '%s'"),
|
_("libxenlight failed to detach disk '%s'"),
|
||||||
l_disk->dst);
|
l_disk->dst);
|
||||||
|
@ -3390,13 +3490,13 @@ libxlNodeGetFreeMemory(virConnectPtr conn)
|
||||||
const libxl_version_info* ver_info;
|
const libxl_version_info* ver_info;
|
||||||
libxlDriverPrivatePtr driver = conn->privateData;
|
libxlDriverPrivatePtr driver = conn->privateData;
|
||||||
|
|
||||||
if (libxl_get_physinfo(&driver->ctx, &phy_info)) {
|
if (libxl_get_physinfo(driver->ctx, &phy_info)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("libxl_get_physinfo_info failed"));
|
_("libxl_get_physinfo_info failed"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
|
if ((ver_info = libxl_get_version_info(driver->ctx)) == NULL) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("libxl_get_version_info failed"));
|
_("libxl_get_version_info failed"));
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3543,7 +3643,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
|
||||||
libxlDomainObjPrivatePtr priv;
|
libxlDomainObjPrivatePtr priv;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
char * ret = NULL;
|
char * ret = NULL;
|
||||||
int sched_id;
|
libxl_scheduler sched_id;
|
||||||
|
|
||||||
libxlDriverLock(driver);
|
libxlDriverLock(driver);
|
||||||
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
||||||
|
@ -3560,31 +3660,29 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams)
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
if ((sched_id = libxl_get_sched_id(&priv->ctx)) < 0) {
|
sched_id = libxl_get_scheduler(priv->ctx);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Failed to get scheduler id for domain '%d'"
|
|
||||||
" with libxenlight"), dom->id);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nparams)
|
if (nparams)
|
||||||
*nparams = 0;
|
*nparams = 0;
|
||||||
switch (sched_id) {
|
switch (sched_id) {
|
||||||
case XEN_SCHEDULER_SEDF:
|
case LIBXL_SCHEDULER_SEDF:
|
||||||
ret = strdup("sedf");
|
ret = strdup("sedf");
|
||||||
break;
|
break;
|
||||||
case XEN_SCHEDULER_CREDIT:
|
case LIBXL_SCHEDULER_CREDIT:
|
||||||
ret = strdup("credit");
|
ret = strdup("credit");
|
||||||
if (nparams)
|
if (nparams)
|
||||||
*nparams = XEN_SCHED_CREDIT_NPARAM;
|
*nparams = XEN_SCHED_CREDIT_NPARAM;
|
||||||
break;
|
break;
|
||||||
case XEN_SCHEDULER_CREDIT2:
|
case LIBXL_SCHEDULER_CREDIT2:
|
||||||
ret = strdup("credit2");
|
ret = strdup("credit2");
|
||||||
break;
|
break;
|
||||||
case XEN_SCHEDULER_ARINC653:
|
case LIBXL_SCHEDULER_ARINC653:
|
||||||
ret = strdup("arinc653");
|
ret = strdup("arinc653");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Failed to get scheduler id for domain '%d'"
|
||||||
|
" with libxenlight"), dom->id);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3606,8 +3704,8 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
|
||||||
libxlDriverPrivatePtr driver = dom->conn->privateData;
|
libxlDriverPrivatePtr driver = dom->conn->privateData;
|
||||||
libxlDomainObjPrivatePtr priv;
|
libxlDomainObjPrivatePtr priv;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
libxl_sched_credit sc_info;
|
libxl_domain_sched_params sc_info;
|
||||||
int sched_id;
|
libxl_scheduler sched_id;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
@ -3617,31 +3715,28 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom,
|
||||||
libxlDriverUnlock(driver);
|
libxlDriverUnlock(driver);
|
||||||
|
|
||||||
if (!vm) {
|
if (!vm) {
|
||||||
virReportError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid"));
|
virReportError(VIR_ERR_NO_DOMAIN, "%s",
|
||||||
|
_("no domain with matching uuid"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
if (!virDomainObjIsActive(vm)) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("Domain is not running"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if ((sched_id = libxl_get_sched_id(&priv->ctx)) < 0) {
|
sched_id = libxl_get_scheduler(priv->ctx);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Failed to get scheduler id for domain '%d'"
|
|
||||||
" with libxenlight"), dom->id);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sched_id != XEN_SCHEDULER_CREDIT) {
|
if (sched_id != LIBXL_SCHEDULER_CREDIT) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Only 'credit' scheduler is supported"));
|
_("Only 'credit' scheduler is supported"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) {
|
if (libxl_domain_sched_params_get(priv->ctx, dom->id, &sc_info) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to get scheduler parameters for domain '%d'"
|
_("Failed to get scheduler parameters for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
@ -3684,7 +3779,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
||||||
libxlDriverPrivatePtr driver = dom->conn->privateData;
|
libxlDriverPrivatePtr driver = dom->conn->privateData;
|
||||||
libxlDomainObjPrivatePtr priv;
|
libxlDomainObjPrivatePtr priv;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
libxl_sched_credit sc_info;
|
libxl_domain_sched_params sc_info;
|
||||||
int sched_id;
|
int sched_id;
|
||||||
int i;
|
int i;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
@ -3714,20 +3809,15 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if ((sched_id = libxl_get_sched_id(&priv->ctx)) < 0) {
|
sched_id = libxl_get_scheduler(priv->ctx);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Failed to get scheduler id for domain '%d'"
|
|
||||||
" with libxenlight"), dom->id);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sched_id != XEN_SCHEDULER_CREDIT) {
|
if (sched_id != LIBXL_SCHEDULER_CREDIT) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Only 'credit' scheduler is supported"));
|
_("Only 'credit' scheduler is supported"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) {
|
if (libxl_domain_sched_params_get(priv->ctx, dom->id, &sc_info) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to get scheduler parameters for domain '%d'"
|
_("Failed to get scheduler parameters for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
@ -3744,7 +3834,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libxl_sched_credit_domain_set(&priv->ctx, dom->id, &sc_info) != 0) {
|
if (libxl_domain_sched_params_set(priv->ctx, dom->id, &sc_info) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Failed to set scheduler parameters for domain '%d'"
|
_("Failed to set scheduler parameters for domain '%d'"
|
||||||
" with libxenlight"), dom->id);
|
" with libxenlight"), dom->id);
|
||||||
|
|
Loading…
Reference in New Issue