qemu: vfio-ap device support

Adjusting domain format documentation, adding device address
support and adding command line generation for vfio-ap.
Since only one mediated hostdev with model vfio-ap is supported a check
disallows to define domains with more than one such hostdev device.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Reviewed-by: Chris Venteicher <cventeic@redhat.com>
This commit is contained in:
Boris Fiuczynski 2018-10-18 16:54:07 +02:00 committed by John Ferlan
parent dc788d2540
commit 1170864198
7 changed files with 46 additions and 2 deletions

View File

@ -4616,8 +4616,9 @@
<dd>For mediated devices (<span class="since">Since 3.2.0</span>)
the <code>model</code> attribute specifies the device API which
determines how the host's vfio driver will expose the device to the
guest. Currently, <code>model='vfio-pci'</code> and
guest. Currently, <code>model='vfio-pci'</code>,
<code>model='vfio-ccw'</code> (<span class="since">Since 4.4.0</span>)
and <code>model='vfio-ap'</code> (<span class="since">Since 4.9.0</span>)
is supported. <a href="drvnodedev.html#MDEV">MDEV</a> section
provides more information about mediated devices as well as how to
create mediated devices on the host.

View File

@ -4618,6 +4618,7 @@
<choice>
<value>vfio-pci</value>
<value>vfio-ccw</value>
<value>vfio-ap</value>
</choice>
</attribute>
<optional>

View File

@ -4275,6 +4275,31 @@ virDomainDefPostParseGraphics(virDomainDef *def)
}
static int
virDomainDefPostParseHostdev(virDomainDefPtr def)
{
size_t i;
bool vfioap_found = false;
/* verify settings of hostdevs vfio-ap */
for (i = 0; i < def->nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
if (virHostdevIsMdevDevice(hostdev) &&
hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
if (vfioap_found) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Only one hostdev of model vfio-ap is "
"supported"));
return -1;
}
vfioap_found = true;
}
}
return 0;
}
/**
* virDomainDriveAddressIsUsedByDisk:
* @def: domain definition containing the disks to check
@ -5185,6 +5210,9 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
virDomainDefPostParseGraphics(def);
if (virDomainDefPostParseHostdev(def) < 0)
return -1;
if (virDomainDefPostParseCPU(def) < 0)
return -1;

View File

@ -5476,6 +5476,14 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
return -1;
}
break;
case VIR_MDEV_MODEL_TYPE_VFIO_AP:
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("VFIO AP device assignment is not "
"supported by this version of QEMU"));
return -1;
}
break;
case VIR_MDEV_MODEL_TYPE_LAST:
default:
virReportEnumRangeError(virMediatedDeviceModelType,

View File

@ -294,6 +294,10 @@ qemuDomainPrimeVfioDeviceAddresses(virDomainDefPtr def,
subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
def->hostdevs[i]->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
def->hostdevs[i]->info->type = type;
if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP)
def->hostdevs[i]->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
}
}

View File

@ -48,7 +48,8 @@ struct _virMediatedDeviceList {
VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
"vfio-pci",
"vfio-ccw")
"vfio-ccw",
"vfio-ap")
static virClassPtr virMediatedDeviceListClass;

View File

@ -27,6 +27,7 @@
typedef enum {
VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
VIR_MDEV_MODEL_TYPE_VFIO_AP = 2,
VIR_MDEV_MODEL_TYPE_LAST
} virMediatedDeviceModelType;