13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 23998e2a0SBruce Richardson * Copyright(c) 2010-2014 Intel Corporation 3e8ae9b66SAlan Carew */ 4e8ae9b66SAlan Carew 5e8ae9b66SAlan Carew #ifndef CHANNEL_MANAGER_H_ 6e8ae9b66SAlan Carew #define CHANNEL_MANAGER_H_ 7e8ae9b66SAlan Carew 8e8ae9b66SAlan Carew #include <linux/limits.h> 9666272d2SThomas Monjalon #include <linux/un.h> 101deb502eSMarcin Hajkowski #include <stdbool.h> 11fcccf6f1SMarvin Liu 1292e68d9cSTyler Retzlaff #include <rte_stdatomic.h> 1392e68d9cSTyler Retzlaff 14*719834a6SMattias Rönnblom #ifdef __cplusplus 15*719834a6SMattias Rönnblom extern "C" { 16*719834a6SMattias Rönnblom #endif 17*719834a6SMattias Rönnblom 18e8ae9b66SAlan Carew /* Maximum name length including '\0' terminator */ 19e8ae9b66SAlan Carew #define CHANNEL_MGR_MAX_NAME_LEN 64 20e8ae9b66SAlan Carew 21e8ae9b66SAlan Carew /* Hypervisor Path for libvirt(qemu/KVM) */ 22e8ae9b66SAlan Carew #define CHANNEL_MGR_DEFAULT_HV_PATH "qemu:///system" 23e8ae9b66SAlan Carew 24e8ae9b66SAlan Carew /* File socket directory */ 25e8ae9b66SAlan Carew #define CHANNEL_MGR_SOCKET_PATH "/tmp/powermonitor/" 26e8ae9b66SAlan Carew 27221e7026SMarcin Hajkowski /* FIFO file name template */ 28221e7026SMarcin Hajkowski #define CHANNEL_MGR_FIFO_PATTERN_NAME "fifo" 29221e7026SMarcin Hajkowski 3090a774c4SDavid Hunt #define MAX_CLIENTS 64 31dff22404SDavid Hunt #define MAX_VCPUS 20 32dff22404SDavid Hunt 33dff22404SDavid Hunt 34dff22404SDavid Hunt struct libvirt_vm_info { 35dff22404SDavid Hunt const char *vm_name; 36dff22404SDavid Hunt unsigned int pcpus[MAX_VCPUS]; 37dff22404SDavid Hunt uint8_t num_cpus; 38dff22404SDavid Hunt }; 39dff22404SDavid Hunt 4096d3d532SThomas Monjalon extern struct libvirt_vm_info lvm_info[MAX_CLIENTS]; 41e8ae9b66SAlan Carew /* Communication Channel Status */ 42e8ae9b66SAlan Carew enum channel_status { CHANNEL_MGR_CHANNEL_DISCONNECTED = 0, 43e8ae9b66SAlan Carew CHANNEL_MGR_CHANNEL_CONNECTED, 44e8ae9b66SAlan Carew CHANNEL_MGR_CHANNEL_DISABLED, 45e8ae9b66SAlan Carew CHANNEL_MGR_CHANNEL_PROCESSING}; 46e8ae9b66SAlan Carew 473618326fSDavid Hunt /* Communication Channel Type */ 483618326fSDavid Hunt enum channel_type { 493618326fSDavid Hunt CHANNEL_TYPE_BINARY = 0, 503618326fSDavid Hunt CHANNEL_TYPE_INI, 513618326fSDavid Hunt CHANNEL_TYPE_JSON 523618326fSDavid Hunt }; 533618326fSDavid Hunt 54e8ae9b66SAlan Carew /* VM libvirt(qemu/KVM) connection status */ 55e8ae9b66SAlan Carew enum vm_status { CHANNEL_MGR_VM_INACTIVE = 0, CHANNEL_MGR_VM_ACTIVE}; 56e8ae9b66SAlan Carew 57e8ae9b66SAlan Carew /* 58e8ae9b66SAlan Carew * Represents a single and exclusive VM channel that exists between a guest and 59e8ae9b66SAlan Carew * the host. 60e8ae9b66SAlan Carew */ 61e8ae9b66SAlan Carew struct channel_info { 620d74597cSBruce Richardson char channel_path[UNIX_PATH_MAX]; /**< Path to host socket */ 6392e68d9cSTyler Retzlaff volatile RTE_ATOMIC(uint32_t) status; /**< Connection status(enum channel_status) */ 64e8ae9b66SAlan Carew int fd; /**< AF_UNIX socket fd */ 65e8ae9b66SAlan Carew unsigned channel_num; /**< CHANNEL_MGR_SOCKET_PATH/<vm_name>.channel_num */ 663618326fSDavid Hunt enum channel_type type; /**< Binary, ini, json, etc. */ 67e8ae9b66SAlan Carew void *priv_info; /**< Pointer to private info, do not modify */ 68e8ae9b66SAlan Carew }; 69e8ae9b66SAlan Carew 70e8ae9b66SAlan Carew /* Represents a single VM instance used to return internal information about 71e8ae9b66SAlan Carew * a VM */ 72e8ae9b66SAlan Carew struct vm_info { 73e8ae9b66SAlan Carew char name[CHANNEL_MGR_MAX_NAME_LEN]; /**< VM name */ 74e8ae9b66SAlan Carew enum vm_status status; /**< libvirt status */ 75751227a0SDavid Hunt uint16_t pcpu_map[RTE_MAX_LCORE]; /**< pCPU map to vCPU */ 76e8ae9b66SAlan Carew unsigned num_vcpus; /**< number of vCPUS */ 77751227a0SDavid Hunt struct channel_info channels[RTE_MAX_LCORE]; /**< channel_info array */ 78e8ae9b66SAlan Carew unsigned num_channels; /**< Number of channels */ 791deb502eSMarcin Hajkowski int allow_query; /**< is query allowed */ 80e8ae9b66SAlan Carew }; 81e8ae9b66SAlan Carew 82e8ae9b66SAlan Carew /** 83e8ae9b66SAlan Carew * Initialize the Channel Manager resources and connect to the Hypervisor 84e8ae9b66SAlan Carew * specified in path. 85e8ae9b66SAlan Carew * This must be successfully called first before calling any other functions. 86e8ae9b66SAlan Carew * It must only be call once; 87e8ae9b66SAlan Carew * 88e8ae9b66SAlan Carew * @param path 89e8ae9b66SAlan Carew * Must be a local path, e.g. qemu:///system. 90e8ae9b66SAlan Carew * 91e8ae9b66SAlan Carew * @return 92e8ae9b66SAlan Carew * - 0 on success. 93e8ae9b66SAlan Carew * - Negative on error. 94e8ae9b66SAlan Carew */ 95e8ae9b66SAlan Carew int channel_manager_init(const char *path); 96e8ae9b66SAlan Carew 97e8ae9b66SAlan Carew /** 98e8ae9b66SAlan Carew * Free resources associated with the Channel Manager. 99e8ae9b66SAlan Carew * 100e8ae9b66SAlan Carew * @param path 101e8ae9b66SAlan Carew * Must be a local path, e.g. qemu:///system. 102e8ae9b66SAlan Carew * 103e8ae9b66SAlan Carew * @return 104e8ae9b66SAlan Carew * None 105e8ae9b66SAlan Carew */ 106e8ae9b66SAlan Carew void channel_manager_exit(void); 107e8ae9b66SAlan Carew 108e8ae9b66SAlan Carew /** 1095776b7a3SDavid Hunt * Get the Physical CPU for VM lcore channel(vcpu). 110e8ae9b66SAlan Carew * It is not thread-safe. 111e8ae9b66SAlan Carew * 112e8ae9b66SAlan Carew * @param chan_info 113e8ae9b66SAlan Carew * Pointer to struct channel_info 114e8ae9b66SAlan Carew * 115e8ae9b66SAlan Carew * @param vcpu 116e8ae9b66SAlan Carew * The virtual CPU to query. 117e8ae9b66SAlan Carew * 118e8ae9b66SAlan Carew * 119e8ae9b66SAlan Carew * @return 120e8ae9b66SAlan Carew * - 0 on error. 121e8ae9b66SAlan Carew * - >0 on success. 122e8ae9b66SAlan Carew */ 1235776b7a3SDavid Hunt uint16_t get_pcpu(struct channel_info *chan_info, unsigned int vcpu); 124e8ae9b66SAlan Carew 125e8ae9b66SAlan Carew /** 126e8ae9b66SAlan Carew * Set the Physical CPU for the specified vCPU. 127e8ae9b66SAlan Carew * It is not thread-safe. 128e8ae9b66SAlan Carew * 129e8ae9b66SAlan Carew * @param name 130e8ae9b66SAlan Carew * Virtual Machine name to lookup 131e8ae9b66SAlan Carew * 132e8ae9b66SAlan Carew * @param vcpu 133e8ae9b66SAlan Carew * The virtual CPU to set. 134e8ae9b66SAlan Carew * 135e8ae9b66SAlan Carew * @param core_num 136e8ae9b66SAlan Carew * The core number of the physical CPU(s) to bind the vCPU 137e8ae9b66SAlan Carew * 138e8ae9b66SAlan Carew * @return 139e8ae9b66SAlan Carew * - 0 on success. 140e8ae9b66SAlan Carew * - Negative on error. 141e8ae9b66SAlan Carew */ 1425776b7a3SDavid Hunt int set_pcpu(char *vm_name, unsigned int vcpu, unsigned int pcpu); 1435776b7a3SDavid Hunt 144e8ae9b66SAlan Carew /** 1451deb502eSMarcin Hajkowski * Allow or disallow queries for specified VM. 1461deb502eSMarcin Hajkowski * It is thread-safe. 1471deb502eSMarcin Hajkowski * 1481deb502eSMarcin Hajkowski * @param name 1491deb502eSMarcin Hajkowski * Virtual Machine name to lookup. 1501deb502eSMarcin Hajkowski * 1511deb502eSMarcin Hajkowski * @param allow_query 1521deb502eSMarcin Hajkowski * Query status to be set. 1531deb502eSMarcin Hajkowski * 1541deb502eSMarcin Hajkowski * @return 1551deb502eSMarcin Hajkowski * - 0 on success. 1561deb502eSMarcin Hajkowski * - Negative on error. 1571deb502eSMarcin Hajkowski */ 1581deb502eSMarcin Hajkowski int set_query_status(char *vm_name, bool allow_query); 1591deb502eSMarcin Hajkowski 1601deb502eSMarcin Hajkowski /** 161e8ae9b66SAlan Carew * Add a VM as specified by name to the Channel Manager. The name must 162e8ae9b66SAlan Carew * correspond to a valid libvirt domain name. 163e8ae9b66SAlan Carew * This is required prior to adding channels. 164e8ae9b66SAlan Carew * It is not thread-safe. 165e8ae9b66SAlan Carew * 166e8ae9b66SAlan Carew * @param name 167e8ae9b66SAlan Carew * Virtual Machine name to lookup. 168e8ae9b66SAlan Carew * 169e8ae9b66SAlan Carew * @return 170e8ae9b66SAlan Carew * - 0 on success. 171e8ae9b66SAlan Carew * - Negative on error. 172e8ae9b66SAlan Carew */ 173e8ae9b66SAlan Carew int add_vm(const char *name); 174e8ae9b66SAlan Carew 175e8ae9b66SAlan Carew /** 176e8ae9b66SAlan Carew * Remove a previously added Virtual Machine from the Channel Manager 177e8ae9b66SAlan Carew * It is not thread-safe. 178e8ae9b66SAlan Carew * 179e8ae9b66SAlan Carew * @param name 180e8ae9b66SAlan Carew * Virtual Machine name to lookup. 181e8ae9b66SAlan Carew * 182e8ae9b66SAlan Carew * @return 183e8ae9b66SAlan Carew * - 0 on success. 184e8ae9b66SAlan Carew * - Negative on error. 185e8ae9b66SAlan Carew */ 186e8ae9b66SAlan Carew int remove_vm(const char *name); 187e8ae9b66SAlan Carew 188e8ae9b66SAlan Carew /** 189e8ae9b66SAlan Carew * Add all available channels to the VM as specified by name. 190e8ae9b66SAlan Carew * Channels in the form of paths 191e8ae9b66SAlan Carew * (CHANNEL_MGR_SOCKET_PATH/<vm_name>.<channel_number>) will only be parsed. 192e8ae9b66SAlan Carew * It is not thread-safe. 193e8ae9b66SAlan Carew * 194e8ae9b66SAlan Carew * @param name 195e8ae9b66SAlan Carew * Virtual Machine name to lookup. 196e8ae9b66SAlan Carew * 197e8ae9b66SAlan Carew * @return 198e8ae9b66SAlan Carew * - N the number of channels added for the VM 199e8ae9b66SAlan Carew */ 200e8ae9b66SAlan Carew int add_all_channels(const char *vm_name); 201e8ae9b66SAlan Carew 202e8ae9b66SAlan Carew /** 203e8ae9b66SAlan Carew * Add the channel numbers in channel_list to the domain specified by name. 204e8ae9b66SAlan Carew * Channels in the form of paths 205e8ae9b66SAlan Carew * (CHANNEL_MGR_SOCKET_PATH/<vm_name>.<channel_number>) will only be parsed. 206e8ae9b66SAlan Carew * It is not thread-safe. 207e8ae9b66SAlan Carew * 208e8ae9b66SAlan Carew * @param name 209e8ae9b66SAlan Carew * Virtual Machine name to add channels. 210e8ae9b66SAlan Carew * 211e8ae9b66SAlan Carew * @param channel_list 212e8ae9b66SAlan Carew * Pointer to list of unsigned integers, representing the channel number to add 213e8ae9b66SAlan Carew * It must be allocated outside of this function. 214e8ae9b66SAlan Carew * 215e8ae9b66SAlan Carew * @param num_channels 216e8ae9b66SAlan Carew * The amount of channel numbers in channel_list 217e8ae9b66SAlan Carew * 218e8ae9b66SAlan Carew * @return 219e8ae9b66SAlan Carew * - N the number of channels added for the VM 220e8ae9b66SAlan Carew * - 0 for error 221e8ae9b66SAlan Carew */ 222e8ae9b66SAlan Carew int add_channels(const char *vm_name, unsigned *channel_list, 223e8ae9b66SAlan Carew unsigned num_channels); 224e8ae9b66SAlan Carew 225e8ae9b66SAlan Carew /** 226221e7026SMarcin Hajkowski * Set up fifos by which host applications can send command an policies 2273618326fSDavid Hunt * through a fifo to the vm_power_manager 2283618326fSDavid Hunt * 2293618326fSDavid Hunt * @return 2303618326fSDavid Hunt * - 0 for success 2313618326fSDavid Hunt */ 232221e7026SMarcin Hajkowski int add_host_channels(void); 2333618326fSDavid Hunt 2343618326fSDavid Hunt /** 235e8ae9b66SAlan Carew * Remove a channel definition from the channel manager. This must only be 236e8ae9b66SAlan Carew * called from the channel monitor thread. 237e8ae9b66SAlan Carew * 238e8ae9b66SAlan Carew * @param chan_info 239e8ae9b66SAlan Carew * Pointer to a valid struct channel_info. 240e8ae9b66SAlan Carew * 241e8ae9b66SAlan Carew * @return 242e8ae9b66SAlan Carew * - 0 on success. 243e8ae9b66SAlan Carew * - Negative on error. 244e8ae9b66SAlan Carew */ 245e8ae9b66SAlan Carew int remove_channel(struct channel_info **chan_info_dptr); 246e8ae9b66SAlan Carew 247e8ae9b66SAlan Carew /** 248e8ae9b66SAlan Carew * For all channels associated with a Virtual Machine name, update the 249e8ae9b66SAlan Carew * connection status. Valid states are CHANNEL_MGR_CHANNEL_CONNECTED or 250e8ae9b66SAlan Carew * CHANNEL_MGR_CHANNEL_DISABLED only. 251e8ae9b66SAlan Carew * 252e8ae9b66SAlan Carew * 253e8ae9b66SAlan Carew * @param name 254e8ae9b66SAlan Carew * Virtual Machine name to modify all channels. 255e8ae9b66SAlan Carew * 256e8ae9b66SAlan Carew * @param status 257e8ae9b66SAlan Carew * The status to set each channel 258e8ae9b66SAlan Carew * 259e8ae9b66SAlan Carew * @param num_channels 260e8ae9b66SAlan Carew * The amount of channel numbers in channel_list 261e8ae9b66SAlan Carew * 262e8ae9b66SAlan Carew * @return 263e8ae9b66SAlan Carew * - N the number of channels added for the VM 264e8ae9b66SAlan Carew * - 0 for error 265e8ae9b66SAlan Carew */ 266e8ae9b66SAlan Carew int set_channel_status_all(const char *name, enum channel_status status); 267e8ae9b66SAlan Carew 268e8ae9b66SAlan Carew /** 269e8ae9b66SAlan Carew * For all channels in channel_list associated with a Virtual Machine name 270e8ae9b66SAlan Carew * update the connection status of each. 271e8ae9b66SAlan Carew * Valid states are CHANNEL_MGR_CHANNEL_CONNECTED or 272e8ae9b66SAlan Carew * CHANNEL_MGR_CHANNEL_DISABLED only. 273e8ae9b66SAlan Carew * It is not thread-safe. 274e8ae9b66SAlan Carew * 275e8ae9b66SAlan Carew * @param name 276e8ae9b66SAlan Carew * Virtual Machine name to add channels. 277e8ae9b66SAlan Carew * 278e8ae9b66SAlan Carew * @param channel_list 279e8ae9b66SAlan Carew * Pointer to list of unsigned integers, representing the channel numbers to 280e8ae9b66SAlan Carew * modify. 281e8ae9b66SAlan Carew * It must be allocated outside of this function. 282e8ae9b66SAlan Carew * 283e8ae9b66SAlan Carew * @param num_channels 284e8ae9b66SAlan Carew * The amount of channel numbers in channel_list 285e8ae9b66SAlan Carew * 286e8ae9b66SAlan Carew * @return 287e8ae9b66SAlan Carew * - N the number of channels modified for the VM 288e8ae9b66SAlan Carew * - 0 for error 289e8ae9b66SAlan Carew */ 290e8ae9b66SAlan Carew int set_channel_status(const char *vm_name, unsigned *channel_list, 291e8ae9b66SAlan Carew unsigned len_channel_list, enum channel_status status); 292e8ae9b66SAlan Carew 293e8ae9b66SAlan Carew /** 294e8ae9b66SAlan Carew * Populates a pointer to struct vm_info associated with vm_name. 295e8ae9b66SAlan Carew * 296e8ae9b66SAlan Carew * @param vm_name 297e8ae9b66SAlan Carew * The name of the virtual machine to lookup. 298e8ae9b66SAlan Carew * 299e8ae9b66SAlan Carew * @param vm_info 300e8ae9b66SAlan Carew * Pointer to a struct vm_info, this must be allocated prior to calling this 301e8ae9b66SAlan Carew * function. 302e8ae9b66SAlan Carew * 303e8ae9b66SAlan Carew * @return 304e8ae9b66SAlan Carew * - 0 on success. 305e8ae9b66SAlan Carew * - Negative on error. 306e8ae9b66SAlan Carew */ 307e8ae9b66SAlan Carew int get_info_vm(const char *vm_name, struct vm_info *info); 308e8ae9b66SAlan Carew 309dff22404SDavid Hunt /** 310dff22404SDavid Hunt * Populates a table with all domains running and their physical cpu. 311dff22404SDavid Hunt * All information is gathered through libvirt api. 312dff22404SDavid Hunt * 313dff22404SDavid Hunt * @param num_vm 314dff22404SDavid Hunt * modified to store number of active VMs 315dff22404SDavid Hunt * 316dff22404SDavid Hunt * @param num_vcpu 317dff22404SDavid Hunt modified to store number of vcpus active 318dff22404SDavid Hunt * 319dff22404SDavid Hunt * @return 320dff22404SDavid Hunt * void 321dff22404SDavid Hunt */ 322dff22404SDavid Hunt void get_all_vm(int *num_vm, int *num_vcpu); 323e8ae9b66SAlan Carew #ifdef __cplusplus 324e8ae9b66SAlan Carew } 325e8ae9b66SAlan Carew #endif 326e8ae9b66SAlan Carew 327e8ae9b66SAlan Carew #endif /* CHANNEL_MANAGER_H_ */ 328