diff --git a/ChangeLog b/ChangeLog index aa520a49e84bcd0368fac49117fdc3a4fdb3cbe2..e3566947946da682910dd8e1910e03b7c4d45e68 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 4449c0d4ebdaecf6a45e640df81d135cd63cc2f0..90519faa8c47c53c75d1bb71fef7a916e0dce510 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 c5fe275d07331ed377edd74807ad8b64932de846..60e49f18aabc415c1c5bc64218acf371703b6719 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 09161f31322fe4f9cfa95f559cb733b3a53f51ae..bed514cd38719176be1cf35fc666ea77692ea83e 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 209265bf6d863dc5d11a8e642ad53cf82a6392fe..e50786d6f2227b25139951122b6bc5fcb9c024d3 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 fc1ff7a41e93dfa33fb9a00fe82e61e4eca5ee60..0879951d20e5c48ede6875cee96abf76553fa7ae 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 4dae2eb77f89ccfe7be982591960ebe9cacbfefd..e648a19763b5827e8c0e21bc0e7eadfa7157610c 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 +