From 02a0500d22e6318fa1ad58eb7340d579ed61e842 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Tue, 6 Dec 2005 16:12:49 +0000 Subject: [PATCH] * include/libvir.h src/libvir.c src/virsh.c: adding the extraction of the number of virtual CPUs for both interfaces. Daniel --- ChangeLog | 5 +++++ include/libvir.h | 7 ++++--- src/libvir.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- src/virsh.c | 3 ++- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c03566953e..00a140c75f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Dec 6 17:12:52 CET 2005 Daniel Veillard + + * include/libvir.h src/libvir.c src/virsh.c: adding the extraction + of the number of virtual CPUs for both interfaces. + Tue Dec 6 14:46:50 CET 2005 Daniel Veillard * include/libvir.h src/libvir.c src/virsh.c: tweaking of the diff --git a/include/libvir.h b/include/libvir.h index 1105cf7656..ed8a738d94 100644 --- a/include/libvir.h +++ b/include/libvir.h @@ -70,9 +70,10 @@ typedef enum { typedef struct _virDomainInfo virDomainInfo; struct _virDomainInfo { - unsigned char state; /* the running state, a virDomainFlags */ - unsigned long maxMem; /* the maximum number of bytes allowed */ - unsigned long memory; /* the number of bytes used by the domain */ + unsigned char state; /* the running state, one of virDomainFlags */ + unsigned long maxMem; /* the maximum memory in bytes allowed */ + unsigned long memory; /* the memory in bytes used by the domain */ + unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */ /* * Informations below are only available to clients with a connection diff --git a/src/libvir.c b/src/libvir.c index 07afe83633..27265c8c6a 100644 --- a/src/libvir.c +++ b/src/libvir.c @@ -298,6 +298,8 @@ virDomainLookupByName(virConnectPtr conn, const char *name) { return(NULL); } +#if 0 +/* Not used ATM */ /** * virConnectDoStoreQuery: * @conn: pointer to the hypervisor connection @@ -319,6 +321,34 @@ virConnectDoStoreQuery(virConnectPtr conn, const char *path) { ret = xs_read(conn->xshandle, t, path, &len); +done: + if (t != NULL) + xs_transaction_end(conn->xshandle, t, 0); + return(ret); +} +#endif + +/** + * virConnectDoStoreList: + * @conn: pointer to the hypervisor connection + * @path: the absolute path of the directory in the store to list + * @nb: OUT pointer to the number of items found + * + * Internal API querying the Xenstore for a list + * + * Returns a string which must be freed by the caller or NULL in case of error + */ +static char ** +virConnectDoStoreList(virConnectPtr conn, const char *path, unsigned int *nb) { + struct xs_transaction_handle* t; + char **ret = NULL; + + t = xs_transaction_start(conn->xshandle); + if (t == NULL) + goto done; + + ret = xs_directory(conn->xshandle, t, path, nb); + done: if (t != NULL) xs_transaction_end(conn->xshandle, t, 0); @@ -542,7 +572,9 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { return(-1); memset(info, 0, sizeof(virDomainInfo)); if (domain->conn->flags & VIR_CONNECT_RO) { - char *tmp; + char *tmp, **tmp2; + unsigned int nb_vcpus; + char request[200]; tmp = virDomainDoStoreQuery(domain, "running"); if (tmp != NULL) { @@ -561,6 +593,8 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { info->memory = 0; info->maxMem = 0; } +#if 0 + /* doesn't seems to work */ tmp = virDomainDoStoreQuery(domain, "cpu_time"); if (tmp != NULL) { info->cpuTime = atol(tmp); @@ -568,6 +602,15 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { } else { info->cpuTime = 0; } +#endif + snprintf(request, 199, "/local/domain/%d/cpu", domain->handle); + request[199] = 0; + tmp2 = virConnectDoStoreList(domain->conn, request, &nb_vcpus); + if (tmp2 != NULL) { + info->nrVirtCpu = nb_vcpus; + free(tmp2); + } + } else { xc_domaininfo_t dominfo; @@ -604,6 +647,7 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { info->cpuTime = dominfo.cpu_time; info->memory = dominfo.tot_pages * 4096; info->maxMem = dominfo.max_pages * 4096; + info->nrVirtCpu = dominfo.nr_online_vcpus; } return(0); } diff --git a/src/virsh.c b/src/virsh.c index 6c9705f1c5..f1d17553f2 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -48,11 +48,12 @@ static void printDomain(virDomainPtr dom) { default: break; } + printf("%d vCPU, ", info.nrVirtCpu); if (info.cpuTime != 0) { float cpuUsed = info.cpuTime; cpuUsed /= 1000000000; - printf("%.1f s CPU time, ", cpuUsed); + printf("%.1fs time, ", cpuUsed); } mem = info.memory; mem /= 1024 * 1024; -- GitLab