xref: /dpdk/examples/vm_power_manager/channel_manager.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
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