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