mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-24 08:25:45 +00:00
42f43592be
For controlled shutdown we issue a 'system_powerdown' command to the QEMU monitor. This triggers an ACPI event which (most) guest OS wire up to a controlled shutdown. There is no equiv ACPI event to trigger a controlled reboot. This patch attempts to fake a reboot. - In qemuDomainObjPrivatePtr we have a bool fakeReboot flag. - The virDomainReboot method sets this flag and then triggers a normal 'system_powerdown'. - The QEMU process is started with '-no-shutdown' so that the guest CPUs pause when it powers off the guest - When we receive the 'POWEROFF' event from QEMU JSON monitor if fakeReboot is not set we invoke the qemuProcessKill command and shutdown continues normally - If fakeReboot was set, we spawn a background thread which issues 'system_reset' to perform a warm reboot of the guest hardware. Then it issues 'cont' to start the CPUs again * src/qemu/qemu_command.c: Add -no-shutdown flag if we have JSON support * src/qemu/qemu_domain.h: Add 'fakeReboot' flag to qemuDomainObjPrivate struct * src/qemu/qemu_driver.c: Fake reboot using the system_powerdown command if JSON support is available * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h, src/qemu/qemu_monitor_json.c, src/qemu/qemu_monitor_json.h, src/qemu/qemu_monitor_text.c, src/qemu/qemu_monitor_text.h: Add binding for system_reset command * src/qemu/qemu_process.c: Reset the guest & start CPUs if fakeReboot is set
162 lines
6.3 KiB
C
162 lines
6.3 KiB
C
/*
|
|
* qemu_domain.h: QEMU domain private state
|
|
*
|
|
* Copyright (C) 2006-2011 Red Hat, Inc.
|
|
* Copyright (C) 2006 Daniel P. Berrange
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
*/
|
|
|
|
#ifndef __QEMU_DOMAIN_H__
|
|
# define __QEMU_DOMAIN_H__
|
|
|
|
# include "threads.h"
|
|
# include "domain_conf.h"
|
|
# include "qemu_monitor.h"
|
|
# include "qemu_conf.h"
|
|
# include "bitmap.h"
|
|
|
|
/* Only 1 job is allowed at any time
|
|
* A job includes *all* monitor commands, even those just querying
|
|
* information, not merely actions */
|
|
enum qemuDomainJob {
|
|
QEMU_JOB_NONE = 0, /* Always set to 0 for easy if (jobActive) conditions */
|
|
QEMU_JOB_UNSPECIFIED,
|
|
QEMU_JOB_MIGRATION_OUT,
|
|
QEMU_JOB_MIGRATION_IN,
|
|
QEMU_JOB_SAVE,
|
|
QEMU_JOB_DUMP,
|
|
};
|
|
|
|
enum qemuDomainJobSignals {
|
|
QEMU_JOB_SIGNAL_CANCEL = 1 << 0, /* Request job cancellation */
|
|
QEMU_JOB_SIGNAL_SUSPEND = 1 << 1, /* Request VM suspend to finish live migration offline */
|
|
QEMU_JOB_SIGNAL_MIGRATE_DOWNTIME = 1 << 2, /* Request migration downtime change */
|
|
QEMU_JOB_SIGNAL_MIGRATE_SPEED = 1 << 3, /* Request migration speed change */
|
|
QEMU_JOB_SIGNAL_BLKSTAT = 1 << 4, /* Request blkstat during migration */
|
|
QEMU_JOB_SIGNAL_BLKINFO = 1 << 5, /* Request blkinfo during migration */
|
|
};
|
|
|
|
struct qemuDomainJobSignalsData {
|
|
unsigned long long migrateDowntime; /* Data for QEMU_JOB_SIGNAL_MIGRATE_DOWNTIME */
|
|
unsigned long migrateBandwidth; /* Data for QEMU_JOB_SIGNAL_MIGRATE_SPEED */
|
|
char *statDevName; /* Device name used by blkstat calls */
|
|
virDomainBlockStatsPtr blockStat; /* Block statistics for QEMU_JOB_SIGNAL_BLKSTAT */
|
|
int *statRetCode; /* Return code for the blkstat calls */
|
|
char *infoDevName; /* Device name used by blkinfo calls */
|
|
virDomainBlockInfoPtr blockInfo; /* Block information for QEMU_JOB_SIGNAL_BLKINFO */
|
|
int *infoRetCode; /* Return code for the blkinfo calls */
|
|
};
|
|
|
|
typedef struct _qemuDomainPCIAddressSet qemuDomainPCIAddressSet;
|
|
typedef qemuDomainPCIAddressSet *qemuDomainPCIAddressSetPtr;
|
|
|
|
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
|
|
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
|
|
struct _qemuDomainObjPrivate {
|
|
virCond jobCond; /* Use in conjunction with main virDomainObjPtr lock */
|
|
virCond signalCond; /* Use to coordinate the safe queries during migration */
|
|
enum qemuDomainJob jobActive; /* Currently running job */
|
|
unsigned int jobSignals; /* Signals for running job */
|
|
struct qemuDomainJobSignalsData jobSignalsData; /* Signal specific data */
|
|
virDomainJobInfo jobInfo;
|
|
unsigned long long jobStart;
|
|
|
|
qemuMonitorPtr mon;
|
|
virDomainChrSourceDefPtr monConfig;
|
|
int monJSON;
|
|
bool monError;
|
|
unsigned long long monStart;
|
|
bool gotShutdown;
|
|
|
|
int nvcpupids;
|
|
int *vcpupids;
|
|
|
|
qemuDomainPCIAddressSetPtr pciaddrs;
|
|
int persistentAddrs;
|
|
|
|
virBitmapPtr qemuCaps;
|
|
char *lockState;
|
|
|
|
bool fakeReboot;
|
|
};
|
|
|
|
struct qemuDomainWatchdogEvent
|
|
{
|
|
virDomainObjPtr vm;
|
|
int action;
|
|
};
|
|
|
|
void qemuDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque);
|
|
|
|
/* driver must be locked before calling */
|
|
void qemuDomainEventQueue(struct qemud_driver *driver,
|
|
virDomainEventPtr event);
|
|
|
|
void qemuDomainSetPrivateDataHooks(virCapsPtr caps);
|
|
void qemuDomainSetNamespaceHooks(virCapsPtr caps);
|
|
|
|
int qemuDomainObjBeginJob(virDomainObjPtr obj) ATTRIBUTE_RETURN_CHECK;
|
|
int qemuDomainObjBeginJobWithDriver(struct qemud_driver *driver,
|
|
virDomainObjPtr obj) ATTRIBUTE_RETURN_CHECK;
|
|
int qemuDomainObjEndJob(virDomainObjPtr obj) ATTRIBUTE_RETURN_CHECK;
|
|
void qemuDomainObjEnterMonitor(virDomainObjPtr obj);
|
|
void qemuDomainObjExitMonitor(virDomainObjPtr obj);
|
|
void qemuDomainObjEnterMonitorWithDriver(struct qemud_driver *driver,
|
|
virDomainObjPtr obj);
|
|
void qemuDomainObjExitMonitorWithDriver(struct qemud_driver *driver,
|
|
virDomainObjPtr obj);
|
|
void qemuDomainObjEnterRemoteWithDriver(struct qemud_driver *driver,
|
|
virDomainObjPtr obj);
|
|
void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
|
|
virDomainObjPtr obj);
|
|
|
|
char *qemuDomainDefFormatXML(struct qemud_driver *driver,
|
|
virDomainDefPtr vm,
|
|
int flags);
|
|
|
|
char *qemuDomainFormatXML(struct qemud_driver *driver,
|
|
virDomainObjPtr vm,
|
|
int flags);
|
|
|
|
void qemuDomainObjTaint(struct qemud_driver *driver,
|
|
virDomainObjPtr obj,
|
|
enum virDomainTaintFlags taint,
|
|
int logFD);
|
|
|
|
void qemuDomainObjCheckTaint(struct qemud_driver *driver,
|
|
virDomainObjPtr obj,
|
|
int logFD);
|
|
void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
|
|
virDomainObjPtr obj,
|
|
virDomainDiskDefPtr disk,
|
|
int logFD);
|
|
void qemuDomainObjCheckNetTaint(struct qemud_driver *driver,
|
|
virDomainObjPtr obj,
|
|
virDomainNetDefPtr net,
|
|
int logFD);
|
|
|
|
|
|
int qemuDomainCreateLog(struct qemud_driver *driver, virDomainObjPtr vm, bool append);
|
|
int qemuDomainOpenLog(struct qemud_driver *driver, virDomainObjPtr vm, off_t pos);
|
|
int qemuDomainAppendLog(struct qemud_driver *driver,
|
|
virDomainObjPtr vm,
|
|
int logFD,
|
|
const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(4, 5);
|
|
|
|
#endif /* __QEMU_DOMAIN_H__ */
|