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.
*/
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
*/
(*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
virDrvDomainLookupByUUID domainLookupByUUID;
virDrvDomainLookupByName domainLookupByName;
virDrvDomainSuspend domainSuspend;
+ virDrvDomainPMSuspendForDuration domainPMSuspendForDuration;
virDrvDomainResume domainResume;
virDrvDomainShutdown domainShutdown;
virDrvDomainShutdownFlags domainShutdownFlags;
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
virDomainShutdownFlags;
virStorageVolResize;
virStorageVolWipePattern;
+ virDomainPMSuspendForDuration;
} LIBVIRT_0.9.9;
# .... define new API here using predicted next version number ....
.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 */
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;
};
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 ?
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;
};
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,
};
@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
}