Hi David,
On Wednesday 04 October 2017 08:55 PM, David Hunt wrote: > 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 | 62 > +++++++++++++++++++++++++++++ > examples/vm_power_manager/channel_manager.h | 25 ++++++++++++ > 2 files changed, 87 insertions(+) > > diff --git a/examples/vm_power_manager/channel_manager.c > b/examples/vm_power_manager/channel_manager.c > index e068ae2..03fa626 100644 > --- a/examples/vm_power_manager/channel_manager.c > +++ b/examples/vm_power_manager/channel_manager.c > @@ -574,6 +574,68 @@ set_channel_status(const char *vm_name, unsigned > *channel_list, > return num_channels_changed; > } > > +void > +get_all_vm(int *num_vm, int *num_cpu) > +{ nits: s/*num_cpu/*num_vcpu > + > + virNodeInfo node_info; > + virDomainPtr *domptr; > + uint64_t mask; > + int i, ii, numVcpus[MAX_VCPUS], cpu, n_vcpus; > + unsigned int jj; > + const char *vm_name; > + unsigned int flags = VIR_CONNECT_LIST_DOMAINS_RUNNING | > + VIR_CONNECT_LIST_DOMAINS_PERSISTENT; > + unsigned int flag = VIR_DOMAIN_VCPU_CONFIG; > + nits: Perhaps add more clear name example: s/flags/conn_flags s/flag/domain_flags > + > + memset(global_cpumaps, 0, CHANNEL_CMDS_MAX_CPUS*global_maplen); > + if (virNodeGetInfo(global_vir_conn_ptr, &node_info)) > + RTE_LOG(ERR, CHANNEL_MANAGER, "Unable to retrieve node Info\n"); > + Should return from here.. since node info not retrieve ops errored out. > + /* Returns number of pcpus */ > + global_n_host_cpus = (unsigned int)node_info.cpus; > + > + /* Returns number of active domains */ > + *num_vm = virConnectListAllDomains(global_vir_conn_ptr, &domptr, flags); > + if (*num_vm <= 0) > + RTE_LOG(ERR, CHANNEL_MANAGER, "No Active Domains Running\n"); > + ditto.. > + for (i = 0; i < *num_vm; 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 > 0) { > + *num_cpu = n_vcpus; > + lvm_info[i].num_cpus = n_vcpus; > + } > + > + /* Save pcpu in use by libvirt VMs */ > + 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..788c1e6 100644 > --- a/examples/vm_power_manager/channel_manager.h > +++ b/examples/vm_power_manager/channel_manager.h > @@ -66,6 +66,17 @@ 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[MAX_VCPUS]; > + uint8_t num_cpus; > +}; > + > +struct libvirt_vm_info lvm_info[MAX_VMS]; > /* Communication Channel Status */ > enum channel_status { CHANNEL_MGR_CHANNEL_DISCONNECTED = 0, > CHANNEL_MGR_CHANNEL_CONNECTED, > @@ -319,6 +330,20 @@ int set_channel_status(const char *vm_name, unsigned > *channel_list, > */ > 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. > + * > + * @param noVms > + * modified to store number of active VMs > + * > + * @param noVcpus > + modified to store number of vcpus active > + * > + * @return > + * void > + */ > +void get_all_vm(int *noVms, int *noVcpus); nits: perhaps, void get_all_vm(int *num_vm, int *num_vcpu) Thanks. > #ifdef __cplusplus > } > #endif