{
virBuffer buf = VIR_BUFFER_INITIALIZER;
- if (dev->source.subsys.u.pci.backend
- == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
- virBufferAddLit(&buf, "vfio-pci");
- } else {
+ switch ((virDomainHostdevSubsysPciBackendType)
+ dev->source.subsys.u.pci.backend) {
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
virBufferAddLit(&buf, "pci-assign");
if (configfd && *configfd)
virBufferAsprintf(&buf, ",configfd=%s", configfd);
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
+ virBufferAddLit(&buf, "vfio-pci");
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("PCI passhthrough type needs to be specified"));
+ break;
}
+
virBufferAsprintf(&buf, ",host=%.2x:%.2x.%.1x",
dev->source.subsys.u.pci.addr.bus,
dev->source.subsys.u.pci.addr.slot,
VIR_FREE(devstr);
}
-
/* Add host passthrough hardware */
for (i = 0; i < def->nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
/* PCI */
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
+ int backend = hostdev->source.subsys.u.pci.backend;
- if (hostdev->source.subsys.u.pci.backend
- == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
+ if (backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("VFIO PCI device assignment is not "
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
char *configfd_name = NULL;
- if ((hostdev->source.subsys.u.pci.backend
- != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) &&
+ if ((backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_CONFIGFD)) {
int configfd = qemuOpenPCIConfig(hostdev);
int configfd = -1;
char *configfd_name = NULL;
bool releaseaddr = false;
+ int backend = hostdev->source.subsys.u.pci.backend;
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
return -1;
&hostdev, 1) < 0)
return -1;
- if (hostdev->source.subsys.u.pci.backend
- == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
- unsigned long long memKB;
-
+ switch ((virDomainHostdevSubsysPciBackendType) backend) {
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("VFIO PCI device assignment is not "
* In this case, the guest's memory may already be locked, but it
* doesn't hurt to "change" the limit to the same value.
*/
- vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
- memKB = vm->def->mem.hard_limit ?
- vm->def->mem.hard_limit : vm->def->mem.max_balloon + 1024 * 1024;
- virProcessSetMaxMemLock(vm->pid, memKB);
- vm->def->hostdevs[vm->def->nhostdevs--] = NULL;
+ if (vm->def->mem.hard_limit)
+ virProcessSetMaxMemLock(vm->pid, vm->def->mem.hard_limit);
+ else
+ virProcessSetMaxMemLock(vm->pid,
+ vm->def->mem.max_balloon + (1024 * 1024));
+
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
+ case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
+ break;
}
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
if (qemuDomainPCIAddressEnsureAddr(priv->pciaddrs, hostdev->info) < 0)
goto error;
releaseaddr = true;
- if ((hostdev->source.subsys.u.pci.backend
- != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) &&
+ if (backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO &&
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_PCI_CONFIGFD)) {
configfd = qemuOpenPCIConfig(hostdev);
if (configfd >= 0) {