2010-12-16 15:07:07 +00:00
|
|
|
/*
|
|
|
|
* qemu_command.h: QEMU command generation
|
|
|
|
*
|
2016-02-10 12:33:47 +00:00
|
|
|
* Copyright (C) 2006-2016 Red Hat, Inc.
|
2010-12-16 15:07:07 +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/>.
|
2010-12-16 15:07:07 +00:00
|
|
|
*
|
|
|
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __QEMU_COMMAND_H__
|
|
|
|
# define __QEMU_COMMAND_H__
|
|
|
|
|
2014-05-10 16:35:24 +00:00
|
|
|
# include "domain_addr.h"
|
2010-12-16 15:07:07 +00:00
|
|
|
# include "domain_conf.h"
|
2012-12-12 16:27:01 +00:00
|
|
|
# include "vircommand.h"
|
2010-12-16 15:07:07 +00:00
|
|
|
# include "capabilities.h"
|
|
|
|
# include "qemu_conf.h"
|
2010-12-16 15:23:41 +00:00
|
|
|
# include "qemu_domain.h"
|
2016-02-15 18:08:02 +00:00
|
|
|
# include "qemu_domain_address.h"
|
2012-08-20 16:44:14 +00:00
|
|
|
# include "qemu_capabilities.h"
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
/* Config type for XML import/export conversions */
|
|
|
|
# define QEMU_CONFIG_FORMAT_ARGV "qemu-argv"
|
|
|
|
|
|
|
|
# define QEMU_DRIVE_HOST_PREFIX "drive-"
|
|
|
|
# define QEMU_FSDEV_HOST_PREFIX "fsdev-"
|
|
|
|
|
2016-02-10 12:33:47 +00:00
|
|
|
VIR_ENUM_DECL(qemuVideo)
|
2015-01-12 12:18:46 +00:00
|
|
|
|
2013-05-17 10:34:24 +00:00
|
|
|
typedef struct _qemuBuildCommandLineCallbacks qemuBuildCommandLineCallbacks;
|
|
|
|
typedef qemuBuildCommandLineCallbacks *qemuBuildCommandLineCallbacksPtr;
|
|
|
|
struct _qemuBuildCommandLineCallbacks {
|
2014-07-24 13:23:40 +00:00
|
|
|
char *(*qemuGetSCSIDeviceSgName) (const char *sysfs_prefix,
|
|
|
|
const char *adapter,
|
|
|
|
unsigned int bus,
|
|
|
|
unsigned int target,
|
2015-06-17 03:29:53 +00:00
|
|
|
unsigned long long unit);
|
2013-05-17 10:34:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
extern qemuBuildCommandLineCallbacks buildCommandLineCallbacks;
|
2011-02-14 16:09:39 +00:00
|
|
|
|
2015-01-13 17:19:34 +00:00
|
|
|
char *qemuBuildObjectCommandlineFromJSON(const char *type,
|
|
|
|
const char *alias,
|
|
|
|
virJSONValuePtr props);
|
|
|
|
|
2010-12-16 15:07:07 +00:00
|
|
|
virCommandPtr qemuBuildCommandLine(virConnectPtr conn,
|
2012-11-28 16:43:10 +00:00
|
|
|
virQEMUDriverPtr driver,
|
2010-12-16 15:07:07 +00:00
|
|
|
virDomainDefPtr def,
|
2011-01-07 23:36:25 +00:00
|
|
|
virDomainChrSourceDefPtr monitor_chr,
|
2010-12-16 15:07:07 +00:00
|
|
|
bool monitor_json,
|
2013-02-01 13:48:58 +00:00
|
|
|
virQEMUCapsPtr qemuCaps,
|
2015-10-20 11:51:01 +00:00
|
|
|
const char *migrateURI,
|
2010-12-16 15:07:07 +00:00
|
|
|
virDomainSnapshotObjPtr current_snapshot,
|
2014-04-27 00:15:22 +00:00
|
|
|
virNetDevVPortProfileOp vmop,
|
2014-03-13 18:23:56 +00:00
|
|
|
qemuBuildCommandLineCallbacksPtr callbacks,
|
2014-09-18 15:38:32 +00:00
|
|
|
bool forXMLToArgv,
|
2014-10-30 06:34:30 +00:00
|
|
|
bool enableFips,
|
2015-01-16 11:25:50 +00:00
|
|
|
virBitmapPtr nodeset,
|
|
|
|
size_t *nnicindexes,
|
|
|
|
int **nicindexes)
|
2015-11-19 11:21:22 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(10);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2013-03-13 15:20:34 +00:00
|
|
|
/* Generate '-device' string for chardev device */
|
|
|
|
int
|
|
|
|
qemuBuildChrDeviceStr(char **deviceStr,
|
|
|
|
virDomainDefPtr vmdef,
|
|
|
|
virDomainChrDefPtr chr,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2011-11-21 12:50:42 +00:00
|
|
|
|
2010-12-16 15:07:07 +00:00
|
|
|
/* With vlan == -1, use netdev syntax, else old hostnet */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildHostNetStr(virDomainNetDefPtr net,
|
|
|
|
virQEMUDriverPtr driver,
|
|
|
|
char type_sep,
|
|
|
|
int vlan,
|
|
|
|
char **tapfd,
|
2014-11-12 15:42:02 +00:00
|
|
|
size_t tapfdSize,
|
2014-07-24 13:23:40 +00:00
|
|
|
char **vhostfd,
|
2014-11-12 15:42:02 +00:00
|
|
|
size_t vhostfdSize);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
/* Legacy, pre device support */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildNicStr(virDomainNetDefPtr net,
|
|
|
|
const char *prefix,
|
|
|
|
int vlan);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
/* Current, best practice */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildNicDevStr(virDomainDefPtr def,
|
|
|
|
virDomainNetDefPtr net,
|
|
|
|
int vlan,
|
|
|
|
int bootindex,
|
2014-11-12 15:42:02 +00:00
|
|
|
size_t vhostfdSize,
|
2014-07-24 13:23:40 +00:00
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
|
2013-02-01 13:48:58 +00:00
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
/* Both legacy & current support */
|
2011-10-31 19:06:23 +00:00
|
|
|
char *qemuBuildDriveStr(virConnectPtr conn,
|
|
|
|
virDomainDiskDefPtr disk,
|
2011-05-26 14:15:01 +00:00
|
|
|
bool bootable,
|
2013-02-01 13:48:58 +00:00
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
char *qemuBuildFSStr(virDomainFSDefPtr fs,
|
2013-02-01 13:48:58 +00:00
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
|
|
|
/* Current, best practice */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildDriveDevStr(virDomainDefPtr def,
|
|
|
|
virDomainDiskDefPtr disk,
|
|
|
|
int bootindex,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
|
|
|
char *qemuBuildFSDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainFSDefPtr fs,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
/* Current, best practice */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildControllerDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainControllerDefPtr def,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
int *nusbcontroller);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildWatchdogDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainWatchdogDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildMemballoonDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainMemballoonDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildUSBInputDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainInputDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildSoundDevStr(virDomainDefPtr domainDef,
|
|
|
|
virDomainSoundDefPtr sound,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-10-12 22:28:58 +00:00
|
|
|
int qemuBuildMemoryBackendStr(unsigned long long size,
|
|
|
|
unsigned long long pagesize,
|
|
|
|
int guestNode,
|
|
|
|
virBitmapPtr userNodeset,
|
|
|
|
virBitmapPtr autoNodeset,
|
|
|
|
virDomainDefPtr def,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
virQEMUDriverConfigPtr cfg,
|
|
|
|
const char **backendType,
|
|
|
|
virJSONValuePtr *backendProps,
|
|
|
|
bool force);
|
|
|
|
|
2015-10-08 05:25:32 +00:00
|
|
|
char *qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem);
|
2014-10-12 22:28:58 +00:00
|
|
|
|
2010-12-16 15:07:07 +00:00
|
|
|
/* Legacy, pre device support */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
/* Current, best practice */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildPCIHostdevDevStr(virDomainDefPtr def,
|
|
|
|
virDomainHostdevDefPtr dev,
|
qemu: add bootindex option to hostdev network interface commandline
when appropriate, of course. If the config for a domain specifies boot
order with <boot dev='blah'/> elements, e.g.:
<os>
...
<boot dev='hd'/>
<boot dev='network'/>
</os>
Then the first disk device in the config will have ",bootindex=1"
appended to its qemu commandline -device options, and the first (and
*only* the first) network interface device will get ",bootindex=2".
However, if the first network interface device is a "hostdev" device
(an SRIOV Virtual Function (VF) being assigned to the domain with
vfio), then the bootindex option will *not* be appended. This happens
because the bootindex=n option corresponding to the order of "<boot
dev='network'/>" is added to the -device for the first network device
when network device commandline args are constructed, but if it's a
hostdev network device, its commandline arg is instead constructed in
the loop for hostdevs.
This patch fixes that omission by noticing (in bootHostdevNet) if the
first network device was a hostdev, and if so passing on the proper
bootindex to the commandline generator for hostdev devices - the
result is that ",bootindex=2" will be properly appended to the first
"network" device in the config even if it is really a hostdev
(including if it is assigned from a libvirt network pool). (note that
this is only the case if there is no <bootmenu enabled='yes'/> element
in the config ("-boot menu-on" in qemu) , since the two are mutually
exclusive - when the bootmenu is enabled, the individual per-device
bootindex options can't be used by qemu, and we revert to using "-boot
order=xyz" instead).
If a greater level of control over boot order is desired (e.g., more
than one network device should be tried, or a network device other
than the first one encountered in the config), then <boot
dev='network'/> in the <os> element should not be used; instead, the
individual device elements in the config should be given a "<boot
order='n'/>
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1278421
2015-11-30 22:40:44 +00:00
|
|
|
int bootIndex,
|
2014-07-24 13:23:40 +00:00
|
|
|
const char *configfd,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2015-01-17 05:09:31 +00:00
|
|
|
char *qemuBuildRNGDevStr(virDomainDefPtr def,
|
|
|
|
virDomainRNGDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2015-01-17 05:09:37 +00:00
|
|
|
int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
const char **type,
|
|
|
|
virJSONValuePtr *props);
|
2015-01-17 05:09:31 +00:00
|
|
|
|
2015-06-17 03:56:14 +00:00
|
|
|
char *qemuBuildShmemDevStr(virDomainDefPtr def,
|
|
|
|
virDomainShmemDefPtr shmem,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
|
|
|
char *qemuBuildShmemBackendStr(virDomainShmemDefPtr shmem,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
|
|
|
|
|
|
|
|
2010-12-16 15:07:07 +00:00
|
|
|
int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
|
|
|
|
|
|
|
|
/* Legacy, pre device support */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildUSBHostdevUSBDevStr(virDomainHostdevDefPtr dev);
|
2010-12-16 15:07:07 +00:00
|
|
|
/* Current, best practice */
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildUSBHostdevDevStr(virDomainDefPtr def,
|
|
|
|
virDomainHostdevDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
|
|
|
|
|
|
|
char *qemuBuildSCSIHostdevDrvStr(virConnectPtr conn,
|
|
|
|
virDomainHostdevDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
qemuBuildCommandLineCallbacksPtr callbacks)
|
|
|
|
ATTRIBUTE_NONNULL(4);
|
|
|
|
char *qemuBuildSCSIHostdevDevStr(virDomainDefPtr def,
|
2013-08-02 17:48:50 +00:00
|
|
|
virDomainHostdevDefPtr dev,
|
2013-02-01 13:48:58 +00:00
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
2014-07-24 13:23:40 +00:00
|
|
|
char *qemuBuildHubDevStr(virDomainDefPtr def,
|
|
|
|
virDomainHubDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
|
|
|
char *qemuBuildRedirdevDevStr(virDomainDefPtr def,
|
|
|
|
virDomainRedirdevDefPtr dev,
|
|
|
|
virQEMUCapsPtr qemuCaps);
|
2010-12-16 15:07:07 +00:00
|
|
|
|
qemu: allocate network connections sooner during domain startup
VFIO device assignment requires a cgroup ACL to be setup for access to
the /dev/vfio/nn "group" device for any devices that will be assigned
to a guest. In the case of a host device that is allocated from a
pool, it was being allocated during qemuBuildCommandLine(), which is
called by qemuProcessStart() *after* the all-encompassing
qemuSetupCgroup() was called, meaning that the standard Cgroup ACL
setup wasn't creating ACLs for these devices allocated from pools.
One possible solution was to manually add a single ACL down inside
qemuBuildCommandLine() when networkAllocateActualDevice() is called,
but that has two problems: 1) the function that adds the cgroup ACL
requires a virDomainObjPtr, which isn't available in
qemuBuildCommandLine(), and 2) we really shouldn't be doing network
device setup inside qemuBuildCommandLine() anyway.
Instead, I've created a new function called
qemuNetworkPrepareDevices() which is called just before
qemuPrepareHostDevices() during qemuProcessStart() (explanation of
ordering in the comments), i.e. well before the call to
qemuSetupCgroup(). To minimize code churn in a patch that will be
backported to 1.0.5-maint, qemuNetworkPrepareDevices only does
networkAllocateActualDevice() and the bare amount of setup required
for type='hostdev network devices, but it eventually should do *all*
device setup for guest network devices.
Note that some of the code that was previously needed in
qemuBuildCommandLine() is no longer required when
networkAllocateActualDevice() is called earlier:
* qemuAssignDeviceHostdevAlias() is already done further down in
qemuProcessStart().
* qemuPrepareHostdevPCIDevices() is called by
qemuPrepareHostDevices() which is called after
qemuNetworkPrepareDevices() in qemuProcessStart().
As hinted above, this new function should be moved into a separate
qemu_network.c (or similarly named) file along with
qemuPhysIfaceConnect(), qemuNetworkIfaceConnect(), and
qemuOpenVhostNet(), and expanded to call those functions as well, then
the nnets loop in qemuBuildCommandLine() should be reduced to only
build the commandline string (which itself can be in a separate
qemuInterfaceBuilldCommandLine() function as suggested by
Michal). However, this will require storing away an array of tapfd and
vhostfd that are needed for the commandline, so I would rather do that
in a separate patch and leave this patch at the minimum to fix the
bug.
2013-05-06 19:43:56 +00:00
|
|
|
int qemuNetworkPrepareDevices(virDomainDefPtr def);
|
|
|
|
|
2014-04-08 15:50:50 +00:00
|
|
|
int qemuGetDriveSourceString(virStorageSourcePtr src,
|
|
|
|
virConnectPtr conn,
|
|
|
|
char **source);
|
2014-07-29 13:21:05 +00:00
|
|
|
|
|
|
|
int qemuCheckDiskConfig(virDomainDiskDefPtr disk);
|
2014-09-18 15:38:32 +00:00
|
|
|
|
|
|
|
bool
|
|
|
|
qemuCheckFips(void);
|
2015-08-31 15:06:42 +00:00
|
|
|
|
|
|
|
bool qemuCheckCCWS390AddressSupport(virDomainDefPtr def,
|
|
|
|
virDomainDeviceInfo info,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
const char *devicename);
|
2015-10-20 11:51:01 +00:00
|
|
|
|
2010-12-16 15:07:07 +00:00
|
|
|
#endif /* __QEMU_COMMAND_H__*/
|