Signed-off-by: Nemanja Marjanovic <nemanja.marjano...@intel.com> Signed-off-by: Rory Sexton <rory.sex...@intel.com> Signed-off-by: David Hunt <david.h...@intel.com> --- examples/vm_power_manager/channel_manager.c | 55 +++++++++++++++++++++++++++++ examples/vm_power_manager/channel_manager.h | 16 ++++++++- 2 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/examples/vm_power_manager/channel_manager.c b/examples/vm_power_manager/channel_manager.c index e068ae2..2abba9c 100644 --- a/examples/vm_power_manager/channel_manager.c +++ b/examples/vm_power_manager/channel_manager.c @@ -574,6 +574,61 @@ set_channel_status(const char *vm_name, unsigned *channel_list, return num_channels_changed; } +void +get_all_vm(int *noVms, int *noVcpus) { + + virNodeInfo info; + virDomainPtr *domptr; + uint64_t mask; + int ret, i, numVcpus[MAX_VCPUS], cpu; + unsigned int ii, jj, n_vcpus; + const char *vm_name; + unsigned int flags = VIR_CONNECT_LIST_DOMAINS_RUNNING | + VIR_CONNECT_LIST_DOMAINS_PERSISTENT; + unsigned int flag = VIR_DOMAIN_VCPU_CONFIG; + + + memset(global_cpumaps, 0, CHANNEL_CMDS_MAX_CPUS*global_maplen); + if (virNodeGetInfo(global_vir_conn_ptr, &info)) + RTE_LOG(ERR, CHANNEL_MANAGER, "Unable to retrieve node Info\n"); + + /*Returns number of pcpus*/ + global_n_host_cpus = (unsigned int)info.cpus; + + /*Returns number of active domains */ + ret = virConnectListAllDomains(global_vir_conn_ptr, &domptr, flags); + *noVms = ret; + if (ret < 0) + RTE_LOG(ERR, CHANNEL_MANAGER, "No Active Domains Running\n"); + + for (i = 0; i < ret; i++) { + + /*Get Domain Names*/ + vm_name = virDomainGetName(domptr[i]); + lvm_info[i].vm_name = vm_name; + /*Get Number of Vcpus*/ + numVcpus[i] = virDomainGetVcpusFlags(domptr[i], flag); + /*Get Number of VCpus & VcpuPinInfo*/ + n_vcpus = virDomainGetVcpuPinInfo(domptr[i], + numVcpus[i], global_cpumaps, + global_maplen, flag); + if ((int)n_vcpus > *noVcpus) + *noVcpus = n_vcpus; + for (ii = 0; ii < n_vcpus; ii++) { + mask = 0; + for (jj = 0; jj < global_n_host_cpus; jj++) { + if (VIR_CPU_USABLE(global_cpumaps, + global_maplen, ii, jj) > 0) { + mask |= 1ULL << jj; + } + } + ITERATIVE_BITMASK_CHECK_64(mask, cpu) { + lvm_info[i].pcpus[ii] = cpu; + } + } + } +} + int get_info_vm(const char *vm_name, struct vm_info *info) { diff --git a/examples/vm_power_manager/channel_manager.h b/examples/vm_power_manager/channel_manager.h index 47c3b9c..8dff76c 100644 --- a/examples/vm_power_manager/channel_manager.h +++ b/examples/vm_power_manager/channel_manager.h @@ -66,6 +66,16 @@ struct sockaddr_un _sockaddr_un; #define UNIX_PATH_MAX sizeof(_sockaddr_un.sun_path) #endif +#define MAX_VMS 4 +#define MAX_VCPUS 20 + + +struct libvirt_vm_info { + const char *vm_name; + unsigned int pcpus[22]; +}; + +struct libvirt_vm_info lvm_info[MAX_VMS]; /* Communication Channel Status */ enum channel_status { CHANNEL_MGR_CHANNEL_DISCONNECTED = 0, CHANNEL_MGR_CHANNEL_CONNECTED, @@ -318,7 +328,11 @@ int set_channel_status(const char *vm_name, unsigned *channel_list, * - Negative on error. */ int get_info_vm(const char *vm_name, struct vm_info *info); - +/** + * Populates a table with all domains running and their physical cpu. + * All information is gathered through libvirt api. + */ +void get_all_vm(int *noVms, int *noVcpus); #ifdef __cplusplus } #endif -- 2.7.4