2009-11-03 18:59:18 +00:00
|
|
|
/*
|
|
|
|
* qemu_monitor_json.h: interaction with QEMU monitor console
|
|
|
|
*
|
qemu: read backing chain names from qemu
https://bugzilla.redhat.com/show_bug.cgi?id=1199182 documents that
after a series of disk snapshots into existing destination images,
followed by active commits of the top image, it is possible for
qemu 2.2 and earlier to end up tracking a different name for the
image than what it would have had when opening the chain afresh.
That is, when starting with the chain 'a <- b <- c', the name
associated with 'b' is how it was spelled in the metadata of 'c',
but when starting with 'a', taking two snapshots into 'a <- b <- c',
then committing 'c' back into 'b', the name associated with 'b' is
now the name used when taking the first snapshot.
Sadly, older qemu doesn't know how to treat different spellings of
the same filename as identical files (it uses strcmp() instead of
checking for the same inode), which means libvirt's attempt to
commit an image using solely the names learned from qcow2 metadata
fails with a cryptic:
error: internal error: unable to execute QEMU command 'block-commit': Top image file /tmp/images/c/../b/b not found
even though the file exists. Trying to teach libvirt the rules on
which name qemu will expect is not worth the effort (besides, we'd
have to remember it across libvirtd restarts, and track whether a
file was opened via metadata or via snapshot creation for a given
qemu process); it is easier to just always directly ask qemu what
string it expects to see in the first place.
As a safety valve, we validate that any name returned by qemu
still maps to the same local file as we have tracked it, so that
a compromised qemu cannot accidentally cause us to act on an
incorrect file.
* src/qemu/qemu_monitor.h (qemuMonitorDiskNameLookup): New
prototype.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONDiskNameLookup):
Likewise.
* src/qemu/qemu_monitor.c (qemuMonitorDiskNameLookup): New function.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONDiskNameLookup)
(qemuMonitorJSONDiskNameLookupOne): Likewise.
* src/qemu/qemu_driver.c (qemuDomainBlockCommit)
(qemuDomainBlockJobImpl): Use it.
Signed-off-by: Eric Blake <eblake@redhat.com>
2015-03-11 20:37:04 +00:00
|
|
|
* Copyright (C) 2006-2009, 2011-2015 Red Hat, Inc.
|
2009-11-03 18:59:18 +00:00
|
|
|
* 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
|
2012-09-20 22:30:55 +00:00
|
|
|
* License along with this library. If not, see
|
2012-07-21 10:06:23 +00:00
|
|
|
* <http://www.gnu.org/licenses/>.
|
2009-11-03 18:59:18 +00:00
|
|
|
*/
|
|
|
|
|
2019-06-18 16:12:37 +00:00
|
|
|
#pragma once
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2019-06-18 16:12:37 +00:00
|
|
|
#include "internal.h"
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2019-06-18 16:12:37 +00:00
|
|
|
#include "qemu_monitor.h"
|
|
|
|
#include "cpu/cpu.h"
|
|
|
|
#include "util/virgic.h"
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONIOProcessLine(qemuMonitor *mon,
|
|
|
|
const char *line,
|
|
|
|
qemuMonitorMessage *msg)
|
|
|
|
G_GNUC_NO_INLINE;
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONIOProcess(qemuMonitor *mon,
|
|
|
|
const char *data,
|
|
|
|
size_t len,
|
|
|
|
qemuMonitorMessage *msg);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONHumanCommand(qemuMonitor *mon,
|
|
|
|
const char *cmd,
|
2022-01-28 13:39:24 +00:00
|
|
|
int fd,
|
2021-12-09 16:34:46 +00:00
|
|
|
char **reply);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetCapabilities(qemuMonitor *mon);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONStartCPUs(qemuMonitor *mon);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONStopCPUs(qemuMonitor *mon);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetStatus(qemuMonitor *mon,
|
|
|
|
bool *running,
|
|
|
|
virDomainPausedReason *reason);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSystemPowerdown(qemuMonitor *mon);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSystemReset(qemuMonitor *mon);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONQueryCPUs(qemuMonitor *mon,
|
|
|
|
struct qemuMonitorQueryCpusEntry **entries,
|
|
|
|
size_t *nentries,
|
|
|
|
bool force,
|
|
|
|
bool fast);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONUpdateVideoMemorySize(qemuMonitor *mon,
|
|
|
|
virDomainVideoDef *video,
|
|
|
|
char *path);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONUpdateVideoVram64Size(qemuMonitor *mon,
|
|
|
|
virDomainVideoDef *video,
|
|
|
|
char *path);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetBalloonInfo(qemuMonitor *mon,
|
|
|
|
unsigned long long *currmem);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMemoryStats(qemuMonitor *mon,
|
|
|
|
char *balloonpath,
|
|
|
|
virDomainMemoryStatPtr stats,
|
|
|
|
unsigned int nr_stats);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitor *mon,
|
|
|
|
char *balloonpath,
|
|
|
|
int period);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetBlockInfo(qemuMonitor *mon,
|
|
|
|
GHashTable *table);
|
|
|
|
|
|
|
|
virJSONValue *
|
|
|
|
qemuMonitorJSONQueryBlockstats(qemuMonitor *mon,
|
|
|
|
bool queryNodes);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitor *mon,
|
|
|
|
GHashTable *hash);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitor *mon,
|
|
|
|
GHashTable *stats);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitor *mon,
|
|
|
|
GHashTable *stats);
|
2018-06-28 10:35:16 +00:00
|
|
|
|
2020-10-22 17:04:18 +00:00
|
|
|
GHashTable *
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONBlockGetNamedNodeDataJSON(virJSONValue *nodes);
|
2019-12-09 06:46:53 +00:00
|
|
|
|
2020-10-22 17:04:18 +00:00
|
|
|
GHashTable *
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONBlockGetNamedNodeData(qemuMonitor *mon,
|
2020-01-21 15:51:40 +00:00
|
|
|
bool supports_flat);
|
2019-10-09 12:13:10 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockResize(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
const char *nodename,
|
|
|
|
unsigned long long size);
|
2016-04-14 10:33:49 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetPassword(qemuMonitor *mon,
|
|
|
|
const char *protocol,
|
|
|
|
const char *password,
|
|
|
|
const char *action_if_connected);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONExpirePassword(qemuMonitor *mon,
|
|
|
|
const char *protocol,
|
|
|
|
const char *expire_time);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetBalloon(qemuMonitor *mon,
|
|
|
|
unsigned long long newmem);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONEjectMedia(qemuMonitor *mon,
|
|
|
|
const char *dev_name,
|
|
|
|
bool force);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONChangeMedia(qemuMonitor *mon,
|
|
|
|
const char *dev_name,
|
|
|
|
const char *newmedia,
|
|
|
|
const char *format);
|
2013-01-14 11:45:20 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSaveVirtualMemory(qemuMonitor *mon,
|
|
|
|
unsigned long long offset,
|
|
|
|
unsigned long long length,
|
|
|
|
const char *path);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSavePhysicalMemory(qemuMonitor *mon,
|
|
|
|
unsigned long long offset,
|
|
|
|
unsigned long long length,
|
|
|
|
const char *path);
|
2016-03-08 17:24:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMigrationParams(qemuMonitor *mon,
|
|
|
|
virJSONValue **params);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetMigrationParams(qemuMonitor *mon,
|
|
|
|
virJSONValue **params);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMigrationStats(qemuMonitor *mon,
|
|
|
|
qemuMonitorMigrationStats *stats,
|
|
|
|
char **error);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMigrationCapabilities(qemuMonitor *mon,
|
|
|
|
char ***capabilities);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetMigrationCapabilities(qemuMonitor *mon,
|
|
|
|
virJSONValue **caps);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetGICCapabilities(qemuMonitor *mon,
|
|
|
|
virGICCapability **capabilities);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetSEVCapabilities(qemuMonitor *mon,
|
|
|
|
virSEVCapability **capabilities);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrate(qemuMonitor *mon,
|
|
|
|
unsigned int flags,
|
|
|
|
const char *uri);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetSpiceMigrationStatus(qemuMonitor *mon,
|
|
|
|
bool *spice_migrated);
|
2017-11-20 20:02:59 +00:00
|
|
|
|
2014-03-23 03:51:13 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrateCancel(qemuMonitor *mon);
|
|
|
|
|
2022-05-10 13:20:25 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONMigratePause(qemuMonitor *mon);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONQueryDump(qemuMonitor *mon,
|
|
|
|
qemuMonitorDumpStats *stats);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetDumpGuestMemoryCapability(qemuMonitor *mon,
|
|
|
|
const char *capability);
|
2012-06-12 03:04:51 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONDump(qemuMonitor *mon,
|
|
|
|
const char *protocol,
|
|
|
|
const char *dumpformat,
|
|
|
|
bool detach);
|
2011-02-17 13:39:36 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGraphicsRelocate(qemuMonitor *mon,
|
|
|
|
int type,
|
|
|
|
const char *hostname,
|
|
|
|
int port,
|
|
|
|
int tlsPort,
|
|
|
|
const char *tlsSubject);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddPCIHostDevice(qemuMonitor *mon,
|
|
|
|
virPCIDeviceAddress *hostAddr,
|
|
|
|
virPCIDeviceAddress *guestAddr);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONAddPCIDisk(qemuMonitor *mon,
|
|
|
|
const char *path,
|
|
|
|
const char *bus,
|
|
|
|
virPCIDeviceAddress *guestAddr);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddPCINetwork(qemuMonitor *mon,
|
|
|
|
const char *nicstr,
|
|
|
|
virPCIDeviceAddress *guestAddr);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONRemovePCIDevice(qemuMonitor *mon,
|
|
|
|
virPCIDeviceAddress *guestAddr);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddFileHandleToSet(qemuMonitor *mon,
|
|
|
|
int fd,
|
|
|
|
int fdset,
|
2022-05-05 15:06:10 +00:00
|
|
|
const char *opaque);
|
2020-10-14 17:08:28 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONRemoveFdset(qemuMonitor *mon,
|
2022-01-24 14:58:37 +00:00
|
|
|
unsigned int fdset);
|
2020-10-14 17:08:28 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONQueryFdsets(qemuMonitor *mon,
|
|
|
|
qemuMonitorFdsets **fdsets);
|
2020-10-14 17:08:28 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSendFileHandle(qemuMonitor *mon,
|
|
|
|
const char *fdname,
|
|
|
|
int fd);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONCloseFileHandle(qemuMonitor *mon,
|
|
|
|
const char *fdname);
|
2009-11-03 18:59:18 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddNetdev(qemuMonitor *mon,
|
|
|
|
virJSONValue **props);
|
2010-04-15 13:52:03 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONRemoveNetdev(qemuMonitor *mon,
|
|
|
|
const char *alias);
|
2010-04-15 13:52:03 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONQueryRxFilter(qemuMonitor *mon,
|
|
|
|
const char *alias,
|
|
|
|
virNetDevRxFilter **filter);
|
qemu: qemuMonitorQueryRxFilter - retrieve guest netdev rx-filter
This function can be called at any time to get the current status of a
guest's network device rx-filter. In particular it is useful to call
after libvirt recieves a NIC_RX_FILTER_CHANGED event - this event only
tells you that something has changed in the rx-filter, the details are
retrieved with the query-rx-filter monitor command (only available in
the json monitor). The command sent to the qemu monitor looks like this:
{"execute":"query-rx-filter", "arguments": {"name":"net2"} }'
and the results will look something like this:
{
"return": [
{
"promiscuous": false,
"name": "net2",
"main-mac": "52:54:00:98:2d:e3",
"unicast": "normal",
"vlan": "normal",
"vlan-table": [
42,
0
],
"unicast-table": [
],
"multicast": "normal",
"multicast-overflow": false,
"unicast-overflow": false,
"multicast-table": [
"33:33:ff:98:2d:e3",
"01:80:c2:00:00:21",
"01:00:5e:00:00:fb",
"33:33:ff:98:2d:e2",
"01:00:5e:00:00:01",
"33:33:00:00:00:01"
],
"broadcast-allowed": false
}
],
"id": "libvirt-14"
}
This is all parsed from JSON into a virNetDevRxFilter object for
easier consumption. (unicast-table is usually empty, but is also an
array of mac addresses similar to multicast-table).
(NB: LIBNL_CFLAGS was added to tests/Makefile.am because virnetdev.h
now includes util/virnetlink.h, which includes netlink/msg.h when
appropriate. Without LIBNL_CFLAGS, gcc can't find that file (if
libnl/netlink isn't available, LIBNL_CFLAGS will be empty and
virnetlink.h won't try to include netlink/msg.h anyway).)
2014-09-22 16:19:41 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetChardevInfo(qemuMonitor *mon,
|
|
|
|
GHashTable *info);
|
2010-01-22 13:22:53 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAttachPCIDiskController(qemuMonitor *mon,
|
|
|
|
const char *bus,
|
|
|
|
virPCIDeviceAddress *guestAddr);
|
2009-12-07 19:28:05 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddDeviceProps(qemuMonitor *mon,
|
|
|
|
virJSONValue **props);
|
2010-01-26 15:34:46 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONDelDevice(qemuMonitor *mon,
|
|
|
|
const char *devalias);
|
2010-03-02 08:40:51 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAddObject(qemuMonitor *mon,
|
|
|
|
virJSONValue **props);
|
2014-09-23 11:25:25 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONDelObject(qemuMonitor *mon,
|
|
|
|
const char *objalias,
|
|
|
|
bool report_error);
|
2014-09-23 11:25:25 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONTransaction(qemuMonitor *mon,
|
|
|
|
virJSONValue **actions)
|
blockjob: add qemu capabilities related to block jobs
Upstream qemu 1.3 is adding two new monitor commands, 'drive-mirror'
and 'block-job-complete'[1], which can drive live block copy and
storage migration. [Additionally, RHEL 6.3 had backported an earlier
version of most of the same functionality, but under the names
'__com.redhat_drive-mirror' and '__com.redhat_drive-reopen' and with
slightly different JSON arguments, and has been using patches similar
to these upstream patches for several months now.]
The libvirt API virDomainBlockRebase as already committed for 0.9.12
is flexible enough to expose the basics of block copy, but some
additional features in the 'drive-mirror' qemu command, such as
setting error policy, setting granularity, or using a persistent
bitmap, may later require a new libvirt API virDomainBlockCopy. I
will wait to add that API until we know more about what qemu 1.3
will finally provide.
This patch caters only to the upstream qemu 1.3 interface, although
I have proven that the changes for RHEL 6.3 can be isolated to
just qemu_monitor_json.c, and the rest of this series will
gracefully handle either interface once the JSON differences are
papered over in a downstream patch.
For consistency with other block job commands, libvirt must handle
the bandwidth argument as MiB/sec from the user, even though qemu
exposes the speed argument as bytes/sec; then again, qemu rounds
up to cluster size internally, so using MiB hides the worst effects
of that rounding if you pass small numbers.
[1]https://lists.gnu.org/archive/html/qemu-devel/2012-10/msg04123.html
* src/qemu/qemu_capabilities.h (QEMU_CAPS_DRIVE_MIRROR)
(QEMU_CAPS_DRIVE_REOPEN): New bits.
* src/qemu/qemu_capabilities.c (qemuCaps): Name them.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONCheckCommands): Set
them.
(qemuMonitorJSONDriveMirror, qemuMonitorDrivePivot): New functions.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONDriveMirror)
(qemuMonitorDrivePivot): Declare them.
* src/qemu/qemu_monitor.c (qemuMonitorDriveMirror)
(qemuMonitorDrivePivot): New passthroughs.
* src/qemu/qemu_monitor.h (qemuMonitorDriveMirror)
(qemuMonitorDrivePivot): Declare them.
2012-09-28 23:29:53 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONDriveMirror(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
const char *file,
|
|
|
|
const char *format,
|
|
|
|
unsigned long long speed,
|
|
|
|
unsigned int granularity,
|
|
|
|
unsigned long long buf_size,
|
|
|
|
bool shallow,
|
|
|
|
bool reuse)
|
blockjob: add qemu capabilities related to block jobs
Upstream qemu 1.3 is adding two new monitor commands, 'drive-mirror'
and 'block-job-complete'[1], which can drive live block copy and
storage migration. [Additionally, RHEL 6.3 had backported an earlier
version of most of the same functionality, but under the names
'__com.redhat_drive-mirror' and '__com.redhat_drive-reopen' and with
slightly different JSON arguments, and has been using patches similar
to these upstream patches for several months now.]
The libvirt API virDomainBlockRebase as already committed for 0.9.12
is flexible enough to expose the basics of block copy, but some
additional features in the 'drive-mirror' qemu command, such as
setting error policy, setting granularity, or using a persistent
bitmap, may later require a new libvirt API virDomainBlockCopy. I
will wait to add that API until we know more about what qemu 1.3
will finally provide.
This patch caters only to the upstream qemu 1.3 interface, although
I have proven that the changes for RHEL 6.3 can be isolated to
just qemu_monitor_json.c, and the rest of this series will
gracefully handle either interface once the JSON differences are
papered over in a downstream patch.
For consistency with other block job commands, libvirt must handle
the bandwidth argument as MiB/sec from the user, even though qemu
exposes the speed argument as bytes/sec; then again, qemu rounds
up to cluster size internally, so using MiB hides the worst effects
of that rounding if you pass small numbers.
[1]https://lists.gnu.org/archive/html/qemu-devel/2012-10/msg04123.html
* src/qemu/qemu_capabilities.h (QEMU_CAPS_DRIVE_MIRROR)
(QEMU_CAPS_DRIVE_REOPEN): New bits.
* src/qemu/qemu_capabilities.c (qemuCaps): Name them.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONCheckCommands): Set
them.
(qemuMonitorJSONDriveMirror, qemuMonitorDrivePivot): New functions.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONDriveMirror)
(qemuMonitorDrivePivot): Declare them.
* src/qemu/qemu_monitor.c (qemuMonitorDriveMirror)
(qemuMonitorDrivePivot): New passthroughs.
* src/qemu/qemu_monitor.h (qemuMonitorDriveMirror)
(qemuMonitorDrivePivot): Declare them.
2012-09-28 23:29:53 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
2021-12-09 16:34:46 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevMirror(qemuMonitor *mon,
|
|
|
|
const char *jobname,
|
|
|
|
bool persistjob,
|
|
|
|
const char *device,
|
|
|
|
const char *target,
|
|
|
|
unsigned long long speed,
|
|
|
|
unsigned int granularity,
|
|
|
|
unsigned long long buf_size,
|
|
|
|
bool shallow,
|
|
|
|
bool syncWrite)
|
2018-08-16 16:47:20 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5);
|
2021-12-09 16:34:46 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONDrivePivot(qemuMonitor *mon,
|
|
|
|
const char *jobname)
|
2013-10-17 13:21:46 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2011-08-15 23:25:54 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockCommit(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
const char *jobname,
|
|
|
|
bool persistjob,
|
|
|
|
const char *top,
|
|
|
|
const char *topNode,
|
|
|
|
const char *base,
|
|
|
|
const char *baseNode,
|
|
|
|
const char *backingName,
|
|
|
|
unsigned long long bandwidth)
|
blockjob: allow omitted arguments to QMP block-commit
We are about to turn on support for active block commit. Although
qemu 2.0 was the first version to mostly support it, that version
mis-handles 0-length files, and doesn't have anything available for
easy probing. But qemu 2.1 fixed bugs, and made life simpler by
letting the 'top' argument be optional. Unless someone begs for
active commit with qemu 2.0, for now we are just going to enable
it only by probing for qemu 2.1 behavior (anyone backporting active
commit can also backport the optional argument behavior). This
requires qemu.git commit 7676e2c597000eff3a7233b40cca768b358f9bc9.
Although all our actual uses of block-commit supply arguments for
both base and top, we can omit both arguments and use a bogus
device string to trigger an interesting behavior in qemu. All QMP
commands first do argument validation, failing with GenericError
if a mandatory argument is missing. Once that passes, the code
in the specific command gets to do further checking, and the qemu
developers made sure that if device is the only supplied argument,
then the block-commit code will look up the device first, with a
failure of DeviceNotFound, before attempting any further argument
validation (most other validations fail with GenericError). Thus,
the category of error class can reliably be used to decipher
whether the top argument was optional, which in turn implies a
working active commit. Since we expect our bogus device string to
trigger an error either way, the code is written to return a
distinct return value without spamming the logs.
* src/qemu/qemu_monitor.h (qemuMonitorSupportsActiveCommit): New
prototype.
* src/qemu/qemu_monitor.c (qemuMonitorSupportsActiveCommit):
Implement it.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONBlockCommit):
Allow NULL for top and base, for probing purposes.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONBlockCommit):
Likewise, implementing the probe.
* tests/qemumonitorjsontest.c (mymain): Enable...
(testQemuMonitorJSONqemuMonitorSupportsActiveCommit): ...a new test.
Signed-off-by: Eric Blake <eblake@redhat.com>
2014-06-17 03:42:49 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2012-10-03 21:13:21 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
char *
|
|
|
|
qemuMonitorJSONDiskNameLookup(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
virStorageSource *top,
|
|
|
|
virStorageSource *target)
|
qemu: read backing chain names from qemu
https://bugzilla.redhat.com/show_bug.cgi?id=1199182 documents that
after a series of disk snapshots into existing destination images,
followed by active commits of the top image, it is possible for
qemu 2.2 and earlier to end up tracking a different name for the
image than what it would have had when opening the chain afresh.
That is, when starting with the chain 'a <- b <- c', the name
associated with 'b' is how it was spelled in the metadata of 'c',
but when starting with 'a', taking two snapshots into 'a <- b <- c',
then committing 'c' back into 'b', the name associated with 'b' is
now the name used when taking the first snapshot.
Sadly, older qemu doesn't know how to treat different spellings of
the same filename as identical files (it uses strcmp() instead of
checking for the same inode), which means libvirt's attempt to
commit an image using solely the names learned from qcow2 metadata
fails with a cryptic:
error: internal error: unable to execute QEMU command 'block-commit': Top image file /tmp/images/c/../b/b not found
even though the file exists. Trying to teach libvirt the rules on
which name qemu will expect is not worth the effort (besides, we'd
have to remember it across libvirtd restarts, and track whether a
file was opened via metadata or via snapshot creation for a given
qemu process); it is easier to just always directly ask qemu what
string it expects to see in the first place.
As a safety valve, we validate that any name returned by qemu
still maps to the same local file as we have tracked it, so that
a compromised qemu cannot accidentally cause us to act on an
incorrect file.
* src/qemu/qemu_monitor.h (qemuMonitorDiskNameLookup): New
prototype.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONDiskNameLookup):
Likewise.
* src/qemu/qemu_monitor.c (qemuMonitorDiskNameLookup): New function.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONDiskNameLookup)
(qemuMonitorJSONDiskNameLookupOne): Likewise.
* src/qemu/qemu_driver.c (qemuDomainBlockCommit)
(qemuDomainBlockJobImpl): Use it.
Signed-off-by: Eric Blake <eblake@redhat.com>
2015-03-11 20:37:04 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
|
|
ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONArbitraryCommand(qemuMonitor *mon,
|
|
|
|
const char *cmd_str,
|
2022-01-28 13:39:24 +00:00
|
|
|
int fd,
|
2021-12-09 16:34:46 +00:00
|
|
|
char **reply_str);
|
2010-04-17 02:12:45 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONInjectNMI(qemuMonitor *mon);
|
2011-04-01 06:23:58 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSendKey(qemuMonitor *mon,
|
|
|
|
unsigned int holdtime,
|
|
|
|
unsigned int *keycodes,
|
|
|
|
unsigned int nkeycodes);
|
2011-07-21 07:55:56 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONScreendump(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
unsigned int head,
|
|
|
|
const char *file);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockStream(qemuMonitor *mon,
|
|
|
|
const char *device,
|
|
|
|
const char *jobname,
|
|
|
|
bool persistjob,
|
|
|
|
const char *base,
|
|
|
|
const char *baseNode,
|
|
|
|
const char *backingName,
|
|
|
|
unsigned long long speed)
|
2012-04-11 21:40:16 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2011-04-01 06:23:58 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockJobCancel(qemuMonitor *mon,
|
|
|
|
const char *jobname,
|
|
|
|
bool force)
|
2015-04-01 08:40:06 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2018-12-04 16:58:38 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONGetJobInfo(qemuMonitor *mon,
|
|
|
|
qemuMonitorJobInfo ***jobs,
|
2018-12-04 16:58:38 +00:00
|
|
|
size_t *njobs);
|
|
|
|
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockJobSetSpeed(qemuMonitor *mon,
|
|
|
|
const char *jobname,
|
|
|
|
unsigned long long speed)
|
2015-04-01 07:47:04 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
GHashTable *
|
|
|
|
qemuMonitorJSONGetAllBlockJobInfo(qemuMonitor *mon,
|
|
|
|
bool rawjobname)
|
2015-05-22 11:33:49 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
2014-08-27 19:29:14 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONJobDismiss(qemuMonitor *mon,
|
|
|
|
const char *jobname)
|
2018-08-16 09:48:41 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONJobComplete(qemuMonitor *mon,
|
|
|
|
const char *jobname)
|
2018-08-16 09:48:41 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetLink(qemuMonitor *mon,
|
|
|
|
const char *name,
|
|
|
|
virDomainNetInterfaceLinkState state);
|
2011-09-06 08:18:57 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONOpenGraphics(qemuMonitor *mon,
|
|
|
|
const char *protocol,
|
|
|
|
const char *fdname,
|
|
|
|
bool skipauth);
|
2011-10-21 08:00:13 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetBlockIoThrottle(qemuMonitor *mon,
|
|
|
|
const char *drivealias,
|
|
|
|
const char *qomid,
|
|
|
|
virDomainBlockIoTuneInfo *info);
|
2011-11-15 09:02:45 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetBlockIoThrottle(qemuMonitor *mon,
|
|
|
|
const char *drivealias,
|
|
|
|
const char *qdevid,
|
|
|
|
virDomainBlockIoTuneInfo *reply);
|
2011-11-15 09:02:45 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSystemWakeup(qemuMonitor *mon);
|
2012-02-10 12:33:52 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
char *
|
|
|
|
qemuMonitorJSONGetSEVMeasurement(qemuMonitor *mon);
|
2018-06-08 14:41:01 +00:00
|
|
|
|
2021-12-08 12:05:44 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetSEVInfo(qemuMonitor *mon,
|
|
|
|
unsigned int *apiMajor,
|
|
|
|
unsigned int *apiMinor,
|
|
|
|
unsigned int *buildID,
|
|
|
|
unsigned int *policy)
|
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
|
|
ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetVersion(qemuMonitor *mon,
|
|
|
|
int *major,
|
|
|
|
int *minor,
|
|
|
|
int *micro,
|
|
|
|
char **package)
|
2012-08-15 14:04:09 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2021-11-17 01:21:19 +00:00
|
|
|
int qemuMonitorJSONSetLaunchSecurityState(qemuMonitor *mon,
|
|
|
|
const char *secrethdr,
|
|
|
|
const char *secret,
|
|
|
|
unsigned long long setaddr,
|
|
|
|
bool hasSetaddr);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMachines(qemuMonitor *mon,
|
|
|
|
qemuMonitorMachineInfo ***machines)
|
2012-08-15 15:18:41 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetCPUDefinitions(qemuMonitor *mon,
|
|
|
|
qemuMonitorCPUDefs **cpuDefs)
|
2012-08-20 14:58:20 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
|
|
|
|
qemuMonitorCPUModelExpansionType type,
|
|
|
|
virCPUDef *cpu,
|
|
|
|
bool migratable,
|
|
|
|
bool fail_no_props,
|
|
|
|
qemuMonitorCPUModelInfo **model_info)
|
2019-09-19 20:24:56 +00:00
|
|
|
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(6);
|
2016-12-18 19:22:26 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetCPUModelBaseline(qemuMonitor *mon,
|
|
|
|
virCPUDef *cpu_a,
|
|
|
|
virCPUDef *cpu_b,
|
|
|
|
qemuMonitorCPUModelInfo **baseline)
|
2019-09-19 20:24:58 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon,
|
|
|
|
virCPUDef *cpu_a,
|
|
|
|
virCPUDef *cpu_b,
|
|
|
|
char **result)
|
2019-09-19 20:25:02 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetCommands(qemuMonitor *mon,
|
|
|
|
char ***commands)
|
2012-08-22 09:25:20 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
GHashTable *
|
|
|
|
qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetKVMState(qemuMonitor *mon,
|
|
|
|
bool *enabled,
|
|
|
|
bool *present)
|
Make non-KVM machines work with QMP probing
When there is no 'qemu-kvm' binary and the emulator used for a machine
is, for example, 'qemu-system-x86_64' that, by default, runs without
kvm enabled, libvirt still supplies '-no-kvm' option to this process,
even though it does not recognize such option (making the start of a
domain fail in that case).
This patch fixes building a command-line for QEMU machines without KVM
acceleration and is based on following assumptions:
- QEMU_CAPS_KVM flag means that QEMU is running KVM accelerated
machines by default (without explicitly requesting that using a
command-line option). It is the closest to the truth according to
the code with the only exception being the comment next to the
flag, so it's fixed in this patch as well.
- QEMU_CAPS_ENABLE_KVM flag means that QEMU is, by default, running
without KVM acceleration and in case we need KVM acceleration it
needs to be explicitly instructed to do so. This is partially
true for the past (this option essentially means that QEMU
recognizes the '-enable-kvm' option, even though it's almost the
same).
2012-10-31 07:31:49 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetObjectTypes(qemuMonitor *mon,
|
|
|
|
char ***types)
|
2012-08-22 09:48:41 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
2013-06-24 17:51:56 +00:00
|
|
|
|
|
|
|
/* ListPath structures and API's are public only for qemumonitorjsontest */
|
|
|
|
typedef struct _qemuMonitorJSONListPath qemuMonitorJSONListPath;
|
|
|
|
struct _qemuMonitorJSONListPath {
|
|
|
|
char *name;
|
|
|
|
char *type;
|
|
|
|
};
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetObjectListPaths(qemuMonitor *mon,
|
|
|
|
const char *path,
|
|
|
|
qemuMonitorJSONListPath ***paths)
|
2013-06-24 17:51:56 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
void
|
|
|
|
qemuMonitorJSONListPathFree(qemuMonitorJSONListPath *paths);
|
2013-06-24 17:51:56 +00:00
|
|
|
|
2013-07-03 18:42:40 +00:00
|
|
|
/* ObjectProperty structures and Get/Set API's are public only
|
|
|
|
* for qemumonitorjsontest
|
|
|
|
*/
|
2013-07-03 18:15:07 +00:00
|
|
|
/* Flags for the 'type' field in _qemuMonitorJSONObjectProperty */
|
|
|
|
typedef enum {
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN=1,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_INT,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_LONG,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_UINT,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_ULONG,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_DOUBLE,
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_STRING,
|
|
|
|
|
|
|
|
QEMU_MONITOR_OBJECT_PROPERTY_LAST
|
|
|
|
} qemuMonitorJSONObjectPropertyType;
|
|
|
|
|
|
|
|
typedef struct _qemuMonitorJSONObjectProperty qemuMonitorJSONObjectProperty;
|
|
|
|
struct _qemuMonitorJSONObjectProperty {
|
|
|
|
int type; /* qemuMonitorJSONObjectPropertyType */
|
|
|
|
union {
|
|
|
|
bool b;
|
|
|
|
int iv;
|
|
|
|
long long l;
|
|
|
|
unsigned int ui;
|
|
|
|
unsigned long long ul;
|
|
|
|
double d;
|
|
|
|
char *str;
|
|
|
|
} val;
|
|
|
|
};
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetObjectProperty(qemuMonitor *mon,
|
|
|
|
const char *path,
|
|
|
|
const char *property,
|
|
|
|
qemuMonitorJSONObjectProperty *prop)
|
2013-07-03 18:15:07 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetObjectProperty(qemuMonitor *mon,
|
|
|
|
const char *path,
|
|
|
|
const char *property,
|
|
|
|
qemuMonitorJSONObjectProperty *prop)
|
2013-07-03 18:42:40 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
GHashTable *
|
|
|
|
qemuMonitorJSONGetDeviceProps(qemuMonitor *mon,
|
|
|
|
const char *device)
|
2020-05-06 17:53:43 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetObjectProps(qemuMonitor *mon,
|
|
|
|
const char *object,
|
|
|
|
char ***props)
|
2018-04-12 13:04:07 +00:00
|
|
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
2021-12-09 16:34:46 +00:00
|
|
|
|
|
|
|
char *
|
|
|
|
qemuMonitorJSONGetTargetArch(qemuMonitor *mon);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONNBDServerStart(qemuMonitor *mon,
|
|
|
|
const virStorageNetHostDef *server,
|
|
|
|
const char *tls_alias);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONNBDServerAdd(qemuMonitor *mon,
|
|
|
|
const char *deviceID,
|
|
|
|
const char *export,
|
|
|
|
bool writable,
|
|
|
|
const char *bitmap);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONNBDServerStop(qemuMonitor *mon);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockExportAdd(qemuMonitor *mon,
|
|
|
|
virJSONValue **props);
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONGetTPMModels(qemuMonitor *mon,
|
|
|
|
char ***tpmmodels)
|
2013-04-12 20:55:45 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetTPMTypes(qemuMonitor *mon,
|
|
|
|
char ***tpmtypes)
|
2013-04-12 20:55:45 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONAttachCharDev(qemuMonitor *mon,
|
|
|
|
const char *chrID,
|
|
|
|
virDomainChrSourceDef *chr);
|
|
|
|
int
|
|
|
|
qemuMonitorJSONDetachCharDev(qemuMonitor *mon,
|
|
|
|
const char *chrID);
|
2013-07-19 13:01:38 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetDeviceAliases(qemuMonitor *mon,
|
|
|
|
char ***aliases);
|
2013-07-19 13:01:38 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetGuestCPUx86(qemuMonitor *mon,
|
2022-02-07 10:45:18 +00:00
|
|
|
const char *cpuQOMPath,
|
2021-12-09 16:34:46 +00:00
|
|
|
virCPUData **data,
|
|
|
|
virCPUData **disabled);
|
2014-08-13 12:28:24 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetGuestCPU(qemuMonitor *mon,
|
|
|
|
virArch arch,
|
2022-02-07 10:45:18 +00:00
|
|
|
const char *cpuQOMPath,
|
2021-12-09 16:34:46 +00:00
|
|
|
qemuMonitorCPUFeatureTranslationCallback translate,
|
|
|
|
void *opaque,
|
|
|
|
virCPUData **enabled,
|
|
|
|
virCPUData **disabled);
|
2019-06-17 21:36:53 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONRTCResetReinjection(qemuMonitor *mon);
|
2014-08-29 20:23:11 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetIOThreads(qemuMonitor *mon,
|
|
|
|
qemuMonitorIOThreadInfo ***iothreads,
|
|
|
|
int *niothreads)
|
2014-08-29 20:23:11 +00:00
|
|
|
ATTRIBUTE_NONNULL(2);
|
2015-01-19 12:21:09 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetIOThread(qemuMonitor *mon,
|
|
|
|
qemuMonitorIOThreadInfo *iothreadInfo)
|
2018-10-03 22:13:14 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitor *mon,
|
|
|
|
GHashTable *info)
|
2015-01-19 12:21:09 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONFindLinkPath(qemuMonitor *mon,
|
|
|
|
const char *name,
|
|
|
|
const char *alias,
|
|
|
|
char **path)
|
2016-07-25 08:47:00 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);
|
2015-10-20 20:51:48 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrateIncoming(qemuMonitor *mon,
|
|
|
|
const char *uri)
|
2015-10-20 20:51:48 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrateStartPostCopy(qemuMonitor *mon)
|
2014-12-01 15:59:54 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
2017-10-20 07:17:09 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrateContinue(qemuMonitor *mon,
|
|
|
|
qemuMonitorMigrationStatus status)
|
2017-10-20 07:17:09 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
2014-12-01 15:59:54 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetRTCTime(qemuMonitor *mon,
|
|
|
|
struct tm *tm)
|
2016-04-29 14:01:47 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2016-07-08 11:52:11 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetHotpluggableCPUs(qemuMonitor *mon,
|
|
|
|
struct qemuMonitorQueryHotpluggableCpusEntry **entries,
|
|
|
|
size_t *nentries)
|
2016-07-08 11:52:11 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
2016-10-17 12:20:42 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
virJSONValue *
|
|
|
|
qemuMonitorJSONQueryQMPSchema(qemuMonitor *mon)
|
2016-10-17 12:20:42 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
2017-02-23 12:50:24 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetBlockThreshold(qemuMonitor *mon,
|
|
|
|
const char *nodename,
|
|
|
|
unsigned long long threshold)
|
2017-02-23 12:50:24 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
virJSONValue *
|
|
|
|
qemuMonitorJSONQueryNamedBlockNodes(qemuMonitor *mon,
|
|
|
|
bool flat)
|
2017-02-24 13:59:40 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetWatchdogAction(qemuMonitor *mon,
|
|
|
|
const char *action)
|
2017-09-01 11:39:15 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
2018-02-20 17:04:47 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevCreate(qemuMonitor *mon,
|
|
|
|
const char *jobname,
|
|
|
|
virJSONValue **props)
|
2018-09-03 12:45:16 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevAdd(qemuMonitor *mon,
|
|
|
|
virJSONValue **props)
|
2018-02-20 17:04:47 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevReopen(qemuMonitor *mon,
|
|
|
|
virJSONValue **props)
|
2020-02-13 08:00:37 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevDel(qemuMonitor *mon,
|
|
|
|
const char *nodename)
|
2018-02-20 17:04:47 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevTrayOpen(qemuMonitor *mon,
|
|
|
|
const char *id,
|
|
|
|
bool force)
|
2018-07-12 10:11:31 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevTrayClose(qemuMonitor *mon,
|
|
|
|
const char *id)
|
2018-07-12 10:11:31 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevMediumRemove(qemuMonitor *mon,
|
|
|
|
const char *id)
|
2018-07-12 10:11:31 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONBlockdevMediumInsert(qemuMonitor *mon,
|
|
|
|
const char *id,
|
|
|
|
const char *nodename)
|
2018-07-12 10:11:31 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONGetPRManagerInfo(qemuMonitor *mon,
|
|
|
|
GHashTable *info)
|
2018-07-03 10:07:30 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
|
2019-04-24 21:16:28 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONGetCurrentMachineInfo(qemuMonitor *mon,
|
|
|
|
qemuMonitorCurrentMachineInfo *info)
|
2019-04-24 21:16:28 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2019-09-26 13:53:39 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapAdd(virJSONValue *actions,
|
2019-09-26 13:53:39 +00:00
|
|
|
const char *node,
|
|
|
|
const char *name,
|
|
|
|
bool persistent,
|
2019-11-28 15:03:16 +00:00
|
|
|
bool disabled,
|
|
|
|
unsigned long long granularity);
|
2019-09-26 13:53:39 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapRemove(virJSONValue *actions,
|
2019-09-26 13:53:39 +00:00
|
|
|
const char *node,
|
|
|
|
const char *name);
|
2021-02-08 15:58:53 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONBitmapRemove(qemuMonitor *mon,
|
2021-02-08 15:58:53 +00:00
|
|
|
const char *node,
|
|
|
|
const char *name);
|
|
|
|
|
2019-09-26 13:53:39 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapEnable(virJSONValue *actions,
|
2019-09-26 13:53:39 +00:00
|
|
|
const char *node,
|
|
|
|
const char *name);
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapDisable(virJSONValue *actions,
|
2019-09-26 13:53:39 +00:00
|
|
|
const char *node,
|
|
|
|
const char *name);
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapMerge(virJSONValue *actions,
|
2019-09-26 13:53:39 +00:00
|
|
|
const char *node,
|
|
|
|
const char *target,
|
2021-03-11 07:16:13 +00:00
|
|
|
virJSONValue **sources);
|
2019-09-26 14:03:46 +00:00
|
|
|
|
2019-10-07 14:19:34 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBitmapMergeSourceAddBitmap(virJSONValue *sources,
|
2019-10-07 14:19:34 +00:00
|
|
|
const char *sourcenode,
|
|
|
|
const char *sourcebitmap);
|
|
|
|
|
2019-09-26 14:03:46 +00:00
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionSnapshotLegacy(virJSONValue *actions,
|
2019-09-26 14:03:46 +00:00
|
|
|
const char *device,
|
|
|
|
const char *path,
|
|
|
|
const char *format,
|
|
|
|
bool existing);
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionSnapshotBlockdev(virJSONValue *actions,
|
2019-09-26 14:03:46 +00:00
|
|
|
const char *node,
|
|
|
|
const char *overlay);
|
2019-09-27 15:28:48 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONTransactionBackup(virJSONValue *actions,
|
2019-09-27 15:28:48 +00:00
|
|
|
const char *device,
|
|
|
|
const char *jobname,
|
|
|
|
const char *target,
|
|
|
|
const char *bitmap,
|
|
|
|
qemuMonitorTransactionBackupSyncMode syncmode);
|
2020-02-25 09:55:11 +00:00
|
|
|
|
2021-12-09 16:34:46 +00:00
|
|
|
int
|
|
|
|
qemuMonitorJSONSetDBusVMStateIdList(qemuMonitor *mon,
|
|
|
|
const char *vmstatepath,
|
|
|
|
const char *idstr)
|
2020-02-25 09:55:11 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
2020-07-15 20:33:07 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONGetCPUMigratable(qemuMonitor *mon,
|
2022-02-07 10:45:18 +00:00
|
|
|
const char *cpuQOMPath,
|
2020-07-15 20:33:07 +00:00
|
|
|
bool *migratable);
|
2021-03-16 12:32:46 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONStartDirtyRateCalc(qemuMonitor *mon,
|
2022-02-20 13:28:12 +00:00
|
|
|
int seconds,
|
|
|
|
qemuMonitorDirtyRateCalcMode mode);
|
2021-03-16 12:32:49 +00:00
|
|
|
|
|
|
|
int
|
2021-03-11 07:16:13 +00:00
|
|
|
qemuMonitorJSONQueryDirtyRate(qemuMonitor *mon,
|
|
|
|
qemuMonitorDirtyRateInfo *info);
|
2021-08-20 12:39:27 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONSetAction(qemuMonitor *mon,
|
|
|
|
qemuMonitorActionShutdown shutdown,
|
|
|
|
qemuMonitorActionReboot reboot,
|
|
|
|
qemuMonitorActionWatchdog watchdog,
|
|
|
|
qemuMonitorActionPanic panic);
|
2020-11-23 16:29:00 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONChangeMemoryRequestedSize(qemuMonitor *mon,
|
|
|
|
const char *alias,
|
|
|
|
unsigned long long requestedsize);
|
2022-05-10 13:20:25 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
qemuMonitorJSONMigrateRecover(qemuMonitor *mon,
|
|
|
|
const char *uri);
|