提交 11708641 编写于 作者: B Boris Fiuczynski 提交者: John Ferlan

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: NBoris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: NBjoern Walk <bwalk@linux.ibm.com>
Reviewed-by: NChris Venteicher <cventeic@redhat.com>
上级 dc788d25
......@@ -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.
......
......@@ -4618,6 +4618,7 @@
<choice>
<value>vfio-pci</value>
<value>vfio-ccw</value>
<value>vfio-ap</value>
</choice>
</attribute>
<optional>
......
......@@ -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;
......
......@@ -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,
......
......@@ -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;
}
}
......
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册