diff -r 446aa56ca4fe tools/xenstat/libxenstat/src/xen-interface.c --- a/tools/xenstat/libxenstat/src/xen-interface.c Mon Oct 17 12:50:28 2005 +++ b/tools/xenstat/libxenstat/src/xen-interface.c Mon Oct 17 16:52:13 2005 @@ -189,6 +189,24 @@ return op.u.getvcpuinfo.cpu_time; } +/* Get vcpu info from a domain */ +int xi_get_domain_vcpu_info(xi_handle *handle, unsigned int domain, + unsigned int vcpu, dom0_getvcpuinfo_t *info) +{ + dom0_op_t op; + op.u.getvcpuinfo.domain = domain; + op.u.getvcpuinfo.vcpu = vcpu; + + if (xi_make_dom0_op(handle, &op, DOM0_GETVCPUINFO) < 0) { + perror("DOM0_GETVCPUINFO Hypercall failed"); + return -1; + } + + memcpy(info, &op.u.getvcpuinfo, sizeof(dom0_getvcpuinfo_t)); + + return 0; +} + /* gets xen version information from hypervisor */ int xi_get_xen_version(xi_handle *handle, long *vnum, xen_extraversion_t *ver) { diff -r 446aa56ca4fe tools/xenstat/libxenstat/src/xen-interface.h --- a/tools/xenstat/libxenstat/src/xen-interface.h Mon Oct 17 12:50:28 2005 +++ b/tools/xenstat/libxenstat/src/xen-interface.h Mon Oct 17 16:52:13 2005 @@ -43,3 +43,7 @@ /* Returns cpu usage data from dom0 */ long long xi_get_vcpu_usage(xi_handle *, unsigned int, unsigned int); + +/* Get vcpu info from a domain */ +int xi_get_domain_vcpu_info(xi_handle *, unsigned int, unsigned int, + dom0_getvcpuinfo_t *); diff -r 446aa56ca4fe tools/xenstat/libxenstat/src/xenstat.c --- a/tools/xenstat/libxenstat/src/xenstat.c Mon Oct 17 12:50:28 2005 +++ b/tools/xenstat/libxenstat/src/xenstat.c Mon Oct 17 16:52:13 2005 @@ -51,7 +51,7 @@ unsigned int id; unsigned int state; unsigned long long cpu_ns; - unsigned int num_vcpus; + unsigned int num_vcpus; /* Number of VCPUs */ xenstat_vcpu *vcpus; /* Array of length num_vcpus */ unsigned long long cur_mem; /* Current memory reservation */ unsigned long long max_mem; /* Total memory allowed */ @@ -61,6 +61,7 @@ }; struct xenstat_vcpu { + unsigned int online; unsigned long long ns; }; @@ -100,6 +101,8 @@ xenstat_uninit_func uninit; } xenstat_collector; +static int xenstat_domain_vcpu_online(xenstat_node *node, unsigned int domain, + unsigned int vcpu); static int xenstat_collect_vcpus(xenstat_node * node); static int xenstat_collect_networks(xenstat_node * node); static int xenstat_collect_xen_version(xenstat_node * node); @@ -229,7 +232,7 @@ domain->id = domaininfo[i].domain; domain->state = domaininfo[i].flags; domain->cpu_ns = domaininfo[i].cpu_time; - domain->num_vcpus = domaininfo[i].nr_online_vcpus; + domain->num_vcpus = (domaininfo[i].max_vcpu_id+1); domain->vcpus = NULL; domain->cur_mem = ((unsigned long long)domaininfo[i].tot_pages) @@ -344,7 +347,7 @@ return domain->cpu_ns; } -/* Find the number of VCPUs allocated to a domain */ +/* Find the number of VCPUs for a domain */ unsigned int xenstat_domain_num_vcpus(xenstat_domain * domain) { return domain->num_vcpus; @@ -428,25 +431,49 @@ /* * VCPU functions */ +/* Get a VCPU's online status */ +static int xenstat_domain_vcpu_online(xenstat_node *node, unsigned int domain, + unsigned int vcpu) +{ + dom0_getvcpuinfo_t vcpuinfo; + + if (xi_get_domain_vcpu_info(node->handle->xihandle, domain, vcpu, + &vcpuinfo) != 0) + return -1; + + return vcpuinfo.online; +} + /* Collect information about VCPUs */ static int xenstat_collect_vcpus(xenstat_node * node) { unsigned int i, vcpu; - /* Fill in VCPU information */ + + /* Fill in enabled/online VCPU information */ for (i = 0; i < node->num_domains; i++) { node->domains[i].vcpus = malloc(node->domains[i].num_vcpus * sizeof(xenstat_vcpu)); if (node->domains[i].vcpus == NULL) return 0; - + for (vcpu = 0; vcpu < node->domains[i].num_vcpus; vcpu++) { /* FIXME: need to be using a more efficient mechanism*/ long long vcpu_time; + + node->domains[i].vcpus[vcpu].online = + xenstat_domain_vcpu_online(node, + node->domains[i].id, vcpu); + if (node->domains[i].vcpus[vcpu].online < 0) + return 0; + else if (node->domains[i].vcpus[vcpu].online == 0) + continue; + vcpu_time = xi_get_vcpu_usage(node->handle->xihandle, node->domains[i].id, vcpu); if (vcpu_time < 0) return 0; + node->domains[i].vcpus[vcpu].ns = vcpu_time; } } @@ -464,6 +491,12 @@ /* Free VCPU information in handle - nothing to do */ static void xenstat_uninit_vcpus(xenstat_handle * handle) { +} + +/* Get VCPU online status */ +unsigned int xenstat_vcpu_online(xenstat_vcpu * vcpu) +{ + return vcpu->online; } /* Get VCPU usage */ diff -r 446aa56ca4fe tools/xenstat/libxenstat/src/xenstat.h --- a/tools/xenstat/libxenstat/src/xenstat.h Mon Oct 17 12:50:28 2005 +++ b/tools/xenstat/libxenstat/src/xenstat.h Mon Oct 17 16:52:13 2005 @@ -119,6 +119,7 @@ */ /* Get VCPU usage */ +unsigned int xenstat_vcpu_online(xenstat_vcpu * vcpu); unsigned long long xenstat_vcpu_ns(xenstat_vcpu * vcpu); diff -r 446aa56ca4fe tools/xenstat/xentop/xentop.c --- a/tools/xenstat/xentop/xentop.c Mon Oct 17 12:50:28 2005 +++ b/tools/xenstat/xentop/xentop.c Mon Oct 17 16:52:13 2005 @@ -713,13 +713,16 @@ num_vcpus = xenstat_domain_num_vcpus(domain); - /* for all vcpus dump out values */ + /* for all online vcpus dump out values */ for (i=0; i< num_vcpus; i++) { vcpu = xenstat_domain_vcpu(domain,i); - if (i != 0 && (i%5)==0) - print("\n "); - print(" %2u: %10llus", i, xenstat_vcpu_ns(vcpu)/1000000000); + if (xenstat_vcpu_online(vcpu) > 0) { + if (i != 0 && (i%5)==0) + print("\n "); + print(" %2u: %10llus", i, + xenstat_vcpu_ns(vcpu)/1000000000); + } } print("\n"); }