From nobody Sun Feb 8 21:27:06 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=ixsystems.com ARC-Seal: i=1; a=rsa-sha256; t=1582526865; cv=none; d=zohomail.com; s=zohoarc; b=QMV6nX52U4r0Bet5biI9KRp6dBVOw5tX/4HjwF27zLvx0XU3S4fs95/zDT5BIXXUfUTDgIJVfPPdUlTFfdqHaPSVPsUmDGuOx5FbfZnXAIivcWAO7GcTM0uLvMTmJ8tDO0JNAe/REESRatQBk1mqf+luqyADgKbVOaROWxOBDb0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1582526865; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VpaBXH0IRYA079tyG5jMkvvrGs3I2nqeXpZE+cvjih8=; b=PuHTYbAu+y1qcLbMczw3hU0N0DTHbD3a/hAJ3Ep8ctMripo64drmMJTVwF91OgKsoEkZbugLaP2c9WRSiGizM3qSv7RaUQSlvYbc1x7simpgeHUxVtwj/ikJmQFX52Oai2w5rU8k8lH9m7NQ4plqztBtYeMgQi060f3lqxrIMhY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1582526865987495.798683827044; Sun, 23 Feb 2020 22:47:45 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-382-RJaUmuvPMYGcKbwHGGjxog-1; Mon, 24 Feb 2020 01:47:42 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2E2E8800D5C; Mon, 24 Feb 2020 06:47:37 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id F3BA42709B; Mon, 24 Feb 2020 06:47:36 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id ADD97180880C; Mon, 24 Feb 2020 06:47:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 01O6kgia025604 for ; Mon, 24 Feb 2020 01:46:42 -0500 Received: by smtp.corp.redhat.com (Postfix) id 8A88B2166B2E; Mon, 24 Feb 2020 06:46:42 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 851782166B2B for ; Mon, 24 Feb 2020 06:46:42 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6051D185A78E for ; Mon, 24 Feb 2020 06:46:42 +0000 (UTC) Received: from mail-yb1-f193.google.com (mail-yb1-f193.google.com [209.85.219.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-152-ANr2v6_HNV-chZrS7Zw2pA-1; Mon, 24 Feb 2020 01:46:40 -0500 Received: by mail-yb1-f193.google.com with SMTP id f130so4179205ybc.7 for ; Sun, 23 Feb 2020 22:46:39 -0800 (PST) Received: from xeon-freebsd.freqlabs.com. (69-228-200-148.lightspeed.knvltn.sbcglobal.net. [69.228.200.148]) by smtp.gmail.com with ESMTPSA id j184sm4821447ywa.39.2020.02.23.22.46.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Feb 2020 22:46:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582526864; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=VpaBXH0IRYA079tyG5jMkvvrGs3I2nqeXpZE+cvjih8=; b=bUyQqDTsq64cRkicml7UDSuXeh3dsQPwrrRzw0zEY9wRXHIbcAbR+ckOdCp+T+s4aYfvgv nOXWvFzq0WEJT9+K8Wzdte0D6eV8M39xjQzRRNb3aLPYEBtgay1rNOvzd3raBccvK72UsK +DJq9nIuUFx3alfVqJ1bkC+XZu+Bd/Q= X-MC-Unique: RJaUmuvPMYGcKbwHGGjxog-1 X-MC-Unique: ANr2v6_HNV-chZrS7Zw2pA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=U6aoUUoYVQtyoMh2K3r2YW/3buh5iBFartrBUz2vbEg=; b=K+Uthu97vNGU8UaXWkeHkVs7NkZ2WU4Q4lThqGgTieQwmYin2K/gOCV6f91kQAL6GX It5nZr7wCiiKCe7elY7Au7cxvO6xubSvyiB81IvFZxlMxW9gYUy2S0furi7Co0XOiitd 9hdaiiv1vOSMCunvNIgQhzlzV5d+PWqAeAh3F14bZw6ep8s8ehzJfjp6S6HYg4tQb0qU 7Rocs5GznwlT5zJyctiK8C0d5IvpWJ7i+W7DOGezTo7pSs6sG2hFfoJRlLv9Bjec16Ux 4PkIavpUulC+s+v6qs+CuWyqbi18XDVy0yflpqA5s4l4okKcIMTJFym4szX3uBeq3UOy 9MPQ== X-Gm-Message-State: APjAAAX+7fuOg0aemsgKm0K2Eqciz2tYIrlJnrR4u9mjb2g58IS+ewTn NGSoVrR0TGMRMQDn6nec6OQUPxRZg+QZuPATbWW8jim6UkLS0xTiB3ChKeFaK39lyWTF5RiEj2i zdP5tCvRhOaewN29/h+xhJy/KzwsHj9dA1RCcJ4WDJupIcC1FY7VOJG0t/VR5yj5trBQ= X-Google-Smtp-Source: APXvYqwzRaSSGrduk3pAkGrpZDxC2SRTtEfL0yoZeO1NSRvU5yDjM7vqd0mnv4HS72LYpG0HvWelyQ== X-Received: by 2002:a5b:74e:: with SMTP id s14mr43294790ybq.295.1582526797810; Sun, 23 Feb 2020 22:46:37 -0800 (PST) From: Ryan Moeller X-Google-Original-From: Ryan Moeller To: libvir-list@redhat.com Subject: [PATCH v1 10/12] add hostdev handling for bhyve Date: Mon, 24 Feb 2020 01:46:22 -0500 Message-Id: <20200224064624.66649-11-ryan@iXsystems.com> In-Reply-To: <20200224064624.66649-1-ryan@iXsystems.com> References: <20200224064624.66649-1-ryan@iXsystems.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 01O6kgia025604 X-loop: libvir-list@redhat.com Cc: Ryan Moeller X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Handle PCI passthrough and virtio-scsi using hostdev devices. Example PCI passthrough: domain xml snippet ```
``` loader.conf snippet ``` vmm_load=3D"YES" pptdevs=3D"6/2/0" ``` Example SCSI passthrough: domain xml snippet ```
``` ctl.conf snippet ``` portal-group "pg0" { discovery-auth-group "no-authentication" listen "127.0.0.1" } target iqn.2020-01.com.example:target0 { auth-group "no-authentication" portal-group "pg0" port ioctl/5/0 lun 0 { path "/dev/zvol/storage/lun0" } lun 1 { path "/dev/zvol/storage/lun1" } lun 2 { path "/dev/zvol/storage/lun2" } lun 3 { path "/dev/zvol/storage/lun3" } } ``` Signed-off-by: Ryan Moeller --- docs/schemas/domaincommon.rng | 30 ++++ src/bhyve/bhyve_capabilities.c | 14 ++ src/bhyve/bhyve_capabilities.h | 1 + src/bhyve/bhyve_command.c | 121 ++++++++++++++++ src/bhyve/bhyve_parse_command.c | 90 ++++++++++++ src/conf/domain_audit.c | 5 + src/conf/domain_conf.c | 131 ++++++++++++++++++ src/conf/domain_conf.h | 29 +++- src/conf/virconftypes.h | 3 + src/qemu/qemu_command.c | 2 + src/qemu/qemu_domain.c | 5 + src/qemu/qemu_hostdev.c | 1 + src/qemu/qemu_hotplug.c | 2 + src/qemu/qemu_migration.c | 1 + src/security/security_apparmor.c | 1 + src/security/security_dac.c | 28 ++++ src/security/security_selinux.c | 8 ++ .../bhyveargv2xml-passthru.args | 8 ++ .../bhyveargv2xml-passthru.xml | 26 ++++ .../bhyveargv2xml-virtio-scsi.args | 9 ++ .../bhyveargv2xml-virtio-scsi.xml | 20 +++ tests/bhyveargv2xmltest.c | 2 + .../bhyvexml2argv-passthru.args | 11 ++ .../bhyvexml2argv-passthru.ldargs | 1 + .../bhyvexml2argv-passthru.xml | 22 +++ .../bhyvexml2argv-virtio-scsi.args | 9 ++ .../bhyvexml2argv-virtio-scsi.ldargs | 1 + .../bhyvexml2argv-virtio-scsi.xml | 21 +++ tests/bhyvexml2argvtest.c | 4 +- .../bhyvexml2xmlout-passthru.xml | 29 ++++ .../bhyvexml2xmlout-virtio-scsi.xml | 23 +++ tests/bhyvexml2xmltest.c | 2 + 32 files changed, 658 insertions(+), 2 deletions(-) create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-passthru.args create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-passthru.xml create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.args create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-passthru.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-passthru.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-passthru.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-passthru.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-virtio-scsi.x= ml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index c00ace7d9c..e5250e1f32 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4697,6 +4697,7 @@ + @@ -4723,6 +4724,34 @@ =20 =20 + + + scsi_ctl + + + + + virtio + + + + + + + + ioctl + + + + + + + + + + + + pci @@ -4734,6 +4763,7 @@ kvm vfio + vmm xen diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index fb8829d571..fb6be0aaba 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -323,6 +323,17 @@ bhyveProbeCapsXHCIController(unsigned int *caps, char = *binary) } =20 =20 +static int +bhyveProbeCapsVirtioSCSI(unsigned int *caps, char *binary) +{ + return bhyveProbeCapsDeviceHelper(caps, binary, + "-s", + "0,virtio-scsi", + "pci slot 0:0: unknown device \"virt= io-scsi\"", + BHYVE_CAP_VIRTIOSCSI); +} + + int virBhyveProbeCaps(unsigned int *caps) { @@ -351,6 +362,9 @@ virBhyveProbeCaps(unsigned int *caps) if ((ret =3D bhyveProbeCapsXHCIController(caps, binary))) goto out; =20 + if ((ret =3D bhyveProbeCapsVirtioSCSI(caps, binary))) + goto out; + out: VIR_FREE(binary); return ret; diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h index 12926cf423..bb62bdfb15 100644 --- a/src/bhyve/bhyve_capabilities.h +++ b/src/bhyve/bhyve_capabilities.h @@ -49,6 +49,7 @@ typedef enum { BHYVE_CAP_FBUF =3D 1 << 4, BHYVE_CAP_XHCI =3D 1 << 5, BHYVE_CAP_CPUTOPOLOGY =3D 1 << 6, + BHYVE_CAP_VIRTIOSCSI =3D 1 << 7, } virBhyveCapsFlags; =20 int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps); diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index 5b1d80083a..9f4030f6a3 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -362,6 +362,123 @@ bhyveBuildControllerArgStr(const virDomainDef *def, return 0; } =20 +static int +bhyveBuildHostdevSubsysPCIArgStr(const virDomainDef *def, + virDomainHostdevDefPtr dev, + bhyveConnPtr driver G_GNUC_UNUSED, + virCommandPtr cmd) +{ + virDomainHostdevSubsysPCIPtr pcisrc =3D &dev->source.subsys.u.pci; + + switch (pcisrc->backend) { + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: + pcisrc->backend =3D VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM; + G_GNUC_FALLTHROUGH; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM: + if (!def->mem.locked) { + /* TODO: maybe just configure it automatically? */ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("guest memory must be locked (wired) for " + "PCI passthrough")); + return -1; + } + virCommandAddArg(cmd, "-s"); + virCommandAddArgFormat(cmd, "%u:%u:%u,passthru,%u/%u/%u", + dev->info->addr.pci.bus, + dev->info->addr.pci.slot, + dev->info->addr.pci.function, + pcisrc->addr.bus, + pcisrc->addr.slot, + pcisrc->addr.function); + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unsupported hostdev pci backend")); + return -1; + } + return 0; +} + +static int +bhyveBuildHostdevSubsysSCSICTLArgStr(const virDomainDef *def G_GNUC_UNUSED, + virDomainHostdevDefPtr dev, + bhyveConnPtr driver, + virCommandPtr cmd) +{ + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &dev->source.subsys.u.scsi= _ctl; + + /* Actually CAM Target Layer (CTL), not VHost on FreeBSD. */ + if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_VIRTIOSCSI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Installed bhyve binary does not support " + "defining virtio-scsi devices")); + return -1; + } + if (ctlsrc->protocol !=3D + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_IOCTL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unsupported hostdev scsi_ctl protocol")); + return -1; + } + switch (ctlsrc->model) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_DEFAULT: + ctlsrc->model =3D + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_VIRTIO; + G_GNUC_FALLTHROUGH; + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_VIRTIO: + virCommandAddArg(cmd, "-s"); + virCommandAddArgFormat(cmd, "%u:%u,virtio-scsi,/dev/cam/ctl%u.%u", + dev->info->addr.pci.slot, + dev->info->addr.pci.function, + ctlsrc->pp, ctlsrc->vp); + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unsupported hostdev scsi_ctl model")); + return -1; + } + return 0; +} + +static int +bhyveBuildHostdevSubsysArgStr(const virDomainDef *def, + virDomainHostdevDefPtr dev, + bhyveConnPtr driver, + virCommandPtr cmd) +{ + switch (dev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + if (bhyveBuildHostdevSubsysPCIArgStr(def, dev, driver, cmd) < 0) + return -1; + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + if (bhyveBuildHostdevSubsysSCSICTLArgStr(def, dev, driver, cmd) < = 0) + return -1; + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unsupported hostdev subsystem type")); + return -1; + } + return 0; +} + +static int +bhyveBuildHostdevArgStr(const virDomainDef *def, + virDomainHostdevDefPtr dev, + bhyveConnPtr driver, + virCommandPtr cmd) +{ + switch (dev->mode) { + case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: + return bhyveBuildHostdevSubsysArgStr(def, dev, driver, cmd); + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unsupported hostdev device mode")); + return -1; + } +} + static int bhyveBuildLPCArgStr(const virDomainDef *def G_GNUC_UNUSED, virCommandPtr cmd) @@ -613,6 +730,10 @@ virBhyveProcessBuildBhyveCmd(bhyveConnPtr driver, virD= omainDefPtr def, if (bhyveBuildDiskArgStr(def, def->disks[i], cmd) < 0) goto error; } + for (i =3D 0; i < def->nhostdevs; i++) { + if (bhyveBuildHostdevArgStr(def, def->hostdevs[i], driver, cmd) < = 0) + goto error; + } =20 if (def->ngraphics && def->nvideos) { if (def->ngraphics =3D=3D 1 && def->nvideos =3D=3D 1) { diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_comman= d.c index 76423730d9..d69d23ace8 100644 --- a/src/bhyve/bhyve_parse_command.c +++ b/src/bhyve/bhyve_parse_command.c @@ -476,6 +476,92 @@ bhyveParsePCIDisk(virDomainDefPtr def, return -1; } =20 +static int +bhyveParsePCIPassthru(virDomainDefPtr def, + unsigned vmbus, + unsigned vmslot, + unsigned vmfunction, + char *config) +{ + /* -s bus:slot:function,passthru,BUS/SLOT/FUNCTION */ + virDomainHostdevDefPtr dev =3D NULL; + virDomainHostdevSubsysPCIPtr pcisrc =3D NULL; + unsigned hostbus, hostslot, hostfunction; + + hostslot =3D hostbus =3D hostfunction =3D 0; + if (sscanf(config, "%u/%u/%u", &hostbus, &hostslot, &hostfunction) != =3D 3) + return -1; + + if ((dev =3D virDomainHostdevDefNew()) =3D=3D NULL) + return -1; + dev->info->type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + dev->info->addr.pci.bus =3D vmbus; + dev->info->addr.pci.slot =3D vmslot; + dev->info->addr.pci.function =3D vmfunction; + dev->mode =3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; + dev->source.subsys.type =3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; + pcisrc =3D &dev->source.subsys.u.pci; + pcisrc->backend =3D VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM; + pcisrc->addr.bus =3D hostbus; + pcisrc->addr.slot =3D hostslot; + pcisrc->addr.function =3D hostfunction; + + if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, dev) < 0) + goto error; + + return 0; + + error: + virDomainHostdevDefFree(dev); + return -1; +} + +static int +bhyveParseSCSICTL(virDomainDefPtr def, + unsigned bus, + unsigned slot, + unsigned function, + char *config) +{ + /* -s slot,virtio-scsi,[dev=3D]/dev/cam/ctlPP.VP[,scsi-device-options]= */ + virDomainHostdevDefPtr dev =3D NULL; + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D NULL; + unsigned pp, vp; + + /* Skip [dev=3D] if present. */ + if (STRPREFIX(config, "dev=3D")) + config =3D strchr(config, '=3D') + 1; + + pp =3D vp =3D 0; + if (sscanf(config, "/dev/cam/ctl%u.%u", &pp, &vp) !=3D 2) + return -1; + + if ((dev =3D virDomainHostdevDefNew()) =3D=3D NULL) + return -1; + dev->info->type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + dev->info->addr.pci.bus =3D bus; + dev->info->addr.pci.slot =3D slot; + dev->info->addr.pci.function =3D function; + dev->mode =3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; + dev->source.subsys.type =3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL; + ctlsrc =3D &dev->source.subsys.u.scsi_ctl; + ctlsrc->model =3D + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_VIRTIO; + ctlsrc->protocol =3D + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_IOCTL; + ctlsrc->pp =3D pp; + ctlsrc->vp =3D vp; + + if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, dev) < 0) + goto error; + + return 0; + + error: + virDomainHostdevDefFree(dev); + return -1; +} + static int bhyveParsePCINet(virDomainDefPtr def, virDomainXMLOptionPtr xmlopt, @@ -601,6 +687,8 @@ bhyveParseBhyvePCIArg(virDomainDefPtr def, nvirtiodisk, nahcidisk, conf); + else if (STREQ(emulation, "passthru")) + bhyveParsePCIPassthru(def, bus, slot, function, conf); else if (STREQ(emulation, "virtio-blk")) bhyveParsePCIDisk(def, caps, bus, slot, function, VIR_DOMAIN_DISK_BUS_VIRTIO, @@ -611,6 +699,8 @@ bhyveParseBhyvePCIArg(virDomainDefPtr def, else if (STREQ(emulation, "virtio-net")) bhyveParsePCINet(def, xmlopt, caps, bus, slot, function, VIR_DOMAIN_NET_MODEL_VIRTIO, conf); + else if (STREQ(emulation, "virtio-scsi")) + bhyveParseSCSICTL(def, bus, slot, function, conf); else if (STREQ(emulation, "e1000")) bhyveParsePCINet(def, xmlopt, caps, bus, slot, function, VIR_DOMAIN_NET_MODEL_E1000, conf); diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index 1b0abb21a0..7322eca80c 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -348,6 +348,7 @@ virDomainAuditHostdev(virDomainObjPtr vm, virDomainHost= devDefPtr hostdev, virDomainHostdevSubsysUSBPtr usbsrc =3D &hostdev->source.subsys.u.usb; virDomainHostdevSubsysPCIPtr pcisrc =3D &hostdev->source.subsys.u.pci; virDomainHostdevSubsysSCSIPtr scsisrc =3D &hostdev->source.subsys.u.sc= si; + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &hostdev->source.subsys.u.= scsi_ctl; virDomainHostdevSubsysSCSIVHostPtr hostsrc =3D &hostdev->source.subsys= .u.scsi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &hostdev->source.subs= ys.u.mdev; =20 @@ -387,6 +388,10 @@ virDomainAuditHostdev(virDomainObjPtr vm, virDomainHos= tdevDefPtr hostdev, } break; } + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + address =3D g_strdup_printf("/dev/cam/ctl%u.%u", + ctlsrc->pp, ctlsrc->vp); + break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: address =3D g_strdup(hostsrc->wwpn); break; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cef49df3f8..12f8bb43c0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -898,6 +898,7 @@ VIR_ENUM_IMPL(virDomainHostdevSubsys, "usb", "pci", "scsi", + "scsi_ctl", "scsi_host", "mdev", ); @@ -908,6 +909,7 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend, "kvm", "vfio", "xen", + "vmm", ); =20 VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol, @@ -916,6 +918,18 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol, "iscsi", ); =20 +VIR_ENUM_IMPL(virDomainHostdevSubsysSCSICTLProtocol, + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_LAST, + "none", + "ioctl", +); + +VIR_ENUM_IMPL(virDomainHostdevSubsysSCSICTLModel, + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_LAST, + "default", + "virtio", +); + VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIHostProtocol, VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST, "none", @@ -2958,6 +2972,7 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr = def) break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; @@ -5046,6 +5061,7 @@ virDomainHostdevDefPostParse(virDomainHostdevDefPtr d= ev, =20 case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; @@ -6484,6 +6500,16 @@ virDomainHostdevDefValidate(const virDomainHostdevDe= f *hostdev) return -1; } break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + if (hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NO= NE && + hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UN= ASSIGNED && + hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PC= I) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("SCSI CTL host devices must use 'pci' or " + "'unassigned' address type")); + return -1; + } + break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: if (hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NO= NE && hostdev->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PC= I && @@ -8320,6 +8346,64 @@ virDomainHostdevSubsysSCSIVHostDefParseXML(xmlNodePt= r sourcenode, return 0; } =20 +static int +virDomainHostdevSubsysSCSICTLDefParseXML(xmlNodePtr sourcenode, + virDomainHostdevDefPtr def) +{ + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &def->source.subsys.u.scsi= _ctl; + g_autofree char *protocol =3D NULL; + g_autofree char *pp =3D NULL; + g_autofree char *vp =3D NULL; + + if (!(protocol =3D virXMLPropString(sourcenode, "protocol"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Missing scsi_ctl subsystem protocol")); + return -1; + } + + if ((ctlsrc->protocol =3D + virDomainHostdevSubsysSCSICTLProtocolTypeFromString(protocol)) <= =3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unknown scsi_ctl subsystem protocol '%s'"), + protocol); + return -1; + } + + switch ((virDomainHostdevSubsysSCSICTLProtocolType) ctlsrc->protocol) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_IOCTL: + if (!(pp =3D virXMLPropString(sourcenode, "pp"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing scsi_ctl hostdev source pp")); + return -1; + } + if (virStrToLong_ui(pp, NULL, 10, &ctlsrc->pp) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Cannot parse scsi_ctl hostdev source 'pp' at= tribute")); + return -1; + } + if (!(vp =3D virXMLPropString(sourcenode, "vp"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing scsi_ctl hostdev source vp")); + return -1; + } + if (virStrToLong_ui(vp, NULL, 10, &ctlsrc->vp) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Cannot parse scsi_ctl hostdev source 'vp' at= tribute")); + return -1; + } + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_NONE: + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_LAST: + virReportError(VIR_ERR_XML_ERROR, + _("Invalid hostdev protocol '%s'"), + virDomainHostdevSubsysSCSICTLProtocolTypeToString(c= tlsrc->protocol)); + return -1; + break; + } + + return 0; +} + static int virDomainHostdevSubsysMediatedDevDefParseXML(virDomainHostdevDefPtr def, xmlXPathContextPtr ctxt) @@ -8363,6 +8447,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, int backend; virDomainHostdevSubsysPCIPtr pcisrc =3D &def->source.subsys.u.pci; virDomainHostdevSubsysSCSIPtr scsisrc =3D &def->source.subsys.u.scsi; + virDomainHostdevSubsysSCSICTLPtr scsictlsrc =3D &def->source.subsys.u.= scsi_ctl; virDomainHostdevSubsysSCSIVHostPtr scsihostsrc =3D &def->source.subsys= .u.scsi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &def->source.subsys.u= .mdev; g_autofree char *managed =3D NULL; @@ -8453,6 +8538,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, } =20 if (def->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV && + def->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_C= TL && def->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_H= OST) { if (model) { virReportError(VIR_ERR_XML_ERROR, @@ -8471,6 +8557,14 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, model); return -1; } + } else if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TY= PE_SCSI_CTL) { + if (model && + ((scsictlsrc->model =3D virDomainHostdevSubsysSCSICTLModelType= FromString(model)) < 0)) { + virReportError(VIR_ERR_XML_ERROR, + _("unknown hostdev model '%s'"), + model); + return -1; + } } else if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TY= PE_MDEV) { if (!model) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -8533,10 +8627,16 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, return -1; break; =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + if (virDomainHostdevSubsysSCSICTLDefParseXML(sourcenode, def) < 0) + return -1; + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: if (virDomainHostdevSubsysSCSIVHostDefParseXML(sourcenode, def) < = 0) return -1; break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: if (virDomainHostdevSubsysMediatedDevDefParseXML(def, ctxt) < 0) return -1; @@ -15914,6 +16014,7 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr x= mlopt, =20 case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: @@ -16963,6 +17064,13 @@ virDomainHostdevMatchSubsys(virDomainHostdevDefPtr= a, return virDomainHostdevMatchSubsysSCSIiSCSI(a, b); else return virDomainHostdevMatchSubsysSCSIHost(a, b); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + return ((a->source.subsys.u.scsi_ctl.protocol =3D=3D + b->source.subsys.u.scsi_ctl.protocol) && + (a->source.subsys.u.scsi_ctl.pp =3D=3D + b->source.subsys.u.scsi_ctl.pp) && + (a->source.subsys.u.scsi_ctl.vp =3D=3D + b->source.subsys.u.scsi_ctl.vp)) ? 1 : 0; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: if (a->source.subsys.u.scsi_host.protocol !=3D b->source.subsys.u.scsi_host.protocol) @@ -25354,6 +25462,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, virDomainHostdevSubsysUSBPtr usbsrc =3D &def->source.subsys.u.usb; virDomainHostdevSubsysPCIPtr pcisrc =3D &def->source.subsys.u.pci; virDomainHostdevSubsysSCSIPtr scsisrc =3D &def->source.subsys.u.scsi; + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &def->source.subsys.u.scsi= _ctl; virDomainHostdevSubsysSCSIVHostPtr hostsrc =3D &def->source.subsys.u.s= csi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &def->source.subsys.u= .mdev; virDomainHostdevSubsysSCSIHostPtr scsihostsrc =3D &scsisrc->u.host; @@ -25396,6 +25505,15 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, protocol, iscsisrc->src->path); } =20 + if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI= _CTL) { + const char *protocol =3D + virDomainHostdevSubsysSCSICTLProtocolTypeToString(ctlsrc->prot= ocol); + closedSource =3D true; + + virBufferAsprintf(buf, " protocol=3D'%s' pp=3D'%u' vp=3D'%u'/", + protocol, ctlsrc->pp, ctlsrc->vp); + } + if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI= _HOST) { const char *protocol =3D virDomainHostdevSubsysSCSIHostProtocolTypeToString(hostsrc->pr= otocol); @@ -25457,6 +25575,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, scsihostsrc->unit); } break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: @@ -27560,6 +27679,7 @@ virDomainHostdevDefFormat(virBufferPtr buf, virDomainHostdevSubsysSCSIPtr scsisrc =3D &def->source.subsys.u.scsi; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &def->source.subsys.u= .mdev; virDomainHostdevSubsysSCSIVHostPtr scsihostsrc =3D &def->source.subsys= .u.scsi_host; + virDomainHostdevSubsysSCSICTLPtr scsictlsrc =3D &def->source.subsys.u.= scsi_ctl; const char *type; =20 if (!mode) { @@ -27610,6 +27730,12 @@ virDomainHostdevDefFormat(virBufferPtr buf, virTristateBoolTypeToString(scsisrc->rawio)); } =20 + if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_= SCSI_CTL && + scsictlsrc->model) { + virBufferAsprintf(buf, " model=3D'%s'", + virDomainHostdevSubsysSCSICTLModelTypeToStri= ng(scsictlsrc->model)); + } + if (def->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_= SCSI_HOST && scsihostsrc->model) { virBufferAsprintf(buf, " model=3D'%s'", @@ -31142,6 +31268,11 @@ virDomainNetDefActualToNetworkPort(virDomainDefPtr= dom, port->plug.hostdevpci.driver =3D VIR_NETWORK_FORWARD_DRIVER_NA= ME_VFIO; break; =20 + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unexpected PCI backend 'vmm'")); + break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Unexpected PCI backend 'xen'")); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cdc4d25700..4e0fc01c2b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -195,6 +195,7 @@ typedef enum { VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI, + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV, =20 @@ -203,10 +204,11 @@ typedef enum { =20 /* the backend driver used for PCI hostdev devices */ typedef enum { - VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automatically, prefe= r VFIO */ + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automatically, prefe= r VFIO or VMM */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM, /* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN, /* force legacy xen style, use = pciback */ + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM, /* force vmm (FreeBSD bhyve) */ =20 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPCIBackendType; @@ -258,6 +260,30 @@ struct _virDomainHostdevSubsysSCSI { } u; }; =20 +typedef enum { + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_NONE, + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_IOCTL, + + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_PROTOCOL_TYPE_LAST, +} virDomainHostdevSubsysSCSICTLProtocolType; + +VIR_ENUM_DECL(virDomainHostdevSubsysSCSICTLProtocol); + +typedef enum { + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_DEFAULT, + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_VIRTIO, + + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_CTL_MODEL_TYPE_LAST, +} virDomainHostdevSubsysSCSICTLModelType; + +VIR_ENUM_DECL(virDomainHostdevSubsysSCSICTLModel); + +struct _virDomainHostdevSubsysSCSICTL { + int protocol; /* enum virDomainHostdevSubsysSCSICTLProtocolType */ + unsigned pp, vp; + int model; /* enum virDomainHostdevSubsysSCSICTLModelType */ +}; + struct _virDomainHostdevSubsysMediatedDev { int model; /* enum virMediatedDeviceModelType= */ int display; /* virTristateSwitch */ @@ -298,6 +324,7 @@ struct _virDomainHostdevSubsys { virDomainHostdevSubsysPCI pci; virDomainHostdevSubsysSCSI scsi; virDomainHostdevSubsysSCSIVHost scsi_host; + virDomainHostdevSubsysSCSICTL scsi_ctl; virDomainHostdevSubsysMediatedDev mdev; } u; }; diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 1c62cde251..66cf40f8f0 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -180,6 +180,9 @@ typedef virDomainHostdevSubsysPCI *virDomainHostdevSubs= ysPCIPtr; typedef struct _virDomainHostdevSubsysSCSI virDomainHostdevSubsysSCSI; typedef virDomainHostdevSubsysSCSI *virDomainHostdevSubsysSCSIPtr; =20 +typedef struct _virDomainHostdevSubsysSCSICTL virDomainHostdevSubsysSCSICT= L; +typedef virDomainHostdevSubsysSCSICTL *virDomainHostdevSubsysSCSICTLPtr; + typedef struct _virDomainHostdevSubsysSCSIHost virDomainHostdevSubsysSCSIH= ost; typedef virDomainHostdevSubsysSCSIHost *virDomainHostdevSubsysSCSIHostPtr; =20 diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f69a9e651c..fdd59a35a4 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4677,6 +4677,7 @@ qemuBuildPCIHostdevDevStr(const virDomainDef *def, =20 case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -5439,6 +5440,7 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd, =20 break; =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index af6817cc05..3ebb864b4c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6674,8 +6674,11 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHo= stdevDef *hostdev, return -1; } break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: return qemuDomainMdevDefValidate(hostdev, def, qemuCaps); + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: default: virReportEnumRangeError(virDomainHostdevSubsysType, @@ -14031,6 +14034,8 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev, =20 perm =3D VIR_CGROUP_DEVICE_RW; break; + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; } diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1774850640..0e1432f23d 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -203,6 +203,7 @@ qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostd= evDefPtr *hostdevs, return false; break; =20 + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: break; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 9800491755..94fa64f216 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1576,6 +1576,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: break; =20 + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VMM: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -4535,6 +4536,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: qemuDomainRemoveMediatedDevice(driver, vm, hostdev); break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index a307c5ebe2..93144b741f 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1105,6 +1105,7 @@ qemuMigrationSrcIsAllowedHostdev(const virDomainDef *= def) continue; =20 case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, diff --git a/src/security/security_apparmor.c b/src/security/security_appar= mor.c index ca02631f7f..eadf2580b6 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -959,6 +959,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr m= gr, break; } =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: ret =3D 0; break; diff --git a/src/security/security_dac.c b/src/security/security_dac.c index d75b18170b..de85e53a9a 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1212,6 +1212,7 @@ virSecurityDACSetHostdevLabel(virSecurityManagerPtr m= gr, virDomainHostdevSubsysUSBPtr usbsrc =3D &dev->source.subsys.u.usb; virDomainHostdevSubsysPCIPtr pcisrc =3D &dev->source.subsys.u.pci; virDomainHostdevSubsysSCSIPtr scsisrc =3D &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &dev->source.subsys.u.scsi= _ctl; virDomainHostdevSubsysSCSIVHostPtr hostsrc =3D &dev->source.subsys.u.s= csi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &dev->source.subsys.u= .mdev; int ret =3D -1; @@ -1300,6 +1301,19 @@ virSecurityDACSetHostdevLabel(virSecurityManagerPtr = mgr, break; } =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: { + char *ctldev =3D g_strdup_printf("/dev/cam/ctl%u.%u", + ctlsrc->pp, ctlsrc->vp); + + if (!ctldev) + return -1; + + ret =3D virSecurityDACSetHostdevLabelHelper(ctldev, true, &cbdata); + + VIR_FREE(ctldev); + break; + } + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: { virSCSIVHostDevicePtr host =3D virSCSIVHostDeviceNew(hostsrc->wwpn= ); =20 @@ -1386,6 +1400,7 @@ virSecurityDACRestoreHostdevLabel(virSecurityManagerP= tr mgr, virDomainHostdevSubsysUSBPtr usbsrc =3D &dev->source.subsys.u.usb; virDomainHostdevSubsysPCIPtr pcisrc =3D &dev->source.subsys.u.pci; virDomainHostdevSubsysSCSIPtr scsisrc =3D &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSICTLPtr ctlsrc =3D &dev->source.subsys.u.scsi= _ctl; virDomainHostdevSubsysSCSIVHostPtr hostsrc =3D &dev->source.subsys.u.s= csi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc =3D &dev->source.subsys.u= .mdev; int ret =3D -1; @@ -1463,6 +1478,19 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager= Ptr mgr, break; } =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: { + char *ctldev =3D g_strdup_printf("/dev/cam/ctl%u.%u", + ctlsrc->pp, ctlsrc->vp); + + if (!ctldev) + return -1; + + ret =3D virSecurityDACRestoreFileLabel(mgr, ctldev); + + VIR_FREE(ctldev); + break; + } + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: { virSCSIVHostDevicePtr host =3D virSCSIVHostDeviceNew(hostsrc->wwpn= ); =20 diff --git a/src/security/security_selinux.c b/src/security/security_selinu= x.c index 3f6968a57a..96f483ee14 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -2149,6 +2149,10 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityM= anagerPtr mgr, break; } =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + /* FreeBSD only */ + return -1; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: { virSCSIVHostDevicePtr host =3D virSCSIVHostDeviceNew(hostsrc->wwpn= ); =20 @@ -2384,6 +2388,10 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecur= ityManagerPtr mgr, break; } =20 + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_CTL: + /* FreeBSD only */ + return -1; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: { virSCSIVHostDevicePtr host =3D virSCSIVHostDeviceNew(hostsrc->wwpn= ); =20 diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-passthru.args b/tests/bh= yveargv2xmldata/bhyveargv2xml-passthru.args new file mode 100644 index 0000000000..697bafd642 --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-passthru.args @@ -0,0 +1,8 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-H \ +-P \ +-S \ +-s 0:0,hostbridge \ +-s 0:1:0,passthru,5/0/7 bhyve diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-passthru.xml b/tests/bhy= veargv2xmldata/bhyveargv2xml-passthru.xml new file mode 100644 index 0000000000..af99279448 --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-passthru.xml @@ -0,0 +1,26 @@ + + bhyve + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + + + + 1 + + hvm + + + destroy + destroy + destroy + + + + +
+ +
+ + + diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.args b/tests= /bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.args new file mode 100644 index 0000000000..ae38208853 --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.args @@ -0,0 +1,9 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-H \ +-P \ +-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CODE-devel.fd \ +-s 0:0,hostbridge \ +-s 1:0,lpc \ +-s 2:0,virtio-scsi,/dev/cam/ctl5.0 bhyve diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.xml b/tests/= bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.xml new file mode 100644 index 0000000000..23ad90a2a5 --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-scsi.xml @@ -0,0 +1,20 @@ + + bhyve + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + destroy + destroy + destroy + + + +
+ + + diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index 735cc4b338..1cfe4e3ddb 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -173,6 +173,8 @@ mymain(void) DO_TEST("ahci-hd"); DO_TEST("virtio-blk"); DO_TEST("virtio-net"); + DO_TEST("virtio-scsi"); + DO_TEST("passthru"); DO_TEST("e1000"); DO_TEST_WARN("virtio-net2"); DO_TEST_WARN("virtio-net3"); diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.args b/tests/bh= yvexml2argvdata/bhyvexml2argv-passthru.args new file mode 100644 index 0000000000..c268da957c --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.args @@ -0,0 +1,11 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-S \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CODE-devel.fd \ +-s 0:3:0,passthru,5/0/7 \ +-s 1,lpc bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.ldargs b/tests/= bhyvexml2argvdata/bhyvexml2argv-passthru.ldargs new file mode 100644 index 0000000000..2995a4d0e7 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.ldargs @@ -0,0 +1 @@ +dummy \ No newline at end of file diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.xml b/tests/bhy= vexml2argvdata/bhyvexml2argv-passthru.xml new file mode 100644 index 0000000000..ba0744f35d --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-passthru.xml @@ -0,0 +1,22 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + + + + 1 + + hvm + /usr/local/share/uefi-firmwar= e/BHYVE_UEFI_CODE-devel.fd + + + + + +
+ +
+ + + diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.args b/tests= /bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.args new file mode 100644 index 0000000000..90b82cc02b --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.args @@ -0,0 +1,9 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-H \ +-P \ +-s 0:0,hostbridge \ +-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CODE-devel.fd \ +-s 2:0,virtio-scsi,/dev/cam/ctl5.0 \ +-s 1,lpc bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.ldargs b/tes= ts/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.ldargs new file mode 100644 index 0000000000..421376db9e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.ldargs @@ -0,0 +1 @@ +dummy diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.xml b/tests/= bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.xml new file mode 100644 index 0000000000..394ff20ffc --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-virtio-scsi.xml @@ -0,0 +1,21 @@ + + bhyve + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + /usr/local/share/uefi-firmwar= e/BHYVE_UEFI_CODE-devel.fd + + + destroy + destroy + destroy + + + +
+ + + diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 9e7eb218b8..7ce2d5c6b1 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -175,7 +175,7 @@ mymain(void) driver.bhyvecaps =3D BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \ BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \ BHYVE_CAP_FBUF | BHYVE_CAP_XHCI | \ - BHYVE_CAP_CPUTOPOLOGY; + BHYVE_CAP_CPUTOPOLOGY | BHYVE_CAP_VIRTIOSCSI; =20 DO_TEST("base"); DO_TEST("wired"); @@ -210,6 +210,8 @@ mymain(void) DO_TEST_FAILURE("cputopology-nvcpu-mismatch"); DO_TEST("commandline"); DO_TEST("msrs"); + DO_TEST("virtio-scsi"); + DO_TEST("passthru"); =20 /* Address allocation tests */ DO_TEST("addr-single-sata-disk"); diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-passthru.xml b/tests= /bhyvexml2xmloutdata/bhyvexml2xmlout-passthru.xml new file mode 100644 index 0000000000..0313fa0dfa --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-passthru.xml @@ -0,0 +1,29 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 219136 + + + + 1 + + hvm + /usr/local/share/uefi-firmwar= e/BHYVE_UEFI_CODE-devel.fd + + + + destroy + restart + destroy + + + + + +
+ +
+ + + diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-virtio-scsi.xml b/te= sts/bhyvexml2xmloutdata/bhyvexml2xmlout-virtio-scsi.xml new file mode 100644 index 0000000000..771591689a --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-virtio-scsi.xml @@ -0,0 +1,23 @@ + + bhyve + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + /usr/local/share/uefi-firmwar= e/BHYVE_UEFI_CODE-devel.fd + + + + destroy + destroy + destroy + + + + +
+ + + diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index a0c20a14c1..3a2a46014a 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -83,6 +83,7 @@ mymain(void) DO_TEST_DIFFERENT("acpiapic"); DO_TEST_DIFFERENT("base"); DO_TEST_DIFFERENT("wired"); + DO_TEST_DIFFERENT("passthru"); DO_TEST_DIFFERENT("bhyveload-bootorder"); DO_TEST_DIFFERENT("bhyveload-bootorder1"); DO_TEST_DIFFERENT("bhyveload-bootorder2"); @@ -94,6 +95,7 @@ mymain(void) DO_TEST_DIFFERENT("disk-cdrom"); DO_TEST_DIFFERENT("disk-cdrom-grub"); DO_TEST_DIFFERENT("disk-virtio"); + DO_TEST_DIFFERENT("virtio-scsi"); DO_TEST_DIFFERENT("grub-bootorder"); DO_TEST_DIFFERENT("grub-bootorder2"); DO_TEST_DIFFERENT("grub-defaults"); --=20 2.24.1