]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Introduce virDomainPMSuspendForDuration API
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 26 Jan 2012 18:05:46 +0000 (19:05 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Sat, 28 Jan 2012 09:20:46 +0000 (10:20 +0100)
This API allows a domain to be put into one of S# ACPI states.
Currently, S3 and S4 are supported. These states are shared
with virNodeSuspendForDuration.
However, for now we don't support any duration other than zero.
The same apply for flags.

include/libvirt/libvirt.h.in
src/driver.h
src/libvirt.c
src/libvirt_public.syms
src/remote/remote_driver.c
src/remote/remote_protocol.x
src/remote_protocol-structs
src/rpc/gendispatch.pl

index d26cbbdb1896185dcf3ba00113108c7a6e8b27c2..edc9d708b82d5429bc408470ba42d133453fc342 100644 (file)
@@ -1232,7 +1232,10 @@ int                     virDomainFree           (virDomainPtr domain);
  */
 int                     virDomainSuspend        (virDomainPtr domain);
 int                     virDomainResume         (virDomainPtr domain);
-
+int                     virDomainPMSuspendForDuration (virDomainPtr domain,
+                                                       unsigned int target,
+                                                       unsigned long long duration,
+                                                       unsigned int flags);
 /*
  * Domain save/restore
  */
index 485b578ad6d279cc205d042371862050312c3116..faeff34cd35968e73982057bf3a0bd0d12244d34 100644 (file)
@@ -119,6 +119,11 @@ typedef int
         (*virDrvDomainSuspend)         (virDomainPtr domain);
 typedef int
         (*virDrvDomainResume)          (virDomainPtr domain);
+typedef int
+        (*virDrvDomainPMSuspendForDuration) (virDomainPtr,
+                                             unsigned int target,
+                                             unsigned long long duration,
+                                             unsigned int flags);
 typedef int
         (*virDrvDomainShutdown)                (virDomainPtr domain);
 typedef int
@@ -831,6 +836,7 @@ struct _virDriver {
     virDrvDomainLookupByUUID   domainLookupByUUID;
     virDrvDomainLookupByName   domainLookupByName;
     virDrvDomainSuspend                domainSuspend;
+    virDrvDomainPMSuspendForDuration domainPMSuspendForDuration;
     virDrvDomainResume         domainResume;
     virDrvDomainShutdown               domainShutdown;
     virDrvDomainShutdownFlags   domainShutdownFlags;
index 540d74a65f55d72cda191759da13a475749ac1f1..812bc0ff6246add23115783f9a2ee3de90a125a0 100644 (file)
@@ -2432,6 +2432,64 @@ error:
     return -1;
 }
 
+/**
+ * virDomainPMSuspendForDuration:
+ * @dom: a domain object
+ * @target: an OR'ed set of virNodeSuspendTarget
+ * @duration: currently unused, pass 0
+ * @flags: ditto
+ *
+ * Attempt to suspend given domain. However, more
+ * states are supported than in virDomainSuspend.
+ *
+ * Dependent on hypervisor used, this may require
+ * guest agent to be available, e.g. QEMU.
+ *
+ * Returns: 0 on success,
+ *          -1 on failure.
+ */
+int
+virDomainPMSuspendForDuration(virDomainPtr dom,
+                              unsigned int target,
+                              unsigned long long duration,
+                              unsigned int flags)
+{
+    virConnectPtr conn;
+
+    VIR_DOMAIN_DEBUG(dom, "target=%u duration=%llu flags=%x",
+                     target, duration, flags);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(dom)) {
+        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = dom->conn;
+
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
+    if (conn->driver->domainPMSuspendForDuration) {
+        int ret;
+        ret = conn->driver->domainPMSuspendForDuration(dom, target,
+                                                       duration, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
+
 /**
  * virDomainSave:
  * @domain: a domain object
index 8bdb24bae276bf7b8be343b7849c30a04de999cc..7371c5c11c0f44539fc360d06acac71bb15ee3db 100644 (file)
@@ -521,6 +521,7 @@ LIBVIRT_0.9.10 {
         virDomainShutdownFlags;
         virStorageVolResize;
         virStorageVolWipePattern;
+        virDomainPMSuspendForDuration;
 } LIBVIRT_0.9.9;
 
 # .... define new API here using predicted next version number ....
index 2bb4cbf69fc751f4ea2977a4ed660f1339d34de4..ead0192107ae40f378bd6fde2d36a8890b3fe776 100644 (file)
@@ -4616,6 +4616,7 @@ static virDriver remote_driver = {
     .domainLookupByName = remoteDomainLookupByName, /* 0.3.0 */
     .domainSuspend = remoteDomainSuspend, /* 0.3.0 */
     .domainResume = remoteDomainResume, /* 0.3.0 */
+    .domainPMSuspendForDuration = remoteDomainPMSuspendForDuration, /* 0.9.10 */
     .domainShutdown = remoteDomainShutdown, /* 0.3.0 */
     .domainShutdownFlags = remoteDomainShutdownFlags, /* 0.9.10 */
     .domainReboot = remoteDomainReboot, /* 0.3.0 */
index 7d104b25a80f01da534420b1f17ac1a37b007bcf..d0f75bbae9d73c16ddea646875685503ec674789 100644 (file)
@@ -732,6 +732,13 @@ struct remote_domain_suspend_args {
     remote_nonnull_domain dom;
 };
 
+struct remote_domain_pm_suspend_for_duration_args {
+    remote_nonnull_domain dom;
+    unsigned int target;
+    unsigned hyper duration;
+    unsigned int flags;
+};
+
 struct remote_domain_resume_args {
     remote_nonnull_domain dom;
 };
@@ -2674,7 +2681,9 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257, /* skipgen skipgen */
     REMOTE_PROC_DOMAIN_SHUTDOWN_FLAGS = 258, /* autogen autogen */
     REMOTE_PROC_STORAGE_VOL_WIPE_PATTERN = 259, /* autogen autogen */
-    REMOTE_PROC_STORAGE_VOL_RESIZE = 260 /* autogen autogen */
+    REMOTE_PROC_STORAGE_VOL_RESIZE = 260, /* autogen autogen */
+
+    REMOTE_PROC_DOMAIN_PM_SUSPEND_FOR_DURATION = 261 /* autogen autogen */
 
     /*
      * Notice how the entries are grouped in sets of 10 ?
index 70a69f661c8968cb79652aff0c24d0ed900d0913..ad08fd5774f591ba378d59940b2ebfd038bf06e7 100644 (file)
@@ -440,6 +440,12 @@ struct remote_domain_lookup_by_name_ret {
 struct remote_domain_suspend_args {
         remote_nonnull_domain      dom;
 };
+struct remote_domain_pm_suspend_for_duration_args {
+        remote_nonnull_domain      dom;
+        u_int                      target;
+        uint64_t                   duration;
+        u_int                      flags;
+};
 struct remote_domain_resume_args {
         remote_nonnull_domain      dom;
 };
@@ -2107,4 +2113,5 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_SHUTDOWN_FLAGS = 258,
         REMOTE_PROC_STORAGE_VOL_WIPE_PATTERN = 259,
         REMOTE_PROC_STORAGE_VOL_RESIZE = 260,
+        REMOTE_PROC_DOMAIN_PM_SUSPEND_FOR_DURATION = 261,
 };
index 0460fca32ec70d4fd4ac2de49faebbba1c4c7f80..446f2290eeb476ca6f2586c2ed70411d438a3e42 100755 (executable)
@@ -37,7 +37,7 @@ sub name_to_ProcName {
     @elems = map { $_ =~ s/Nwfilter/NWFilter/; $_ =~ s/Xml$/XML/;
                    $_ =~ s/Uri$/URI/; $_ =~ s/Uuid$/UUID/; $_ =~ s/Id$/ID/;
                    $_ =~ s/Mac$/MAC/; $_ =~ s/Cpu$/CPU/; $_ =~ s/Os$/OS/;
-                   $_ =~ s/Nmi$/NMI/; $_ } @elems;
+                   $_ =~ s/Nmi$/NMI/; $_ =~ s/Pm/PM/; $_ } @elems;
     join "", @elems
 }