On Mon, Nov 02, 2009 at 03:02:46PM -0500, Cole Robinson wrote:
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/test/test_driver.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 89 insertions(+), 1 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 078658f..5b871aa 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2005,6 +2005,94 @@ cleanup:
return ret;
}
+static int testDomainGetVcpus(virDomainPtr domain,
+ virVcpuInfoPtr info,
+ int maxinfo,
+ unsigned char *cpumaps,
+ int maplen)
+{
+ testConnPtr privconn = domain->conn->privateData;
+ testDomainObjPrivatePtr privdomdata;
+ virDomainObjPtr privdom;
+ int i, v, maxcpu, hostcpus;
+ int ret = -1;
+ struct timeval tv;
+ unsigned long long statbase;
+
+ testDriverLock(privconn);
+ privdom = virDomainFindByName(&privconn->domains, domain->name);
+ testDriverUnlock(privconn);
+
+ if (privdom == NULL) {
+ testError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ goto cleanup;
+ }
+
+ if (!virDomainIsActive(privdom)) {
+ testError(domain->conn, VIR_ERR_OPERATION_INVALID,
+ "%s",_("cannot list vcpus for an inactive
domain"));
+ goto cleanup;
+ }
+
+ privdomdata = privdom->privateData;
+
+ if (gettimeofday(&tv, NULL) < 0) {
+ virReportSystemError(domain->conn, errno,
+ "%s", _("getting time of day"));
+ goto cleanup;
+ }
+
+ statbase = (tv.tv_sec * 1000UL * 1000UL) + tv.tv_usec;
+
+
+ hostcpus = VIR_NODEINFO_MAXCPUS(privconn->nodeInfo);
+ maxcpu = maplen * 8;
+ if (maxcpu > hostcpus)
+ maxcpu = hostcpus;
+
+ /* Clamp to actual number of vcpus */
+ if (maxinfo > privdom->def->vcpus)
+ maxinfo = privdom->def->vcpus;
+
+ /* Populate virVcpuInfo structures */
+ if (info != NULL) {
+ memset(info, 0, sizeof(*info) * maxinfo);
+
+ for (i = 0 ; i < maxinfo ; i++) {
+ virVcpuInfo privinfo = privdomdata->vcpu_infos[i];
+
+ info[i].number = privinfo.number;
+ info[i].state = privinfo.state;
+ info[i].cpu = privinfo.cpu;
+
+ /* Fake an increasing cpu time value */
+ info[i].cpuTime = statbase / 10;
+ }
+ }
+
+ /* Populate cpumaps */
+ if (cpumaps != NULL) {
+ int privmaplen = VIR_CPU_MAPLEN(hostcpus);
+ memset(cpumaps, 0, maplen * maxinfo);
+
+ for (v = 0 ; v < maxinfo ; v++) {
+ unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
+
+ for (i = 0 ; i < maxcpu ; i++) {
+ if (VIR_CPU_USABLE(privdomdata->cpumaps, privmaplen, v, i)) {
+ VIR_USE_CPU(cpumap, i);
+ }
+ }
+ }
+ }
+
+ ret = maxinfo;
+cleanup:
+ if (privdom)
+ virDomainObjUnlock(privdom);
+ return ret;
+}
+
static char *testDomainDumpXML(virDomainPtr domain, int flags)
{
testConnPtr privconn = domain->conn->privateData;
@@ -4860,7 +4948,7 @@ static virDriver testDriver = {
testDomainCoreDump, /* domainCoreDump */
testSetVcpus, /* domainSetVcpus */
NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
+ testDomainGetVcpus, /* domainGetVcpus */
testDomainGetMaxVcpus, /* domainGetMaxVcpus */
NULL, /* domainGetSecurityLabel */
NULL, /* nodeGetSecurityModel */
ACK
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|