1 /*
2  * qemu_process.h: QEMU process management
3  *
4  * Copyright (C) 2006-2012, 2015 Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library.  If not, see
18  * <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #pragma once
23 
24 #include "qemu_conf.h"
25 #include "qemu_domain.h"
26 #include "virstoragefile.h"
27 #include "vireventthread.h"
28 
29 int qemuProcessPrepareMonitorChr(virDomainChrSourceDef *monConfig,
30                                  const char *domainDir);
31 
32 int qemuProcessStartCPUs(virQEMUDriver *driver,
33                          virDomainObj *vm,
34                          virDomainRunningReason reason,
35                          qemuDomainAsyncJob asyncJob);
36 int qemuProcessStopCPUs(virQEMUDriver *driver,
37                         virDomainObj *vm,
38                         virDomainPausedReason reason,
39                         qemuDomainAsyncJob asyncJob);
40 
41 int qemuProcessBuildDestroyMemoryPaths(virQEMUDriver *driver,
42                                        virDomainObj *vm,
43                                        virDomainMemoryDef *mem,
44                                        bool build);
45 
46 int qemuProcessDestroyMemoryBackingPath(virQEMUDriver *driver,
47                                         virDomainObj *vm,
48                                         virDomainMemoryDef *mem);
49 
50 void qemuProcessReconnectAll(virQEMUDriver *driver);
51 
52 typedef struct _qemuProcessIncomingDef qemuProcessIncomingDef;
53 struct _qemuProcessIncomingDef {
54     char *address; /* address where QEMU is supposed to listen */
55     char *launchURI; /* used as a parameter for -incoming command line option */
56     char *deferredURI; /* used when calling migrate-incoming QMP command */
57     int fd; /* for fd:N URI */
58     const char *path; /* path associated with fd */
59 };
60 
61 qemuProcessIncomingDef *qemuProcessIncomingDefNew(virQEMUCaps *qemuCaps,
62                                                     const char *listenAddress,
63                                                     const char *migrateFrom,
64                                                     int fd,
65                                                     const char *path);
66 void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc);
67 
68 int qemuProcessBeginJob(virQEMUDriver *driver,
69                         virDomainObj *vm,
70                         virDomainJobOperation operation,
71                         unsigned long apiFlags);
72 void qemuProcessEndJob(virQEMUDriver *driver,
73                        virDomainObj *vm);
74 
75 typedef enum {
76     VIR_QEMU_PROCESS_START_COLD         = 1 << 0,
77     VIR_QEMU_PROCESS_START_PAUSED       = 1 << 1,
78     VIR_QEMU_PROCESS_START_AUTODESTROY  = 1 << 2,
79     VIR_QEMU_PROCESS_START_PRETEND      = 1 << 3,
80     VIR_QEMU_PROCESS_START_NEW          = 1 << 4, /* internal, new VM is starting */
81     VIR_QEMU_PROCESS_START_GEN_VMID     = 1 << 5, /* Generate a new VMID */
82     VIR_QEMU_PROCESS_START_STANDALONE   = 1 << 6, /* Require CLI args to be usable standalone,
83                                                      ie no FD passing and the like */
84 } qemuProcessStartFlags;
85 
86 int qemuProcessStart(virConnectPtr conn,
87                      virQEMUDriver *driver,
88                      virDomainObj *vm,
89                      virCPUDef *updatedCPU,
90                      qemuDomainAsyncJob asyncJob,
91                      const char *migrateFrom,
92                      int stdin_fd,
93                      const char *stdin_path,
94                      virDomainMomentObj *snapshot,
95                      virNetDevVPortProfileOp vmop,
96                      unsigned int flags);
97 
98 int qemuProcessCreatePretendCmdPrepare(virQEMUDriver *driver,
99                                        virDomainObj *vm,
100                                        const char *migrateURI,
101                                        bool standalone,
102                                        unsigned int flags);
103 
104 virCommand *qemuProcessCreatePretendCmdBuild(virQEMUDriver *driver,
105                                                virDomainObj *vm,
106                                                const char *migrateURI,
107                                                bool enableFips,
108                                                bool standalone);
109 
110 int qemuProcessInit(virQEMUDriver *driver,
111                     virDomainObj *vm,
112                     virCPUDef *updatedCPU,
113                     qemuDomainAsyncJob asyncJob,
114                     bool migration,
115                     unsigned int flags);
116 
117 int qemuProcessPrepareDomain(virQEMUDriver *driver,
118                              virDomainObj *vm,
119                              unsigned int flags);
120 
121 int qemuProcessOpenVhostVsock(virDomainVsockDef *vsock);
122 
123 int qemuProcessPrepareHostHostdev(virDomainHostdevDef *hostdev);
124 
125 int qemuProcessPrepareHost(virQEMUDriver *driver,
126                            virDomainObj *vm,
127                            unsigned int flags);
128 
129 int qemuProcessLaunch(virConnectPtr conn,
130                       virQEMUDriver *driver,
131                       virDomainObj *vm,
132                       qemuDomainAsyncJob asyncJob,
133                       qemuProcessIncomingDef *incoming,
134                       virDomainMomentObj *snapshot,
135                       virNetDevVPortProfileOp vmop,
136                       unsigned int flags);
137 
138 int qemuProcessFinishStartup(virQEMUDriver *driver,
139                              virDomainObj *vm,
140                              qemuDomainAsyncJob asyncJob,
141                              bool startCPUs,
142                              virDomainPausedReason pausedReason);
143 
144 int qemuProcessRefreshState(virQEMUDriver *driver,
145                             virDomainObj *vm,
146                             qemuDomainAsyncJob asyncJob);
147 
148 typedef enum {
149     VIR_QEMU_PROCESS_STOP_MIGRATED      = 1 << 0,
150     VIR_QEMU_PROCESS_STOP_NO_RELABEL    = 1 << 1,
151 } qemuProcessStopFlags;
152 
153 int qemuProcessBeginStopJob(virQEMUDriver *driver,
154                             virDomainObj *vm,
155                             qemuDomainJob job,
156                             bool forceKill);
157 void qemuProcessStop(virQEMUDriver *driver,
158                      virDomainObj *vm,
159                      virDomainShutoffReason reason,
160                      qemuDomainAsyncJob asyncJob,
161                      unsigned int flags);
162 
163 typedef enum {
164    VIR_QEMU_PROCESS_KILL_FORCE  = 1 << 0,
165    VIR_QEMU_PROCESS_KILL_NOWAIT = 1 << 1,
166    VIR_QEMU_PROCESS_KILL_NOCHECK = 1 << 2, /* bypass the running vm check */
167 } virQemuProcessKillMode;
168 
169 int qemuProcessKill(virDomainObj *vm, unsigned int flags);
170 
171 void qemuProcessShutdownOrReboot(virQEMUDriver *driver,
172                                  virDomainObj *vm);
173 
174 int qemuProcessAutoDestroyInit(virQEMUDriver *driver);
175 void qemuProcessAutoDestroyShutdown(virQEMUDriver *driver);
176 int qemuProcessAutoDestroyAdd(virQEMUDriver *driver,
177                               virDomainObj *vm,
178                               virConnectPtr conn);
179 int qemuProcessAutoDestroyRemove(virQEMUDriver *driver,
180                                  virDomainObj *vm);
181 bool qemuProcessAutoDestroyActive(virQEMUDriver *driver,
182                                   virDomainObj *vm);
183 
184 int qemuProcessSetSchedParams(int id, pid_t pid, size_t nsp,
185                               virDomainThreadSchedParam *sp);
186 
187 virDomainDiskDef *qemuProcessFindDomainDiskByAliasOrQOM(virDomainObj *vm,
188                                                           const char *alias,
189                                                           const char *qomid);
190 
191 int qemuConnectAgent(virQEMUDriver *driver, virDomainObj *vm);
192 
193 
194 int qemuProcessSetupVcpu(virDomainObj *vm,
195                          unsigned int vcpuid);
196 int qemuProcessSetupIOThread(virDomainObj *vm,
197                              virDomainIOThreadIDDef *iothread);
198 
199 int qemuRefreshVirtioChannelState(virQEMUDriver *driver,
200                                   virDomainObj *vm,
201                                   qemuDomainAsyncJob asyncJob);
202 
203 int qemuProcessRefreshBalloonState(virQEMUDriver *driver,
204                                    virDomainObj *vm,
205                                    int asyncJob);
206 
207 int qemuProcessRefreshDisks(virQEMUDriver *driver,
208                             virDomainObj *vm,
209                             qemuDomainAsyncJob asyncJob);
210 
211 int qemuProcessStartManagedPRDaemon(virDomainObj *vm) G_GNUC_NO_INLINE;
212 
213 void qemuProcessKillManagedPRDaemon(virDomainObj *vm) G_GNUC_NO_INLINE;
214 
215 typedef struct _qemuProcessQMP qemuProcessQMP;
216 struct _qemuProcessQMP {
217     char *binary;
218     char *libDir;
219     uid_t runUid;
220     gid_t runGid;
221     char *stdErr;
222     char *monarg;
223     char *monpath;
224     char *pidfile;
225     char *uniqDir;
226     virEventThread *eventThread;
227     virCommand *cmd;
228     qemuMonitor *mon;
229     pid_t pid;
230     virDomainObj *vm;
231     bool forceTCG;
232 };
233 
234 qemuProcessQMP *qemuProcessQMPNew(const char *binary,
235                                     const char *libDir,
236                                     uid_t runUid,
237                                     gid_t runGid,
238                                     bool forceTCG);
239 
240 void qemuProcessQMPFree(qemuProcessQMP *proc);
241 G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuProcessQMP, qemuProcessQMPFree);
242 
243 int qemuProcessQMPStart(qemuProcessQMP *proc);
244 
245 bool qemuProcessRebootAllowed(const virDomainDef *def);
246