]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
* src/driver.h src/libvirt.c src/test.c src/xen_internal.c
authorDaniel Veillard <veillard@redhat.com>
Wed, 21 Jun 2006 12:56:19 +0000 (12:56 +0000)
committerDaniel Veillard <veillard@redhat.com>
Wed, 21 Jun 2006 12:56:19 +0000 (12:56 +0000)
  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
src/driver.h
src/libvirt.c
src/test.c
src/xen_internal.c
src/xend_internal.c
src/xs_internal.c

index aa520a49e84bcd0368fac49117fdc3a4fdb3cbe2..e3566947946da682910dd8e1910e03b7c4d45e68 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Jun 21 13:02:30 EDT 2006 Daniel Veillard <veillard@redhat.com>
+
+       * 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 <veillard@redhat.com>
 
        * src/xen_internal.c: try to autodetect the Xen hypervisor version
index 4449c0d4ebdaecf6a45e640df81d135cd63cc2f0..90519faa8c47c53c75d1bb71fef7a916e0dce510 100644 (file)
 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;
index c5fe275d07331ed377edd74807ad8b64932de846..60e49f18aabc415c1c5bc64218acf371703b6719 100644 (file)
@@ -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);
index 09161f31322fe4f9cfa95f559cb733b3a53f51ae..bed514cd38719176be1cf35fc666ea77692ea83e 100644 (file)
@@ -17,6 +17,7 @@
 #include "test.h"
 
 static virDriver testDriver = {
+  VIR_DRV_TEST,
   "Test",
   LIBVIR_VERSION_NUMBER,
   NULL, /* init */
index 209265bf6d863dc5d11a8e642ad53cf82a6392fe..e50786d6f2227b25139951122b6bc5fcb9c024d3 100644 (file)
@@ -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;
index fc1ff7a41e93dfa33fb9a00fe82e61e4eca5ee60..0879951d20e5c48ede6875cee96abf76553fa7ae 100644 (file)
@@ -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 +
index 4dae2eb77f89ccfe7be982591960ebe9cacbfefd..e648a19763b5827e8c0e21bc0e7eadfa7157610c 100644 (file)
@@ -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 +