From ac4818d05a218773365986a791e701d3fddfec30 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 21 Jun 2006 12:56:19 +0000 Subject: [PATCH] * src/driver.h src/libvirt.c src/test.c src/xen_internal.c src/xend_internal.c src/xs_internal.c: add driver numbers and tweak a bit suspend/resume/destroy operation to avoid doing them directly though the hypervisor if other succeeded first. Daniel --- ChangeLog | 7 +++++++ src/driver.h | 16 ++++++++++++++-- src/libvirt.c | 42 +++++++++++++++++++++++++++++++++++++++--- src/test.c | 1 + src/xen_internal.c | 5 +++-- src/xend_internal.c | 1 + src/xs_internal.c | 1 + 7 files changed, 66 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa520a49e8..e356694794 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Jun 21 13:02:30 EDT 2006 Daniel Veillard + + * src/driver.h src/libvirt.c src/test.c src/xen_internal.c + src/xend_internal.c src/xs_internal.c: add driver numbers and + tweak a bit suspend/resume/destroy operation to avoid doing + them directly though the hypervisor if other succeeded first. + Wed Jun 21 12:23:15 EDT 2006 Daniel Veillard * src/xen_internal.c: try to autodetect the Xen hypervisor version diff --git a/src/driver.h b/src/driver.h index 4449c0d4eb..90519faa8c 100644 --- a/src/driver.h +++ b/src/driver.h @@ -13,6 +13,17 @@ extern "C" { #endif +/* + * List of registered drivers numbers + */ +typedef enum { + VIR_DRV_XEN_HYPERVISOR = 1, + VIR_DRV_XEN_STORE = 2, + VIR_DRV_XEN_DAEMON = 3, + VIR_DRV_TEST = 4 +} virDrvNo; + + typedef enum { VIR_DRV_OPEN_QUIET = 1, VIR_DRV_OPEN_RO = 2 @@ -103,8 +114,9 @@ typedef virDriver *virDriverPtr; * entry points for it. */ struct _virDriver { - const char *name; - unsigned long ver; + int no; /* the number virDrvNo */ + const char * name; /* the name of the driver */ + unsigned long ver; /* the version of the backend */ virDrvInit init; virDrvOpen open; virDrvClose close; diff --git a/src/libvirt.c b/src/libvirt.c index c5fe275d07..60e49f18aa 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -731,9 +731,21 @@ virDomainDestroy(virDomainPtr domain) return (-1); #endif - /* Go though the driver registered entry points */ + /* + * Go though the driver registered entry points but use the + * XEN_HYPERVISOR directly only as a last mechanism + */ for (i = 0;i < conn->nb_drivers;i++) { if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) && + (conn->drivers[i]->domainDestroy != NULL)) { + if (conn->drivers[i]->domainDestroy(domain) == 0) + ret = 0; + } + } + for (i = 0;i < conn->nb_drivers;i++) { + if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) && (conn->drivers[i]->domainDestroy != NULL)) { if (conn->drivers[i]->domainDestroy(domain) == 0) ret = 0; @@ -798,9 +810,21 @@ virDomainSuspend(virDomainPtr domain) return (-1); #endif - /* Go though the driver registered entry points */ + /* + * Go though the driver registered entry points but use the + * XEN_HYPERVISOR directly only as a last mechanism + */ + for (i = 0;i < conn->nb_drivers;i++) { + if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) && + (conn->drivers[i]->domainSuspend != NULL)) { + if (conn->drivers[i]->domainSuspend(domain) == 0) + ret = 0; + } + } for (i = 0;i < conn->nb_drivers;i++) { if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) && (conn->drivers[i]->domainSuspend != NULL)) { if (conn->drivers[i]->domainSuspend(domain) == 0) ret = 0; @@ -842,9 +866,21 @@ virDomainResume(virDomainPtr domain) return (-1); #endif - /* Go though the driver registered entry points */ + /* + * Go though the driver registered entry points but use the + * XEN_HYPERVISOR directly only as a last mechanism + */ + for (i = 0;i < conn->nb_drivers;i++) { + if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) && + (conn->drivers[i]->domainResume != NULL)) { + if (conn->drivers[i]->domainResume(domain) == 0) + return(0); + } + } for (i = 0;i < conn->nb_drivers;i++) { if ((conn->drivers[i] != NULL) && + (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) && (conn->drivers[i]->domainResume != NULL)) { if (conn->drivers[i]->domainResume(domain) == 0) return(0); diff --git a/src/test.c b/src/test.c index 09161f3132..bed514cd38 100644 --- a/src/test.c +++ b/src/test.c @@ -17,6 +17,7 @@ #include "test.h" static virDriver testDriver = { + VIR_DRV_TEST, "Test", LIBVIR_VERSION_NUMBER, NULL, /* init */ diff --git a/src/xen_internal.c b/src/xen_internal.c index 209265bf6d..e50786d6f2 100644 --- a/src/xen_internal.c +++ b/src/xen_internal.c @@ -54,6 +54,7 @@ static unsigned long xenHypervisorGetMaxMemory(virDomainPtr domain); static int xenHypervisorInit(void); static virDriver xenHypervisorDriver = { + VIR_DRV_XEN_HYPERVISOR, "Xen", (DOM0_INTERFACE_VERSION >> 24) * 1000000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + @@ -143,7 +144,7 @@ int xenHypervisorInit(void) ret = ioctl(fd, cmd, (unsigned long) &hc); if ((ret != -1) && (ret != 0)) { - fprintf(stderr, "Using new hypervisor call: %X\n", ret); + /* fprintf(stderr, "Using new hypervisor call: %X\n", ret); */ hv_version = ret; xen_ioctl_hypercall_cmd = cmd; old_hypervisor = 0; @@ -156,7 +157,7 @@ int xenHypervisorInit(void) cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(old_hypercall_t)); ret = ioctl(fd, cmd, (unsigned long) &old_hc); if ((ret != -1) && (ret != 0)) { - fprintf(stderr, "Using old hypervisor call: %X\n", ret); + /* fprintf(stderr, "Using old hypervisor call: %X\n", ret); */ hv_version = ret; xen_ioctl_hypercall_cmd = cmd; old_hypervisor = 1; diff --git a/src/xend_internal.c b/src/xend_internal.c index fc1ff7a41e..0879951d20 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -49,6 +49,7 @@ static virDomainPtr xenDaemonCreateLinux(virConnectPtr conn, unsigned int flags); static virDriver xenDaemonDriver = { + VIR_DRV_XEN_DAEMON, "XenDaemon", (DOM0_INTERFACE_VERSION >> 24) * 1000000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + diff --git a/src/xs_internal.c b/src/xs_internal.c index 4dae2eb77f..e648a19763 100644 --- a/src/xs_internal.c +++ b/src/xs_internal.c @@ -32,6 +32,7 @@ #define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd" static virDriver xenStoreDriver = { + VIR_DRV_XEN_STORE, "XenStore", (DOM0_INTERFACE_VERSION >> 24) * 1000000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + -- GitLab