From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258418; cv=none; d=zohomail.com; s=zohoarc; b=KHnoAHT3bktt8WQjPfVghJEmp1Pb66IuosfGGQKJZd+aLt15SODSi7Ix6GwnM6M5/tbikkLJtrpre6TjsPXxP0bJ2aoSdXUvK1B8M7Eeal409c6yMcoXae/a6mKB5RB01jFehxD79wEVr22sLhrD0cCoBCRNsVrXFPlO1tN+9cw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258418; 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=2MvZyAvDgf1EBEe4sQRJ3B1FueNuE8XRNEyZLQ/UBJE=; b=IcBAQGK6NGQUYOO9pM0D0rIc2M5q62IyHZ9aLrodbFOPxd3Kv/acNuBLNVEK/mu9sJnPQ6kTx8exfBiuwZYj/CBzxMWZyPCjdd+SopitG9fOEptyZYSMOmk3F+3Uf4Rg/A7YoctmUqjJcZlOasbMhlQgUwiMVYHJuYc7OPY/ZN8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258418645898.6791413883666; Thu, 26 Mar 2020 14:33:38 -0700 (PDT) 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-197-vNqWW1odMZaqYSpuqdOboA-1; Thu, 26 Mar 2020 17:33:35 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 06568801E5C; Thu, 26 Mar 2020 21:33:29 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C7605CDBC1; Thu, 26 Mar 2020 21:33:28 +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 65CDA8A03F; Thu, 26 Mar 2020 21:33:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVk20010198 for ; Thu, 26 Mar 2020 17:31:46 -0400 Received: by smtp.corp.redhat.com (Postfix) id 27CE7120EA4; Thu, 26 Mar 2020 21:31:46 +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 2358B11F4C2 for ; Thu, 26 Mar 2020 21:31:44 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (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 37FAD185A78E for ; Thu, 26 Mar 2020 21:31:44 +0000 (UTC) Received: from mail-qk1-f178.google.com (mail-qk1-f178.google.com [209.85.222.178]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-75-OABZd7RlO9WlYefv1LUs9g-1; Thu, 26 Mar 2020 17:31:40 -0400 Received: by mail-qk1-f178.google.com with SMTP id x3so8678734qki.4; Thu, 26 Mar 2020 14:31:39 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258417; 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=2MvZyAvDgf1EBEe4sQRJ3B1FueNuE8XRNEyZLQ/UBJE=; b=jMtdJsbu65Yt9yRvUVvVMENvLCHx2lpLsX1VLGD2HhYyiZmxdOQj+Jj9MQ/V5dC8VrkGKA o9jep0LtddO6debIcSMZeID8nttUZPj3rIMzvt/6K68LRn9H78znXoc/qRf/oHR8nVbfAb RBYwMEECVdbt/6GurMKTPJT+vIB7IOU= X-MC-Unique: vNqWW1odMZaqYSpuqdOboA-1 X-MC-Unique: OABZd7RlO9WlYefv1LUs9g-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=2g67qBxzBC9oIE9M+901befgmgtu1R6XRqe9Zf0/+Tg=; b=AOSBiYokTNTqIwlACNWuN8MJ3tTlJ13ZCkxo/HaLwFVgDTkdZekged6fnBdCduzmQF W//KKJmpyY6iKRVDv9XeQsh2wmq5YNLH1s2NSIWLCeNC9lAcliT5sO0w5oRjY5vb1h7Y gGPlf1XXexRkzsBR5t4RD0qc1YDCIcvcjrii5d/glPLIUzynOuYCCmL3XPlnManpeDr5 SENW0dsySAtwFv/DePeXQlYqjS2/pfvQAs4UEz7JdA4tmpA7mpMMNLxH1EtbmWrkN+dE zcOBUBXFqLIDh4kxs9nboSGRS2V5Nt1o0zvxZLCQKBQzAbjbfbOlrRNUPv2BnIlb5XGk qBnA== X-Gm-Message-State: ANhLgQ2TRo+AyGU1NTNCt5+brRCtHjgItpS26jJMe6N7JU0fA0uxVNnd ptr2UE4a+M6uzDABBY3EiebiG310 X-Google-Smtp-Source: ADFU+vuDs5xY31jGEdyUNtRtG+gF8CeWKvhuA328bE/TeFe3zC0o/8nhIUkGAZbzoFDKuHQKvsJMpw== X-Received: by 2002:a37:aa54:: with SMTP id t81mr11266097qke.234.1585258298723; Thu, 26 Mar 2020 14:31:38 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 01/15] qemu: introducing qemu_validate.c/h Date: Thu, 26 Mar 2020 18:31:11 -0300 Message-Id: <20200326213125.2306013-2-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVk20010198 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.11 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" While moving validations from qemu_command to qemu_domain, it was suggested that we should instead move them to a new file [1] because qemu_domain is already too crowded. This patch introduces a new file to host such validations from the QEMU driver. And to get things started, let's move qemuDomainDefValidateFeatures() to this new file. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- po/POTFILES.in | 1 + src/qemu/Makefile.inc.am | 2 + src/qemu/qemu_domain.c | 286 +----------------------------------- src/qemu/qemu_validate.c | 310 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 29 ++++ 5 files changed, 344 insertions(+), 284 deletions(-) create mode 100644 src/qemu/qemu_validate.c create mode 100644 src/qemu/qemu_validate.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 6103d4ca4a..c60f355f7f 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -170,6 +170,7 @@ @SRCDIR@/src/qemu/qemu_qapi.c @SRCDIR@/src/qemu/qemu_slirp.c @SRCDIR@/src/qemu/qemu_tpm.c +@SRCDIR@/src/qemu/qemu_validate.c @SRCDIR@/src/qemu/qemu_vhost_user.c @SRCDIR@/src/qemu/qemu_vhost_user_gpu.c @SRCDIR@/src/qemu/qemu_virtiofs.c diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am index 51cd79879d..1291b07124 100644 --- a/src/qemu/Makefile.inc.am +++ b/src/qemu/Makefile.inc.am @@ -73,6 +73,8 @@ QEMU_DRIVER_SOURCES =3D \ qemu/qemu_checkpoint.h \ qemu/qemu_backup.c \ qemu/qemu_backup.h \ + qemu/qemu_validate.c \ + qemu/qemu_validate.h \ $(NULL) =20 =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7d29f3f114..c4f36b000b 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -36,6 +36,7 @@ #include "qemu_extdevice.h" #include "qemu_blockjob.h" #include "qemu_checkpoint.h" +#include "qemu_validate.h" #include "viralloc.h" #include "virlog.h" #include "virerror.h" @@ -5039,289 +5040,6 @@ qemuDomainDefGetVcpuHotplugGranularity(const virDom= ainDef *def) #define QEMU_MAX_VCPUS_WITHOUT_EIM 255 =20 =20 -static int -qemuDomainDefValidatePSeriesFeature(const virDomainDef *def, - virQEMUCapsPtr qemuCaps, - int feature) -{ - const char *str; - - if (def->features[feature] !=3D VIR_TRISTATE_SWITCH_ABSENT && - !qemuDomainIsPSeries(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' feature is not supported for " - "architecture '%s' or machine type '%s'"), - virDomainFeatureTypeToString(feature), - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - - if (def->features[feature] =3D=3D VIR_TRISTATE_SWITCH_ABSENT) - return 0; - - switch (feature) { - case VIR_DOMAIN_FEATURE_HPT: - if (def->features[feature] !=3D VIR_TRISTATE_SWITCH_ON) - break; - - if (def->hpt_resizing !=3D VIR_DOMAIN_HPT_RESIZING_NONE) { - if (!virQEMUCapsGet(qemuCaps, - QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("HTP resizing is not supported by this " - "QEMU binary")); - return -1; - } - - str =3D virDomainHPTResizingTypeToString(def->hpt_resizing); - if (!str) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid setting for HPT resizing")); - return -1; - } - } - - if (def->hpt_maxpagesize > 0 && - !virQEMUCapsGet(qemuCaps, - QEMU_CAPS_MACHINE_PSERIES_CAP_HPT_MAX_PAGE_SIZ= E)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Configuring the page size for HPT guests " - "is not supported by this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_HTM: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("HTM configuration is not supported by this " - "QEMU binary")); - return -1; - } - - str =3D virTristateSwitchTypeToString(def->features[feature]); - if (!str) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid setting for HTM state")); - return -1; - } - - break; - - case VIR_DOMAIN_FEATURE_NESTED_HV: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_NESTED= _HV)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Nested HV configuration is not supported by " - "this QEMU binary")); - return -1; - } - - str =3D virTristateSwitchTypeToString(def->features[feature]); - if (!str) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid setting for nested HV state")); - return -1; - } - - break; - - case VIR_DOMAIN_FEATURE_CCF_ASSIST: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_CCF_AS= SIST)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("ccf-assist configuration is not supported by= " - "this QEMU binary")); - return -1; - } - - str =3D virTristateSwitchTypeToString(def->features[feature]); - if (!str) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid setting for ccf-assist state")); - return -1; - } - - break; - } - - return 0; -} - -static int -qemuDomainDefValidateFeatures(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - size_t i; - - for (i =3D 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { - const char *featureName =3D virDomainFeatureTypeToString(i); - - switch ((virDomainFeature) i) { - case VIR_DOMAIN_FEATURE_IOAPIC: - if (def->features[i] !=3D VIR_DOMAIN_IOAPIC_NONE) { - if (!ARCH_IS_X86(def->os.arch)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' feature is not supported fo= r " - "architecture '%s' or machine type '%= s'"), - featureName, - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQ= CHIP)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("I/O APIC tuning is not supported by " - "this QEMU binary")); - return -1; - } - - switch ((virDomainIOAPIC) def->features[i]) { - case VIR_DOMAIN_IOAPIC_QEMU: - if (!virQEMUCapsGet(qemuCaps, - QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_S= PLIT)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("split I/O APIC is not supported = by this " - "QEMU binary")); - return -1; - } - break; - case VIR_DOMAIN_IOAPIC_KVM: - case VIR_DOMAIN_IOAPIC_NONE: - case VIR_DOMAIN_IOAPIC_LAST: - break; - } - } - break; - - case VIR_DOMAIN_FEATURE_HPT: - case VIR_DOMAIN_FEATURE_HTM: - case VIR_DOMAIN_FEATURE_NESTED_HV: - case VIR_DOMAIN_FEATURE_CCF_ASSIST: - if (qemuDomainDefValidatePSeriesFeature(def, qemuCaps, i) < 0) - return -1; - break; - - case VIR_DOMAIN_FEATURE_GIC: - if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_ON && - !qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' feature is not supported for " - "architecture '%s' or machine type '%s'"), - featureName, - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_SMM: - if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_SMM_OPT)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("smm is not available with this QEMU bina= ry")); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_KVM: - if (def->kvm_features[VIR_DOMAIN_KVM_DEDICATED] =3D=3D VIR_TRI= STATE_SWITCH_ON && - (!def->cpu || def->cpu->mode !=3D VIR_CPU_MODE_HOST_PASSTH= ROUGH)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("kvm-hint-dedicated=3Don is only applicab= le " - "for cpu host-passthrough")); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_VMPORT: - if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsSupportsVmport(qemuCaps, def)) { - - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vmport is not available " - "with this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_VMCOREINFO: - if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_ON && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vmcoreinfo is not available " - "with this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_APIC: - /* The kvm_pv_eoi feature is x86-only. */ - if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && - def->apic_eoi !=3D VIR_TRISTATE_SWITCH_ABSENT && - !ARCH_IS_X86(def->os.arch)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The 'eoi' attribute of the '%s' feature " - "is not supported for architecture '%s' o= r " - "machine type '%s'"), - featureName, - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_PVSPINLOCK: - if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && - !ARCH_IS_X86(def->os.arch)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' feature is not supported for " - "architecture '%s' or machine type '%s'"), - featureName, - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_HYPERV: - if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && - !ARCH_IS_X86(def->os.arch) && !qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Hyperv features are not supported for " - "architecture '%s' or machine type '%s'"), - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_PMU: - if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_OFF && - ARCH_IS_PPC64(def->os.arch)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("PMU is always enabled for architecture '= %s'"), - virArchToString(def->os.arch)); - return -1; - } - break; - - case VIR_DOMAIN_FEATURE_ACPI: - case VIR_DOMAIN_FEATURE_PAE: - case VIR_DOMAIN_FEATURE_HAP: - case VIR_DOMAIN_FEATURE_VIRIDIAN: - case VIR_DOMAIN_FEATURE_PRIVNET: - case VIR_DOMAIN_FEATURE_CAPABILITIES: - case VIR_DOMAIN_FEATURE_MSRS: - case VIR_DOMAIN_FEATURE_LAST: - break; - } - } - - return 0; -} - - static int qemuDomainDefValidateMemory(const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -6036,7 +5754,7 @@ qemuDomainDefValidate(const virDomainDef *def, return -1; } =20 - if (qemuDomainDefValidateFeatures(def, qemuCaps) < 0) + if (qemuValidateDomainDefFeatures(def, qemuCaps) < 0) return -1; =20 if (qemuDomainDefValidateMemory(def, qemuCaps) < 0) diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c new file mode 100644 index 0000000000..8f4c5af582 --- /dev/null +++ b/src/qemu/qemu_validate.c @@ -0,0 +1,310 @@ +/* + * qemu_validate.c: QEMU general validation functions + * + * Copyright IBM Corp, 2020 + * + * 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 + * License along with this library. If not, see + * . + */ + +#include + +#include "qemu_validate.h" +#include "qemu_domain.h" + +#define VIR_FROM_THIS VIR_FROM_QEMU + + +static int +qemuValidateDomainDefPSeriesFeature(const virDomainDef *def, + virQEMUCapsPtr qemuCaps, + int feature) +{ + const char *str; + + if (def->features[feature] !=3D VIR_TRISTATE_SWITCH_ABSENT && + !qemuDomainIsPSeries(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is not supported for " + "architecture '%s' or machine type '%s'"), + virDomainFeatureTypeToString(feature), + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + + if (def->features[feature] =3D=3D VIR_TRISTATE_SWITCH_ABSENT) + return 0; + + switch (feature) { + case VIR_DOMAIN_FEATURE_HPT: + if (def->features[feature] !=3D VIR_TRISTATE_SWITCH_ON) + break; + + if (def->hpt_resizing !=3D VIR_DOMAIN_HPT_RESIZING_NONE) { + if (!virQEMUCapsGet(qemuCaps, + QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("HTP resizing is not supported by this " + "QEMU binary")); + return -1; + } + + str =3D virDomainHPTResizingTypeToString(def->hpt_resizing); + if (!str) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid setting for HPT resizing")); + return -1; + } + } + + if (def->hpt_maxpagesize > 0 && + !virQEMUCapsGet(qemuCaps, + QEMU_CAPS_MACHINE_PSERIES_CAP_HPT_MAX_PAGE_SIZ= E)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Configuring the page size for HPT guests " + "is not supported by this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_HTM: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("HTM configuration is not supported by this " + "QEMU binary")); + return -1; + } + + str =3D virTristateSwitchTypeToString(def->features[feature]); + if (!str) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid setting for HTM state")); + return -1; + } + + break; + + case VIR_DOMAIN_FEATURE_NESTED_HV: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_NESTED= _HV)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Nested HV configuration is not supported by " + "this QEMU binary")); + return -1; + } + + str =3D virTristateSwitchTypeToString(def->features[feature]); + if (!str) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid setting for nested HV state")); + return -1; + } + + break; + + case VIR_DOMAIN_FEATURE_CCF_ASSIST: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_CCF_AS= SIST)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("ccf-assist configuration is not supported by= " + "this QEMU binary")); + return -1; + } + + str =3D virTristateSwitchTypeToString(def->features[feature]); + if (!str) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid setting for ccf-assist state")); + return -1; + } + + break; + } + + return 0; +} + + +int +qemuValidateDomainDefFeatures(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + for (i =3D 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { + const char *featureName =3D virDomainFeatureTypeToString(i); + + switch ((virDomainFeature) i) { + case VIR_DOMAIN_FEATURE_IOAPIC: + if (def->features[i] !=3D VIR_DOMAIN_IOAPIC_NONE) { + if (!ARCH_IS_X86(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is not supported fo= r " + "architecture '%s' or machine type '%= s'"), + featureName, + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQ= CHIP)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("I/O APIC tuning is not supported by " + "this QEMU binary")); + return -1; + } + + switch ((virDomainIOAPIC) def->features[i]) { + case VIR_DOMAIN_IOAPIC_QEMU: + if (!virQEMUCapsGet(qemuCaps, + QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_S= PLIT)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("split I/O APIC is not supported = by this " + "QEMU binary")); + return -1; + } + break; + case VIR_DOMAIN_IOAPIC_KVM: + case VIR_DOMAIN_IOAPIC_NONE: + case VIR_DOMAIN_IOAPIC_LAST: + break; + } + } + break; + + case VIR_DOMAIN_FEATURE_HPT: + case VIR_DOMAIN_FEATURE_HTM: + case VIR_DOMAIN_FEATURE_NESTED_HV: + case VIR_DOMAIN_FEATURE_CCF_ASSIST: + if (qemuValidateDomainDefPSeriesFeature(def, qemuCaps, i) < 0) + return -1; + break; + + case VIR_DOMAIN_FEATURE_GIC: + if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_ON && + !qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is not supported for " + "architecture '%s' or machine type '%s'"), + featureName, + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_SMM: + if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_SMM_OPT)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("smm is not available with this QEMU bina= ry")); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_KVM: + if (def->kvm_features[VIR_DOMAIN_KVM_DEDICATED] =3D=3D VIR_TRI= STATE_SWITCH_ON && + (!def->cpu || def->cpu->mode !=3D VIR_CPU_MODE_HOST_PASSTH= ROUGH)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("kvm-hint-dedicated=3Don is only applicab= le " + "for cpu host-passthrough")); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_VMPORT: + if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsSupportsVmport(qemuCaps, def)) { + + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vmport is not available " + "with this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_VMCOREINFO: + if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_ON && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vmcoreinfo is not available " + "with this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_APIC: + /* The kvm_pv_eoi feature is x86-only. */ + if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && + def->apic_eoi !=3D VIR_TRISTATE_SWITCH_ABSENT && + !ARCH_IS_X86(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The 'eoi' attribute of the '%s' feature " + "is not supported for architecture '%s' o= r " + "machine type '%s'"), + featureName, + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_PVSPINLOCK: + if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && + !ARCH_IS_X86(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is not supported for " + "architecture '%s' or machine type '%s'"), + featureName, + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_HYPERV: + if (def->features[i] !=3D VIR_TRISTATE_SWITCH_ABSENT && + !ARCH_IS_X86(def->os.arch) && !qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Hyperv features are not supported for " + "architecture '%s' or machine type '%s'"), + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_PMU: + if (def->features[i] =3D=3D VIR_TRISTATE_SWITCH_OFF && + ARCH_IS_PPC64(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("PMU is always enabled for architecture '= %s'"), + virArchToString(def->os.arch)); + return -1; + } + break; + + case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_HAP: + case VIR_DOMAIN_FEATURE_VIRIDIAN: + case VIR_DOMAIN_FEATURE_PRIVNET: + case VIR_DOMAIN_FEATURE_CAPABILITIES: + case VIR_DOMAIN_FEATURE_MSRS: + case VIR_DOMAIN_FEATURE_LAST: + break; + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h new file mode 100644 index 0000000000..ed269f29e4 --- /dev/null +++ b/src/qemu/qemu_validate.h @@ -0,0 +1,29 @@ +/* + * qemu_validate.h: QEMU general validation functions + * + * Copyright IBM Corp, 2020 + * + * 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 + * License along with this library. If not, see + * . + */ + +#pragma once + +#include + +#include "domain_conf.h" +#include "qemu_capabilities.h" + +int qemuValidateDomainDefFeatures(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258331; cv=none; d=zohomail.com; s=zohoarc; b=bz6q4iugpWfPwfzv8JhZoo0SPDKvsu/n4Nh0eUb13bZ531Pyz2vXDdbgk7zETGMtLAjzk6LXcRhVRFR4uax4HbEgPrmQNEfMwaSIh6eTm9q00cQtkB7CgscIK/pE8gReIBbXug3b9AnnbbVYfEbM9Lbp/OUxjN7nsi2Kd24nvOs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258331; 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=ayV0l62Q8KPQCFmqBo6Sd5H78GrW0wE1PNG+e/zlhYA=; b=SXoZThSGF9FkrsYudkuK3NSsT1wH42j0N5J8F/aNIeXwudWdmSu/U5OtL+uOy9ZG0R9lGPIYYe+vVK5Cvzd2hI3B8QKaBcHQXApb2m744SGAy/mZ6muqBhv53OoxyVqVeuElkjqqpm8mTyYUnIf/ABSKjrtwuRvZCGwgbdCfdDQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258331395213.29170586449402; Thu, 26 Mar 2020 14:32:11 -0700 (PDT) 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-14-RmtrYMGHO6iQt_iDdn9WtA-1; Thu, 26 Mar 2020 17:32:07 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1B594107ACCD; Thu, 26 Mar 2020 21:32:01 +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 B6A0B92F9D; Thu, 26 Mar 2020 21:31:59 +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 779B218089C8; Thu, 26 Mar 2020 21:31:52 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVjQ1010192 for ; Thu, 26 Mar 2020 17:31:45 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4B453105541B; Thu, 26 Mar 2020 21:31:45 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 462EF1055419 for ; Thu, 26 Mar 2020 21:31:45 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (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 239928007B3 for ; Thu, 26 Mar 2020 21:31:45 +0000 (UTC) Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-309-koCEsV4XNcSCVP8_GWeffw-1; Thu, 26 Mar 2020 17:31:42 -0400 Received: by mail-qt1-f182.google.com with SMTP id z24so5655669qtu.4; Thu, 26 Mar 2020 14:31:42 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258330; 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=ayV0l62Q8KPQCFmqBo6Sd5H78GrW0wE1PNG+e/zlhYA=; b=Fmefje+x6bIQC+bPrLIbrEJwwYyfbHZ1raq+RfJd3ZUTOKWdpbSQCNb5Q27YQZ1kJJI84H wnHpUJ+Ibf7TKWJtv9NDBIvliESA+HRElBHq8a3TlKmvOokxx1Ul7R91JxZjxKRr0xFiS7 rq5vG+l/iFAu8PmtdgWRicqKHFsv9cM= X-MC-Unique: RmtrYMGHO6iQt_iDdn9WtA-1 X-MC-Unique: koCEsV4XNcSCVP8_GWeffw-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=Um06ZuyQqtgms0Y1NACqaqelcRysPmcV24Lg0gtw7Qg=; b=q/eI2yITe3IVh9l6utiKTFkc9cHDcRuXBFwc7i55ckMlnbVXT1dM/Nq+RrPgb3sDMj 3k8FbGVY3rXTJ3EIlF3dRLQyTjHcY4f0cXOGQUjaaTEvy0GEhv7XJDwHzGPQzg3UdKJw lE1smmy8XPwVUnLlQ1I0QOmwDgEDURVIUA60tkNM/oUEwoNoo3fVZsHTpGthOdkAkbmw 7b3VvPwQGlf5Y8j7tistTmrzCc4+ukmIPJ/XsiI7bPWBIH8IMDEQ7p/WXw1dNCc1BiRU L/NcNVIX53vrvA3oXPmC9lr7ZuCCk5qMamFEiCbV7kV+YeUV4hEowl0OA1CL7c3aUhyu /iKA== X-Gm-Message-State: ANhLgQ1OIpzY4c3TmUg3dCFtgqvi3toHENz6qbvfNbHW5aWo6lYZ+R0r qG2cqraXdKUvfB1eEX5b2/xVMBX5 X-Google-Smtp-Source: ADFU+vvYJnvxmyPX6q31+cbHR98rx0ltJ7oHChBBv7TjDDVtew0s2Kr7b6Cy58TNETwXImLbGeZFKw== X-Received: by 2002:ac8:18a7:: with SMTP id s36mr6554958qtj.389.1585258300954; Thu, 26 Mar 2020 14:31:40 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 02/15] qemu: move static functions of qemuDomainDefValidate() Date: Thu, 26 Mar 2020 18:31:12 -0300 Message-Id: <20200326213125.2306013-3-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVjQ1010192 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.13 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" We're going to move qemuDomainDefValidate() to qemu_validate.c in two steps. First steps is to finish up moving all static functions qemuDomainDefValidate() uses, then in the next patch we can move the function itself. Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.c | 394 +-------------------------------------- src/qemu/qemu_validate.c | 381 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 16 ++ 3 files changed, 404 insertions(+), 387 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index c4f36b000b..413ce4a2dc 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5040,148 +5040,6 @@ qemuDomainDefGetVcpuHotplugGranularity(const virDom= ainDef *def) #define QEMU_MAX_VCPUS_WITHOUT_EIM 255 =20 =20 -static int -qemuDomainDefValidateMemory(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const long system_page_size =3D virGetSystemPageSizeKB(); - const virDomainMemtune *mem =3D &def->mem; - - if (mem->nhugepages =3D=3D 0) - return 0; - - if (mem->allocation =3D=3D VIR_DOMAIN_MEMORY_ALLOCATION_ONDEMAND) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("hugepages are not allowed with memory " - "allocation ondemand")); - return -1; - } - - if (mem->source =3D=3D VIR_DOMAIN_MEMORY_SOURCE_ANONYMOUS) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("hugepages are not allowed with anonymous " - "memory source")); - return -1; - } - - if (mem->source =3D=3D VIR_DOMAIN_MEMORY_SOURCE_MEMFD && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_MEMFD_HUGETLB)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("hugepages is not supported with memfd memory sou= rce")); - return -1; - } - - /* We can't guarantee any other mem.access - * if no guest NUMA nodes are defined. */ - if (mem->hugepages[0].size !=3D system_page_size && - virDomainNumaGetNodeCount(def->numa) =3D=3D 0 && - mem->access !=3D VIR_DOMAIN_MEMORY_ACCESS_DEFAULT && - mem->access !=3D VIR_DOMAIN_MEMORY_ACCESS_PRIVATE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("memory access mode '%s' not supported " - "without guest numa node"), - virDomainMemoryAccessTypeToString(mem->access)); - return -1; - } - - if (mem->nosharepages && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_MERGE= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("disable shared memory is not available " - "with this QEMU binary")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDefValidateNuma(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const long system_page_size =3D virGetSystemPageSizeKB(); - size_t ncells =3D virDomainNumaGetNodeCount(def->numa); - size_t i; - bool hasMemoryCap =3D virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY= _RAM) || - virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_F= ILE) || - virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_M= EMFD); - - if (virDomainNumatuneHasPerNodeBinding(def->numa) && !hasMemoryCap) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Per-node memory binding is not supported " - "with this QEMU")); - return -1; - } - - if (def->mem.nhugepages && - def->mem.hugepages[0].size !=3D system_page_size && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("huge pages per NUMA node are not " - "supported with this QEMU")); - return -1; - } - - for (i =3D 0; i < ncells; i++) { - g_autofree char * cpumask =3D NULL; - - if (!hasMemoryCap && - virDomainNumaGetNodeMemoryAccessMode(def->numa, i)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Shared memory mapping is not supported " - "with this QEMU")); - return -1; - } - - if (!(cpumask =3D virBitmapFormat(virDomainNumaGetNodeCpumask(def-= >numa, i)))) - return -1; - - if (strchr(cpumask, ',') && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("disjoint NUMA cpu ranges are not supported " - "with this QEMU")); - return -1; - } - - } - - if (virDomainNumaNodesDistancesAreBeingSet(def->numa) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("setting NUMA distances is not " - "supported with this qemu")); - return -1; - } - - return 0; -} - - -static int -qemuDomainValidateCpuCount(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - unsigned int maxCpus =3D virQEMUCapsGetMachineMaxCpus(qemuCaps, def->v= irtType, - def->os.machine); - - if (virDomainDefGetVcpus(def) =3D=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Domain requires at least 1 vCPU")); - return -1; - } - - if (maxCpus > 0 && virDomainDefGetVcpusMax(def) > maxCpus) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Maximum CPUs greater than specified machine " - "type limit %u"), maxCpus); - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidateNVRAM(virDomainNVRAMDefPtr nvram, const virDomainDef *def, @@ -5236,244 +5094,6 @@ qemuDomainDeviceDefValidateHub(virDomainHubDefPtr h= ub, } =20 =20 -static int -qemuDomainDefValidateClockTimers(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - size_t i; - - for (i =3D 0; i < def->clock.ntimers; i++) { - virDomainTimerDefPtr timer =3D def->clock.timers[i]; - - switch ((virDomainTimerNameType)timer->name) { - case VIR_DOMAIN_TIMER_NAME_PLATFORM: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported timer type (name) '%s'"), - virDomainTimerNameTypeToString(timer->name)); - return -1; - - case VIR_DOMAIN_TIMER_NAME_TSC: - case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: - case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK: - case VIR_DOMAIN_TIMER_NAME_LAST: - break; - - case VIR_DOMAIN_TIMER_NAME_RTC: - switch (timer->track) { - case -1: /* unspecified - use hypervisor default */ - case VIR_DOMAIN_TIMER_TRACK_GUEST: - case VIR_DOMAIN_TIMER_TRACK_WALL: - break; - case VIR_DOMAIN_TIMER_TRACK_BOOT: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported rtc timer track '%s'"), - virDomainTimerTrackTypeToString(timer->trac= k)); - return -1; - } - - switch (timer->tickpolicy) { - case -1: - case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: - /* This is the default - missed ticks delivered when - next scheduled, at normal rate */ - break; - case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: - /* deliver ticks at a faster rate until caught up */ - break; - case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: - case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported rtc timer tickpolicy '%s'"), - virDomainTimerTickpolicyTypeToString( - timer->tickpolicy)); - return -1; - } - break; - - case VIR_DOMAIN_TIMER_NAME_PIT: - switch (timer->tickpolicy) { - case -1: - case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: - case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: - break; - case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM_PIT_TICK_POLIC= Y)) { - /* can't catchup if we don't have kvm-pit */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported pit tickpolicy '%s'"), - virDomainTimerTickpolicyTypeToString( - timer->tickpolicy)); - return -1; - } - break; - case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: - /* no way to support this mode for pit in qemu */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported pit tickpolicy '%s'"), - virDomainTimerTickpolicyTypeToString( - timer->tickpolicy)); - return -1; - } - break; - - case VIR_DOMAIN_TIMER_NAME_HPET: - /* no hpet timer available. The only possible action - is to raise an error if present=3D"yes" */ - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_HPET) && - timer->present =3D=3D 1) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("hpet timer is not supported")); - return -1; - } - break; - - case VIR_DOMAIN_TIMER_NAME_ARMVTIMER: - if (def->virtType !=3D VIR_DOMAIN_VIRT_KVM || - !qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Configuring the '%s' timer is not suppor= ted " - "for virtType=3D%s arch=3D%s machine=3D%s= guests"), - virDomainTimerNameTypeToString(timer->name), - virDomainVirtTypeToString(def->virtType), - virArchToString(def->os.arch), - def->os.machine); - return -1; - } - if (timer->present =3D=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' timer can't be disabled"), - virDomainTimerNameTypeToString(timer->name)= ); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_KVM_NO_ADJVTIME)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Configuring the '%s' timer is not suppor= ted " - "with this QEMU binary"), - virDomainTimerNameTypeToString(timer->name)= ); - return -1; - } - - switch (timer->tickpolicy) { - case -1: - case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: - case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: - break; - case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: - case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' timer does not support tickpoli= cy '%s'"), - virDomainTimerNameTypeToString(timer->name), - virDomainTimerTickpolicyTypeToString(timer-= >tickpolicy)); - return -1; - } - break; - } - } - - return 0; -} - - -static int -qemuDomainDefValidatePM(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - bool q35Dom =3D qemuDomainIsQ35(def); - - if (def->pm.s3) { - bool q35ICH9_S3 =3D q35Dom && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_DISABLE_= S3); - - if (!q35ICH9_S3 && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX_DISABL= E_S3)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("setting ACPI S3 not supported")); - return -1; - } - } - - if (def->pm.s4) { - bool q35ICH9_S4 =3D q35Dom && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_DISABLE_= S4); - - if (!q35ICH9_S4 && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX_DISABL= E_S4)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("setting ACPI S4 not supported")); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainDefValidateBoot(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (def->os.bios.rt_set) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_REBOOT_TIMEOUT)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("reboot timeout is not supported " - "by this QEMU binary")); - return -1; - } - } - - if (def->os.bm_timeout_set) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPLASH_TIMEOUT)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("splash timeout is not supported " - "by this QEMU binary")); - return -1; - } - } - - return 0; -} - -static int -qemuDomainDefValidateConsole(const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - size_t i; - - /* Explicit console devices */ - for (i =3D 0; i < def->nconsoles; i++) { - virDomainChrDefPtr console =3D def->consoles[i]; - - switch (console->targetType) { - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCLPCONSOLE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("sclpconsole is not supported in this QEM= U binary")); - return -1; - } - break; - - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCLPLMCONSOLE))= { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("sclplmconsole is not supported in this Q= EMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL: - break; - - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported console target type %s"), - NULLSTR(virDomainChrConsoleTargetTypeToString(c= onsole->targetType))); - return -1; - } - } - - return 0; -} - - static int qemuSoundCodecTypeToCaps(int type) { @@ -5680,13 +5300,13 @@ qemuDomainDefValidate(const virDomainDef *def, } } =20 - if (qemuDomainDefValidateClockTimers(def, qemuCaps) < 0) + if (qemuValidateDomainDefClockTimers(def, qemuCaps) < 0) return -1; =20 - if (qemuDomainDefValidatePM(def, qemuCaps) < 0) + if (qemuValidateDomainDefPM(def, qemuCaps) < 0) return -1; =20 - if (qemuDomainDefValidateBoot(def, qemuCaps) < 0) + if (qemuValidateDomainDefBoot(def, qemuCaps) < 0) return -1; =20 /* QEMU 2.7 (detected via the availability of query-hotpluggable-cpus) @@ -5726,7 +5346,7 @@ qemuDomainDefValidate(const virDomainDef *def, } } =20 - if (qemuDomainValidateCpuCount(def, qemuCaps) < 0) + if (qemuValidateDomainCpuCount(def, qemuCaps) < 0) return -1; =20 if (ARCH_IS_X86(def->os.arch) && @@ -5757,13 +5377,13 @@ qemuDomainDefValidate(const virDomainDef *def, if (qemuValidateDomainDefFeatures(def, qemuCaps) < 0) return -1; =20 - if (qemuDomainDefValidateMemory(def, qemuCaps) < 0) + if (qemuValidateDomainDefMemory(def, qemuCaps) < 0) return -1; =20 - if (qemuDomainDefValidateNuma(def, qemuCaps) < 0) + if (qemuValidateDomainDefNuma(def, qemuCaps) < 0) return -1; =20 - if (qemuDomainDefValidateConsole(def, qemuCaps) < 0) + if (qemuValidateDomainDefConsole(def, qemuCaps) < 0) return -1; =20 if (cfg->vncTLS && cfg->vncTLSx509secretUUID && diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 8f4c5af582..b2a8c3c0b5 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -22,6 +22,7 @@ =20 #include "qemu_validate.h" #include "qemu_domain.h" +#include "virutil.h" =20 #define VIR_FROM_THIS VIR_FROM_QEMU =20 @@ -308,3 +309,383 @@ qemuValidateDomainDefFeatures(const virDomainDef *def, =20 return 0; } + + +int +qemuValidateDomainDefClockTimers(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + for (i =3D 0; i < def->clock.ntimers; i++) { + virDomainTimerDefPtr timer =3D def->clock.timers[i]; + + switch ((virDomainTimerNameType)timer->name) { + case VIR_DOMAIN_TIMER_NAME_PLATFORM: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported timer type (name) '%s'"), + virDomainTimerNameTypeToString(timer->name)); + return -1; + + case VIR_DOMAIN_TIMER_NAME_TSC: + case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: + case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK: + case VIR_DOMAIN_TIMER_NAME_LAST: + break; + + case VIR_DOMAIN_TIMER_NAME_RTC: + switch (timer->track) { + case -1: /* unspecified - use hypervisor default */ + case VIR_DOMAIN_TIMER_TRACK_GUEST: + case VIR_DOMAIN_TIMER_TRACK_WALL: + break; + case VIR_DOMAIN_TIMER_TRACK_BOOT: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported rtc timer track '%s'"), + virDomainTimerTrackTypeToString(timer->trac= k)); + return -1; + } + + switch (timer->tickpolicy) { + case -1: + case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: + /* This is the default - missed ticks delivered when + next scheduled, at normal rate */ + break; + case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: + /* deliver ticks at a faster rate until caught up */ + break; + case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: + case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported rtc timer tickpolicy '%s'"), + virDomainTimerTickpolicyTypeToString( + timer->tickpolicy)); + return -1; + } + break; + + case VIR_DOMAIN_TIMER_NAME_PIT: + switch (timer->tickpolicy) { + case -1: + case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: + case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: + break; + case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM_PIT_TICK_POLIC= Y)) { + /* can't catchup if we don't have kvm-pit */ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported pit tickpolicy '%s'"), + virDomainTimerTickpolicyTypeToString( + timer->tickpolicy)); + return -1; + } + break; + case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: + /* no way to support this mode for pit in qemu */ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported pit tickpolicy '%s'"), + virDomainTimerTickpolicyTypeToString( + timer->tickpolicy)); + return -1; + } + break; + + case VIR_DOMAIN_TIMER_NAME_HPET: + /* no hpet timer available. The only possible action + is to raise an error if present=3D"yes" */ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_HPET) && + timer->present =3D=3D 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("hpet timer is not supported")); + return -1; + } + break; + + case VIR_DOMAIN_TIMER_NAME_ARMVTIMER: + if (def->virtType !=3D VIR_DOMAIN_VIRT_KVM || + !qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Configuring the '%s' timer is not suppor= ted " + "for virtType=3D%s arch=3D%s machine=3D%s= guests"), + virDomainTimerNameTypeToString(timer->name), + virDomainVirtTypeToString(def->virtType), + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + if (timer->present =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' timer can't be disabled"), + virDomainTimerNameTypeToString(timer->name)= ); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_KVM_NO_ADJVTIME)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Configuring the '%s' timer is not suppor= ted " + "with this QEMU binary"), + virDomainTimerNameTypeToString(timer->name)= ); + return -1; + } + + switch (timer->tickpolicy) { + case -1: + case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY: + case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: + break; + case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: + case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' timer does not support tickpoli= cy '%s'"), + virDomainTimerNameTypeToString(timer->name), + virDomainTimerTickpolicyTypeToString(timer-= >tickpolicy)); + return -1; + } + break; + } + } + + return 0; +} + + +int +qemuValidateDomainDefPM(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + bool q35Dom =3D qemuDomainIsQ35(def); + + if (def->pm.s3) { + bool q35ICH9_S3 =3D q35Dom && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_DISABLE_= S3); + + if (!q35ICH9_S3 && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX_DISABL= E_S3)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("setting ACPI S3 not supported")); + return -1; + } + } + + if (def->pm.s4) { + bool q35ICH9_S4 =3D q35Dom && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_DISABLE_= S4); + + if (!q35ICH9_S4 && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX_DISABL= E_S4)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("setting ACPI S4 not supported")); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainDefBoot(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (def->os.bios.rt_set) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_REBOOT_TIMEOUT)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("reboot timeout is not supported " + "by this QEMU binary")); + return -1; + } + } + + if (def->os.bm_timeout_set) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPLASH_TIMEOUT)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("splash timeout is not supported " + "by this QEMU binary")); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainCpuCount(const virDomainDef *def, virQEMUCapsPtr qemuCap= s) +{ + unsigned int maxCpus =3D virQEMUCapsGetMachineMaxCpus(qemuCaps, def->v= irtType, + def->os.machine); + + if (virDomainDefGetVcpus(def) =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Domain requires at least 1 vCPU")); + return -1; + } + + if (maxCpus > 0 && virDomainDefGetVcpusMax(def) > maxCpus) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Maximum CPUs greater than specified machine " + "type limit %u"), maxCpus); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDefMemory(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const long system_page_size =3D virGetSystemPageSizeKB(); + const virDomainMemtune *mem =3D &def->mem; + + if (mem->nhugepages =3D=3D 0) + return 0; + + if (mem->allocation =3D=3D VIR_DOMAIN_MEMORY_ALLOCATION_ONDEMAND) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("hugepages are not allowed with memory " + "allocation ondemand")); + return -1; + } + + if (mem->source =3D=3D VIR_DOMAIN_MEMORY_SOURCE_ANONYMOUS) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("hugepages are not allowed with anonymous " + "memory source")); + return -1; + } + + if (mem->source =3D=3D VIR_DOMAIN_MEMORY_SOURCE_MEMFD && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_MEMFD_HUGETLB)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("hugepages is not supported with memfd memory sou= rce")); + return -1; + } + + /* We can't guarantee any other mem.access + * if no guest NUMA nodes are defined. */ + if (mem->hugepages[0].size !=3D system_page_size && + virDomainNumaGetNodeCount(def->numa) =3D=3D 0 && + mem->access !=3D VIR_DOMAIN_MEMORY_ACCESS_DEFAULT && + mem->access !=3D VIR_DOMAIN_MEMORY_ACCESS_PRIVATE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("memory access mode '%s' not supported " + "without guest numa node"), + virDomainMemoryAccessTypeToString(mem->access)); + return -1; + } + + if (mem->nosharepages && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_MERGE= )) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disable shared memory is not available " + "with this QEMU binary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDefNuma(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const long system_page_size =3D virGetSystemPageSizeKB(); + size_t ncells =3D virDomainNumaGetNodeCount(def->numa); + size_t i; + bool hasMemoryCap =3D virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY= _RAM) || + virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_F= ILE) || + virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_M= EMFD); + + if (virDomainNumatuneHasPerNodeBinding(def->numa) && !hasMemoryCap) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Per-node memory binding is not supported " + "with this QEMU")); + return -1; + } + + if (def->mem.nhugepages && + def->mem.hugepages[0].size !=3D system_page_size && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("huge pages per NUMA node are not " + "supported with this QEMU")); + return -1; + } + + for (i =3D 0; i < ncells; i++) { + g_autofree char * cpumask =3D NULL; + + if (!hasMemoryCap && + virDomainNumaGetNodeMemoryAccessMode(def->numa, i)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Shared memory mapping is not supported " + "with this QEMU")); + return -1; + } + + if (!(cpumask =3D virBitmapFormat(virDomainNumaGetNodeCpumask(def-= >numa, i)))) + return -1; + + if (strchr(cpumask, ',') && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disjoint NUMA cpu ranges are not supported " + "with this QEMU")); + return -1; + } + + } + + if (virDomainNumaNodesDistancesAreBeingSet(def->numa) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("setting NUMA distances is not " + "supported with this qemu")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDefConsole(const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + /* Explicit console devices */ + for (i =3D 0; i < def->nconsoles; i++) { + virDomainChrDefPtr console =3D def->consoles[i]; + + switch (console->targetType) { + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCLPCONSOLE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("sclpconsole is not supported in this QEM= U binary")); + return -1; + } + break; + + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCLPLMCONSOLE))= { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("sclplmconsole is not supported in this Q= EMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL: + break; + + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported console target type %s"), + NULLSTR(virDomainChrConsoleTargetTypeToString(c= onsole->targetType))); + return -1; + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index ed269f29e4..85d1bc07cb 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -27,3 +27,19 @@ =20 int qemuValidateDomainDefFeatures(const virDomainDef *def, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefClockTimers(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefPM(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefBoot(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainCpuCount(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainCpuCount(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefMemory(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefNuma(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDefConsole(const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258345; cv=none; d=zohomail.com; s=zohoarc; b=eHRc2QbUXnGQ9tgs4oE/4M72EclAqaioWwkH8mPYVZ33vQLhGkhgOeS/7W4dsJAIZwVNf/6TYviwPbHElESA1RLNd4snuoZ/FhX8SV8rTn69RL6J8NCWM9P469RTuJGaovZU18mLT+JlPhDJr0eea9FV8Tn6uj9bvUGr0eYguYc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258345; 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=+oLwDpvRp/miMOkH+DYuYNqF+ngg9sMrm/icH209cck=; b=QQbQ5LijCSgSgAUH6sibrgnxiepuGmEBSR8mtHcdUACzn8rQIIhPkerzek6g74yX6lLLYsx6kT/rnoqk3YV5pnMhMp7qvv2OxojuHyfXJECpp2qR/yu6IP6UobIo8tqtIWy7a7DKV1zwne0l/V4nfn28YSsFCXCpsjnDUtUYdcU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258345381910.06527140194; Thu, 26 Mar 2020 14:32:25 -0700 (PDT) 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-336-GkIHNvgRNjyKZsT0nr6x-A-1; Thu, 26 Mar 2020 17:32:21 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 42EF0100551A; Thu, 26 Mar 2020 21:32:16 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E610B60BF4; Thu, 26 Mar 2020 21:32:15 +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 908148A042; Thu, 26 Mar 2020 21:32:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVnm4010221 for ; Thu, 26 Mar 2020 17:31:49 -0400 Received: by smtp.corp.redhat.com (Postfix) id 22BCD6C330; Thu, 26 Mar 2020 21:31:49 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1E69211F4C2 for ; Thu, 26 Mar 2020 21:31:49 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (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 E450E80028B for ; Thu, 26 Mar 2020 21:31:48 +0000 (UTC) Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-339-kLlWcOJHM4GxCbq7Tk10ZA-1; Thu, 26 Mar 2020 17:31:44 -0400 Received: by mail-qt1-f193.google.com with SMTP id t17so6860829qtn.12; Thu, 26 Mar 2020 14:31:44 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258344; 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=+oLwDpvRp/miMOkH+DYuYNqF+ngg9sMrm/icH209cck=; b=Sdh7eN13JawkMPPZkpiFKUwMmZm6GS3OmJitoonQ1yn6KXaMmDZTEgyr6LMjArRnELmsTA gvlvNHWVAg6q6Q8HmwOyoi6NcclAd6twWwbeWM6kJN2vTSA7mcuJGpRT49WZIQ6EVMOdKs yfqY7iwSPClLef6hRSjIw1xsUyWOxMk= X-MC-Unique: GkIHNvgRNjyKZsT0nr6x-A-1 X-MC-Unique: kLlWcOJHM4GxCbq7Tk10ZA-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=4QLHbOaXiR2UNvxeRpLaGDjK82Lcaa4GbQR/TSzxFYE=; b=ELPMmWR6HKwVgzdcLDBktImfrY36oBuZY3YIHqC9I+L5phu2IvBy8ktSfeTFcYf0JW xjg7xKBqcsOYUAkBhI2ji9aLmeDw27ATdmKZcFfoSL4cdN9TTt4Q1noQ6uaf5mQ6eeKZ 3JAWf0HkKB34qamir/no8yz4r1bXZfwW7LdbWeX7PdojpGSei9yukrpf6Rc1a4tPZ/zt EhRYwx39T7kZRKHQP+s//hceNkeYgkh+PFQmKVK45qk02KrD9532YGfFwjvrFQJAYQdw o6P5NggjEgh26cSbpZleXzc6qjYg/FyJb7Gw8w8rQXESzDO+WQQIppxF4vCaD3RnJKHM psew== X-Gm-Message-State: ANhLgQ3YOL0pmsqE/Rfr1+F00I3EkPyipCs6ImDnhDu1EF+bvpiFzjLF r7HTTqiTYtgwaZzfs0mQP6CcRskG X-Google-Smtp-Source: ADFU+vsTNpl4LEgDrOBA6vGiBTfMAWE4h5QjHssnCcYkLuJii8y8yP2Q/bt31YEkBRcLZBHq8BNQdQ== X-Received: by 2002:aed:2f01:: with SMTP id l1mr10970253qtd.37.1585258303271; Thu, 26 Mar 2020 14:31:43 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 03/15] qemu: move qemuDomainValidateDef() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:13 -0300 Message-Id: <20200326213125.2306013-4-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVnm4010221 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.12 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" After moving most of static functions qemuDomainValidateDef() uses, move the last remaining static and qemuDomainValidateDef() itself to qemu_validation.c. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 254 +----------------------------------- src/qemu/qemu_validate.c | 269 +++++++++++++++++++++++++++++++++++++-- src/qemu/qemu_validate.h | 19 +-- 3 files changed, 263 insertions(+), 279 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 413ce4a2dc..84212f7441 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5007,39 +5007,6 @@ qemuDomainDefPostParse(virDomainDefPtr def, } =20 =20 -/** - * qemuDomainDefGetVcpuHotplugGranularity: - * @def: domain definition - * - * With QEMU 2.7 and newer, vCPUs can only be hotplugged in groups that - * respect the guest's hotplug granularity; because of that, QEMU will - * not allow guests to start unless the initial number of vCPUs is a - * multiple of the hotplug granularity. - * - * Returns the vCPU hotplug granularity. - */ -static unsigned int -qemuDomainDefGetVcpuHotplugGranularity(const virDomainDef *def) -{ - /* If the guest CPU topology has not been configured, assume we - * can hotplug vCPUs one at a time */ - if (!def->cpu || def->cpu->sockets =3D=3D 0) - return 1; - - /* For pSeries guests, hotplug can only be performed one core - * at a time, so the vCPU hotplug granularity is the number - * of threads per core */ - if (qemuDomainIsPSeries(def)) - return def->cpu->threads; - - /* In all other cases, we can hotplug vCPUs one at a time */ - return 1; -} - - -#define QEMU_MAX_VCPUS_WITHOUT_EIM 255 - - static int qemuDomainDeviceDefValidateNVRAM(virDomainNVRAMDefPtr nvram, const virDomainDef *def, @@ -5182,225 +5149,6 @@ qemuDomainDeviceDefValidateMemory(virDomainMemoryDe= fPtr mem, return 0; } =20 -static int -qemuDomainDefValidate(const virDomainDef *def, - void *opaque) -{ - virQEMUDriverPtr driver =3D opaque; - g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - g_autoptr(virQEMUCaps) qemuCaps =3D NULL; - size_t i; - - if (!(qemuCaps =3D virQEMUCapsCacheLookup(driver->qemuCapsCache, - def->emulator))) - return -1; - - if (def->os.type !=3D VIR_DOMAIN_OSTYPE_HVM) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Emulator '%s' does not support os type '%s'"), - def->emulator, virDomainOSTypeToString(def->os.type= )); - return -1; - } - - if (!virQEMUCapsIsArchSupported(qemuCaps, def->os.arch)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Emulator '%s' does not support arch '%s'"), - def->emulator, virArchToString(def->os.arch)); - return -1; - } - - if (!virQEMUCapsIsVirtTypeSupported(qemuCaps, def->virtType)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Emulator '%s' does not support virt type '%s'"), - def->emulator, virDomainVirtTypeToString(def->virtT= ype)); - return -1; - } - - if (qemuCaps && - !virQEMUCapsIsMachineSupported(qemuCaps, def->virtType, def->os.ma= chine)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Emulator '%s' does not support machine type '%s'= "), - def->emulator, def->os.machine); - return -1; - } - - if (def->mem.min_guarantee) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Parameter 'min_guarantee' not supported by QEMU.= ")); - return -1; - } - - /* On x86, UEFI requires ACPI */ - if ((def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_EFI || - virDomainDefHasOldStyleUEFI(def)) && - ARCH_IS_X86(def->os.arch) && - def->features[VIR_DOMAIN_FEATURE_ACPI] !=3D VIR_TRISTATE_SWITCH_ON= ) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("UEFI requires ACPI on this architecture")); - return -1; - } - - /* On aarch64, ACPI requires UEFI */ - if (def->features[VIR_DOMAIN_FEATURE_ACPI] =3D=3D VIR_TRISTATE_SWITCH_= ON && - def->os.arch =3D=3D VIR_ARCH_AARCH64 && - (def->os.firmware !=3D VIR_DOMAIN_OS_DEF_FIRMWARE_EFI && - !virDomainDefHasOldStyleUEFI(def))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("ACPI requires UEFI on this architecture")); - return -1; - } - - if (def->os.loader && - def->os.loader->secure =3D=3D VIR_TRISTATE_BOOL_YES) { - /* These are the QEMU implementation limitations. But we - * have to live with them for now. */ - - if (!qemuDomainIsQ35(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Secure boot is supported with q35 machine ty= pes only")); - return -1; - } - - /* Now, technically it is possible to have secure boot on - * 32bits too, but that would require some -cpu xxx magic - * too. Not worth it unless we are explicitly asked. */ - if (def->os.arch !=3D VIR_ARCH_X86_64) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Secure boot is supported for x86_64 architec= ture only")); - return -1; - } - - /* SMM will be enabled by qemuFirmwareFillDomain() if needed. */ - if (def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_NONE && - def->features[VIR_DOMAIN_FEATURE_SMM] !=3D VIR_TRISTATE_SWITCH= _ON) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Secure boot requires SMM feature enabled")); - return -1; - } - } - - if (def->genidRequested && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMGENID)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU does not support the 'genid' capabilit= y")); - return -1; - } - - /* Serial graphics adapter */ - if (def->os.bios.useserial =3D=3D VIR_TRISTATE_BOOL_YES) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SGA)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("qemu does not support SGA")); - return -1; - } - if (!def->nserials) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("need at least one serial port to use SGA")); - return -1; - } - } - - if (qemuValidateDomainDefClockTimers(def, qemuCaps) < 0) - return -1; - - if (qemuValidateDomainDefPM(def, qemuCaps) < 0) - return -1; - - if (qemuValidateDomainDefBoot(def, qemuCaps) < 0) - return -1; - - /* QEMU 2.7 (detected via the availability of query-hotpluggable-cpus) - * enforces stricter rules than previous versions when it comes to gue= st - * CPU topology. Verify known constraints are respected */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS)) { - unsigned int topologycpus; - unsigned int granularity; - unsigned int numacpus; - - /* Starting from QEMU 2.5, max vCPU count and overall vCPU topology - * must agree. We only actually enforce this with QEMU 2.7+, due - * to the capability check above */ - if (virDomainDefGetVcpusTopology(def, &topologycpus) =3D=3D 0) { - if (topologycpus !=3D virDomainDefGetVcpusMax(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("CPU topology doesn't match maximum vcpu = count")); - return -1; - } - - numacpus =3D virDomainNumaGetCPUCountTotal(def->numa); - if ((numacpus !=3D 0) && (topologycpus !=3D numacpus)) { - VIR_WARN("CPU topology doesn't match numa CPU count; " - "partial NUMA mapping is obsoleted and will " - "be removed in future"); - } - } - - /* vCPU hotplug granularity must be respected */ - granularity =3D qemuDomainDefGetVcpuHotplugGranularity(def); - if ((virDomainDefGetVcpus(def) % granularity) !=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("vCPUs count must be a multiple of the vCPU " - "hotplug granularity (%u)"), - granularity); - return -1; - } - } - - if (qemuValidateDomainCpuCount(def, qemuCaps) < 0) - return -1; - - if (ARCH_IS_X86(def->os.arch) && - virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM) { - if (!qemuDomainIsQ35(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("more than %d vCPUs are only supported on " - "q35-based machine types"), - QEMU_MAX_VCPUS_WITHOUT_EIM); - return -1; - } - if (!def->iommu || def->iommu->eim !=3D VIR_TRISTATE_SWITCH_ON) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("more than %d vCPUs require extended interrup= t " - "mode enabled on the iommu device"), - QEMU_MAX_VCPUS_WITHOUT_EIM); - return -1; - } - } - - if (def->nresctrls && - def->virtType !=3D VIR_DOMAIN_VIRT_KVM) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("cachetune is only supported for KVM domains")); - return -1; - } - - if (qemuValidateDomainDefFeatures(def, qemuCaps) < 0) - return -1; - - if (qemuValidateDomainDefMemory(def, qemuCaps) < 0) - return -1; - - if (qemuValidateDomainDefNuma(def, qemuCaps) < 0) - return -1; - - if (qemuValidateDomainDefConsole(def, qemuCaps) < 0) - return -1; - - if (cfg->vncTLS && cfg->vncTLSx509secretUUID && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_TLS_CREDS_X509)) { - for (i =3D 0; i < def->ngraphics; i++) { - if (def->graphics[i]->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC= ) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("encrypted VNC TLS keys are not supported= with " - "this QEMU binary")); - return -1; - } - } - } - - return 0; -} - =20 static bool qemuDomainNetSupportsCoalesce(virDomainNetType type) @@ -8919,7 +8667,7 @@ virDomainDefParserConfig virQEMUDriverDomainDefParser= Config =3D { .devicesPostParseCallback =3D qemuDomainDeviceDefPostParse, .domainPostParseCallback =3D qemuDomainDefPostParse, .assignAddressesCallback =3D qemuDomainDefAssignAddresses, - .domainValidateCallback =3D qemuDomainDefValidate, + .domainValidateCallback =3D qemuValidateDomainDef, .deviceValidateCallback =3D qemuDomainDeviceDefValidate, =20 .features =3D VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG | diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index b2a8c3c0b5..27e0558770 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -22,9 +22,13 @@ =20 #include "qemu_validate.h" #include "qemu_domain.h" +#include "virlog.h" #include "virutil.h" =20 #define VIR_FROM_THIS VIR_FROM_QEMU +#define QEMU_MAX_VCPUS_WITHOUT_EIM 255 + +VIR_LOG_INIT("qemu.qemu_validate"); =20 =20 static int @@ -136,7 +140,7 @@ qemuValidateDomainDefPSeriesFeature(const virDomainDef = *def, } =20 =20 -int +static int qemuValidateDomainDefFeatures(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -311,7 +315,7 @@ qemuValidateDomainDefFeatures(const virDomainDef *def, } =20 =20 -int +static int qemuValidateDomainDefClockTimers(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -449,7 +453,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, } =20 =20 -int +static int qemuValidateDomainDefPM(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -481,7 +485,7 @@ qemuValidateDomainDefPM(const virDomainDef *def, } =20 =20 -int +static int qemuValidateDomainDefBoot(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -507,7 +511,7 @@ qemuValidateDomainDefBoot(const virDomainDef *def, } =20 =20 -int +static int qemuValidateDomainCpuCount(const virDomainDef *def, virQEMUCapsPtr qemuCap= s) { unsigned int maxCpus =3D virQEMUCapsGetMachineMaxCpus(qemuCaps, def->v= irtType, @@ -530,7 +534,7 @@ qemuValidateDomainCpuCount(const virDomainDef *def, vir= QEMUCapsPtr qemuCaps) } =20 =20 -int +static int qemuValidateDomainDefMemory(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -585,7 +589,7 @@ qemuValidateDomainDefMemory(const virDomainDef *def, } =20 =20 -int +static int qemuValidateDomainDefNuma(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -648,7 +652,7 @@ qemuValidateDomainDefNuma(const virDomainDef *def, } =20 =20 -int +static int qemuValidateDomainDefConsole(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { @@ -689,3 +693,252 @@ qemuValidateDomainDefConsole(const virDomainDef *def, =20 return 0; } + + +/** + * qemuValidateDefGetVcpuHotplugGranularity: + * @def: domain definition + * + * With QEMU 2.7 and newer, vCPUs can only be hotplugged in groups that + * respect the guest's hotplug granularity; because of that, QEMU will + * not allow guests to start unless the initial number of vCPUs is a + * multiple of the hotplug granularity. + * + * Returns the vCPU hotplug granularity. + */ +static unsigned int +qemuValidateDefGetVcpuHotplugGranularity(const virDomainDef *def) +{ + /* If the guest CPU topology has not been configured, assume we + * can hotplug vCPUs one at a time */ + if (!def->cpu || def->cpu->sockets =3D=3D 0) + return 1; + + /* For pSeries guests, hotplug can only be performed one core + * at a time, so the vCPU hotplug granularity is the number + * of threads per core */ + if (qemuDomainIsPSeries(def)) + return def->cpu->threads; + + /* In all other cases, we can hotplug vCPUs one at a time */ + return 1; +} + + +int +qemuValidateDomainDef(const virDomainDef *def, void *opaque) +{ + virQEMUDriverPtr driver =3D opaque; + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + g_autoptr(virQEMUCaps) qemuCaps =3D NULL; + size_t i; + + if (!(qemuCaps =3D virQEMUCapsCacheLookup(driver->qemuCapsCache, + def->emulator))) + return -1; + + if (def->os.type !=3D VIR_DOMAIN_OSTYPE_HVM) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Emulator '%s' does not support os type '%s'"), + def->emulator, virDomainOSTypeToString(def->os.type= )); + return -1; + } + + if (!virQEMUCapsIsArchSupported(qemuCaps, def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Emulator '%s' does not support arch '%s'"), + def->emulator, virArchToString(def->os.arch)); + return -1; + } + + if (!virQEMUCapsIsVirtTypeSupported(qemuCaps, def->virtType)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Emulator '%s' does not support virt type '%s'"), + def->emulator, virDomainVirtTypeToString(def->virtT= ype)); + return -1; + } + + if (qemuCaps && + !virQEMUCapsIsMachineSupported(qemuCaps, def->virtType, def->os.ma= chine)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Emulator '%s' does not support machine type '%s'= "), + def->emulator, def->os.machine); + return -1; + } + + if (def->mem.min_guarantee) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Parameter 'min_guarantee' not supported by QEMU.= ")); + return -1; + } + + /* On x86, UEFI requires ACPI */ + if ((def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_EFI || + virDomainDefHasOldStyleUEFI(def)) && + ARCH_IS_X86(def->os.arch) && + def->features[VIR_DOMAIN_FEATURE_ACPI] !=3D VIR_TRISTATE_SWITCH_ON= ) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("UEFI requires ACPI on this architecture")); + return -1; + } + + /* On aarch64, ACPI requires UEFI */ + if (def->features[VIR_DOMAIN_FEATURE_ACPI] =3D=3D VIR_TRISTATE_SWITCH_= ON && + def->os.arch =3D=3D VIR_ARCH_AARCH64 && + (def->os.firmware !=3D VIR_DOMAIN_OS_DEF_FIRMWARE_EFI && + !virDomainDefHasOldStyleUEFI(def))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("ACPI requires UEFI on this architecture")); + return -1; + } + + if (def->os.loader && + def->os.loader->secure =3D=3D VIR_TRISTATE_BOOL_YES) { + /* These are the QEMU implementation limitations. But we + * have to live with them for now. */ + + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Secure boot is supported with q35 machine ty= pes only")); + return -1; + } + + /* Now, technically it is possible to have secure boot on + * 32bits too, but that would require some -cpu xxx magic + * too. Not worth it unless we are explicitly asked. */ + if (def->os.arch !=3D VIR_ARCH_X86_64) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Secure boot is supported for x86_64 architec= ture only")); + return -1; + } + + /* SMM will be enabled by qemuFirmwareFillDomain() if needed. */ + if (def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_NONE && + def->features[VIR_DOMAIN_FEATURE_SMM] !=3D VIR_TRISTATE_SWITCH= _ON) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Secure boot requires SMM feature enabled")); + return -1; + } + } + + if (def->genidRequested && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMGENID)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU does not support the 'genid' capabilit= y")); + return -1; + } + + /* Serial graphics adapter */ + if (def->os.bios.useserial =3D=3D VIR_TRISTATE_BOOL_YES) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SGA)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qemu does not support SGA")); + return -1; + } + if (!def->nserials) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("need at least one serial port to use SGA")); + return -1; + } + } + + if (qemuValidateDomainDefClockTimers(def, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainDefPM(def, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainDefBoot(def, qemuCaps) < 0) + return -1; + + /* QEMU 2.7 (detected via the availability of query-hotpluggable-cpus) + * enforces stricter rules than previous versions when it comes to gue= st + * CPU topology. Verify known constraints are respected */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS)) { + unsigned int topologycpus; + unsigned int granularity; + unsigned int numacpus; + + /* Starting from QEMU 2.5, max vCPU count and overall vCPU topology + * must agree. We only actually enforce this with QEMU 2.7+, due + * to the capability check above */ + if (virDomainDefGetVcpusTopology(def, &topologycpus) =3D=3D 0) { + if (topologycpus !=3D virDomainDefGetVcpusMax(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("CPU topology doesn't match maximum vcpu = count")); + return -1; + } + + numacpus =3D virDomainNumaGetCPUCountTotal(def->numa); + if ((numacpus !=3D 0) && (topologycpus !=3D numacpus)) { + VIR_WARN("CPU topology doesn't match numa CPU count; " + "partial NUMA mapping is obsoleted and will " + "be removed in future"); + } + } + + /* vCPU hotplug granularity must be respected */ + granularity =3D qemuValidateDefGetVcpuHotplugGranularity(def); + if ((virDomainDefGetVcpus(def) % granularity) !=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("vCPUs count must be a multiple of the vCPU " + "hotplug granularity (%u)"), + granularity); + return -1; + } + } + + if (qemuValidateDomainCpuCount(def, qemuCaps) < 0) + return -1; + + if (ARCH_IS_X86(def->os.arch) && + virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM) { + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("more than %d vCPUs are only supported on " + "q35-based machine types"), + QEMU_MAX_VCPUS_WITHOUT_EIM); + return -1; + } + if (!def->iommu || def->iommu->eim !=3D VIR_TRISTATE_SWITCH_ON) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("more than %d vCPUs require extended interrup= t " + "mode enabled on the iommu device"), + QEMU_MAX_VCPUS_WITHOUT_EIM); + return -1; + } + } + + if (def->nresctrls && + def->virtType !=3D VIR_DOMAIN_VIRT_KVM) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("cachetune is only supported for KVM domains")); + return -1; + } + + if (qemuValidateDomainDefFeatures(def, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainDefMemory(def, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainDefNuma(def, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainDefConsole(def, qemuCaps) < 0) + return -1; + + if (cfg->vncTLS && cfg->vncTLSx509secretUUID && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_TLS_CREDS_X509)) { + for (i =3D 0; i < def->ngraphics; i++) { + if (def->graphics[i]->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC= ) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("encrypted VNC TLS keys are not supported= with " + "this QEMU binary")); + return -1; + } + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 85d1bc07cb..b6a6466a24 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -25,21 +25,4 @@ #include "domain_conf.h" #include "qemu_capabilities.h" =20 -int qemuValidateDomainDefFeatures(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefClockTimers(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefPM(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefBoot(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainCpuCount(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainCpuCount(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefMemory(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefNuma(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDefConsole(const virDomainDef *def, - virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDef(const virDomainDef *def, void *opaque); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258421; cv=none; d=zohomail.com; s=zohoarc; b=b8CiVePulDolBfGoXPdTKHSK/vMLQGpFCW0C1Kbh6hY9NNen1B/cAhuCKry5dqc2WwLKWf/EP5/BDzhBmjv/gp0RqpYDLCS30zNX95MA6LWAZvYUZhIBt+msEYUCbLOLXrJr1YykK2/4lZ8jqZyPrIhmBfk8/jq5lr4yOOTRCes= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258421; 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=0qIrJd/kwlL8UKl15Z55JH9MxM09QTpPECZLfm0P4AI=; b=Qy3AtNrHOfOqb7QHLj1L+IKh+v+fERk7cTOrhW+6oJkcB3Et1ffpQOI3WWaSyBaALMqIkiOVfC9qrdvSKaHEbNlz/1KZkI3kvUsWWctlI8h4RFo6KLdt37FDIikzNWSetu+lerAdenWgq6kVOJkj1CRok1USJx6MnTiA/FOtgg8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258421612691.5188023047579; Thu, 26 Mar 2020 14:33:41 -0700 (PDT) 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-269-t_3SnlYYNgOddIrUOGf1kg-1; Thu, 26 Mar 2020 17:33:38 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C9F22DB24; Thu, 26 Mar 2020 21:33:32 +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 9FE6FCDBC3; Thu, 26 Mar 2020 21:33:32 +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 5C1CC18089CF; Thu, 26 Mar 2020 21:33:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVok0010233 for ; Thu, 26 Mar 2020 17:31:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3AA6D1055419; Thu, 26 Mar 2020 21:31:50 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 35F86105541C for ; Thu, 26 Mar 2020 21:31:50 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 19112800298 for ; Thu, 26 Mar 2020 21:31:50 +0000 (UTC) Received: from mail-qk1-f194.google.com (mail-qk1-f194.google.com [209.85.222.194]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-344-vdr8LftKPxS1nKBqrGtAgQ-1; Thu, 26 Mar 2020 17:31:45 -0400 Received: by mail-qk1-f194.google.com with SMTP id c145so8636706qke.12; Thu, 26 Mar 2020 14:31:45 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258420; 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=0qIrJd/kwlL8UKl15Z55JH9MxM09QTpPECZLfm0P4AI=; b=RWyQBPhd2O/l9fVNSlcDtwUHZcLAJzbMfWoSVjHzOMJyIrmvwZImvDpvCBMkCOYThs01cZ UdOjLv748a1NeE+YO9UJYIS0I8/mIps5tbuxoHDgoOm1ifnLbKXNaQBsY9ZIFfTjXPenST DTkL7YtDf1dtOAHv1wXN2OEN96JjRgo= X-MC-Unique: t_3SnlYYNgOddIrUOGf1kg-1 X-MC-Unique: vdr8LftKPxS1nKBqrGtAgQ-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=Nk3KPHVCCaXXvQEBHQ+1vWKh+kiza5U/idHV7Y+sGBw=; b=Ge2w5oWcGmFTaMYVkb64c+qTyEB7ihU/DQ9Jl8YgmYPXKwTvKsarStvlc8GadXpNpN fpZjELuMvYYo5QohfNyf+bsuo+iFqJw0IhaRrwennG8WMuzi6iuoe00GrR2aKaQzROr6 JOM4Ft6RVDvT1nhmX+24BQBhAP7hPkiVqKHKqOmSzmA8jULSigo4LpBNtiX+33JtkzV4 hxchJvt0DtiGoI4cjEpN5T3Z/0PEv1oPApolaC26eAqmHNiLuykNvkyVuAHW+xS6piX7 dRwqoz7DKql5E6wkQlBBsEbqR6j9yGaJxFB8zdBOf4MI2d7svJUz5r2CZ/gy3zGj1dBJ 1MrQ== X-Gm-Message-State: ANhLgQ1LQVng89yVztpGqRZqgCsGAaCvz5tXKgX6vPm0pU25NPadxzk9 f7UofyD2Lt6mW3mKiVH1wAN1OsDJ X-Google-Smtp-Source: ADFU+vvXqoVoQ2LD53y/9vRBJdhJUevuaSEo66O6V/qI/N9T3F9ZXnlywBkUyWTUgBZRUZainFLb2Q== X-Received: by 2002:a37:b886:: with SMTP id i128mr11121409qkf.410.1585258305076; Thu, 26 Mar 2020 14:31:45 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 04/15] qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validation.c Date: Thu, 26 Mar 2020 18:31:14 -0300 Message-Id: <20200326213125.2306013-5-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVok0010233 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.11 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" The next big task is to move qemuDomainDeviceDefValidate() to qemu_validation.c, which is a function that calls a lot of other static helper functions. This patch starts it by moving qemuDomainDeviceDefValidateAddress(). Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 74 +--------------------------------------- src/qemu/qemu_validate.c | 72 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 2 ++ 3 files changed, 75 insertions(+), 73 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 84212f7441..7cab3e370c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7721,78 +7721,6 @@ qemuDomainDeviceDefValidateFS(virDomainFSDefPtr fs, } =20 =20 -static int -qemuDomainDeviceDefValidateZPCIAddress(virDomainDeviceInfoPtr info, - virQEMUCapsPtr qemuCaps) -{ - if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", - _("This QEMU binary doesn't support zPCI")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateAddress(const virDomainDeviceDef *dev, - virQEMUCapsPtr qemuCaps) -{ - virDomainDeviceInfoPtr info; - - if (!(info =3D virDomainDeviceGetInfo((virDomainDeviceDef *)dev))) - return 0; - - switch ((virDomainDeviceAddressType) info->type) { - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: - return qemuDomainDeviceDefValidateZPCIAddress(info, qemuCaps); - - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: - /* Address validation might happen before we have had a chance to - * automatically assign addresses to devices for which the user - * didn't specify one themselves */ - break; - - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO: { - virDomainDeviceSpaprVioAddressPtr addr =3D &(info->addr.spaprvio); - - if (addr->has_reg && addr->reg > 0xffffffff) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("spapr-vio reg=3D'0x%llx' exceeds maximum " - "possible value (0xffffffff)"), - addr->reg); - return -1; - } - - break; - } - - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED: - /* No validation for these address types yet */ - break; - - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: - default: - virReportEnumRangeError(virDomainDeviceAddressType, info->type); - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -7813,7 +7741,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, def->virtType))) return -1; =20 - if ((ret =3D qemuDomainDeviceDefValidateAddress(dev, qemuCaps)) < 0) + if ((ret =3D qemuValidateDomainDeviceDefAddress(dev, qemuCaps)) < 0) return ret; =20 if ((ret =3D virDomainCapsDeviceDefValidate(domCaps, dev, def)) < 0) diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 27e0558770..1bcc0c5da2 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -942,3 +942,75 @@ qemuValidateDomainDef(const virDomainDef *def, void *o= paque) =20 return 0; } + + +static int +qemuValidateDomainDeviceDefZPCIAddress(virDomainDeviceInfoPtr info, + virQEMUCapsPtr qemuCaps) +{ + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", + _("This QEMU binary doesn't support zPCI")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, + virQEMUCapsPtr qemuCaps) +{ + virDomainDeviceInfoPtr info; + + if (!(info =3D virDomainDeviceGetInfo((virDomainDeviceDef *)dev))) + return 0; + + switch ((virDomainDeviceAddressType) info->type) { + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: + return qemuValidateDomainDeviceDefZPCIAddress(info, qemuCaps); + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: + /* Address validation might happen before we have had a chance to + * automatically assign addresses to devices for which the user + * didn't specify one themselves */ + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO: { + virDomainDeviceSpaprVioAddressPtr addr =3D &(info->addr.spaprvio); + + if (addr->has_reg && addr->reg > 0xffffffff) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("spapr-vio reg=3D'0x%llx' exceeds maximum " + "possible value (0xffffffff)"), + addr->reg); + return -1; + } + + break; + } + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED: + /* No validation for these address types yet */ + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: + virReportEnumRangeError(virDomainDeviceAddressType, info->type); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index b6a6466a24..440b63333c 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -26,3 +26,5 @@ #include "qemu_capabilities.h" =20 int qemuValidateDomainDef(const virDomainDef *def, void *opaque); +int qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258425; cv=none; d=zohomail.com; s=zohoarc; b=K8hF/4qkWOs8g8Rd6x0xA/q/UvArg+K1u7d3EMS3PHoYNzHtffa7THXH8d+5i0CkTs4hzjxcEEyRYPc76qAWmQlh96ReCjxTi0Mghv7zaIYrd9ofyWkxi5cXYJop0H1bocI0IT8sF57gZaFSJipaILdivXmUW7UfldEVftE/R40= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258425; 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=OXOr5xVtOL8LbGa5mrp3yeg4pValsj7+sqHrjcKDeWw=; b=C0WW8mNknn0ScoVqmvGMW7RVbR5mVHRecWKDXvgJFTFhZAERDFBl1Dz6DTAwXJvibK9DeGUbFZjkmkbKxh+uP4BxiQzndYUHDzTOqKIXSP/AFsJsl0wDuwedRlB9dKA81Lu+K3nj8OklHF93o40pn6cA20obaq48qHVHM6cu8+s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 158525842549118.35668923614969; Thu, 26 Mar 2020 14:33:45 -0700 (PDT) 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-353-jrtfYtlOPEORiGDEfnVCUA-1; Thu, 26 Mar 2020 17:33:42 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 62EBD102CE17; Thu, 26 Mar 2020 21:33:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3B02A5E001; Thu, 26 Mar 2020 21:33: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 E8AFA8A049; Thu, 26 Mar 2020 21:33:35 +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 02QLVrjJ010249 for ; Thu, 26 Mar 2020 17:31:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id E52F12166B2F; Thu, 26 Mar 2020 21:31:52 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DFAF22166B32 for ; Thu, 26 Mar 2020 21:31:50 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) (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 229BD8F7846 for ; Thu, 26 Mar 2020 21:31:50 +0000 (UTC) Received: from mail-qk1-f174.google.com (mail-qk1-f174.google.com [209.85.222.174]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-333-RxWnZtiQNRekIJO2tgQvQA-1; Thu, 26 Mar 2020 17:31:47 -0400 Received: by mail-qk1-f174.google.com with SMTP id l25so8683320qki.7; Thu, 26 Mar 2020 14:31:47 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258424; 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=OXOr5xVtOL8LbGa5mrp3yeg4pValsj7+sqHrjcKDeWw=; b=YZvZJWOHpIEgGpSjw6SPkJ3oIp91mvBdiolNu/3Gy36ntb690BbgB5/kJqIr4B7YE+5ECx KrzqxTqrmzKFnN2L4Gn/t6c95MMcpv+OSSrXykX+hDMZPLMnKmu98JliiJl6bqSuluILrt L9UisiN91s0qn2Zl6dpfzzgZhXyXGL4= X-MC-Unique: jrtfYtlOPEORiGDEfnVCUA-1 X-MC-Unique: RxWnZtiQNRekIJO2tgQvQA-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=943/0IvwcW2TQEtiTxxbsCuZca62PKtztJYZ5P45sn0=; b=TD1ayHP+hNWAnVi5FfwUibE55s0tNl+FRJXPAL9XZpTmw8/t/MlqMAlUBu5+ba/Cx1 V1L2+J6BRWr1ctmzRg9hqyQzmdWzu4jb+DaJhuQxzYI/crCtIDV6RAJaq7gBWqPWGvEE qyYu/kJofk8M1eLUwRAvBkeh93NBmJPfnZjBq1uBKksrTrxSBC4aVTmaSMYfYykIuJpa G0+kDVbfCIRd8M3jNRs2BFiRncQCavKaULdIdm7gOvLaDAb+GhwmKDTIRikRrO58PQjx LElJvkMNLZVZpNb7KE0Un6p8UkwPT6eNt8WoYPxqLO7FVXnLYhw9q6Fqw+qR7ezEjF2O 8/+Q== X-Gm-Message-State: ANhLgQ3HQ7ziryUnplyZVXaTMObinuKQYvVBZXfLczyHdrKgBjWNbMwY FqH+14/3KAVgS6HiOWAus83AeyDx X-Google-Smtp-Source: ADFU+vtpZWPGYNfmiUPgS0FAon9YQ9HetLXXbWUdJm/0c7AsqEgWI51nfnuW/9GikOQb66e80K1Gyw== X-Received: by 2002:a37:7d5:: with SMTP id 204mr11003411qkh.171.1585258306914; Thu, 26 Mar 2020 14:31:46 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 05/15] qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:15 -0300 Message-Id: <20200326213125.2306013-6-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.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 02QLVrjJ010249 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.15 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" Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 146 +-------------------------------------- src/qemu/qemu_validate.c | 144 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 2 + 3 files changed, 147 insertions(+), 145 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7cab3e370c..caf5c5b73d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5150,30 +5150,6 @@ qemuDomainDeviceDefValidateMemory(virDomainMemoryDef= Ptr mem, } =20 =20 -static bool -qemuDomainNetSupportsCoalesce(virDomainNetType type) -{ - switch (type) { - case VIR_DOMAIN_NET_TYPE_NETWORK: - case VIR_DOMAIN_NET_TYPE_BRIDGE: - return true; - case VIR_DOMAIN_NET_TYPE_VHOSTUSER: - case VIR_DOMAIN_NET_TYPE_ETHERNET: - case VIR_DOMAIN_NET_TYPE_DIRECT: - case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_USER: - case VIR_DOMAIN_NET_TYPE_SERVER: - case VIR_DOMAIN_NET_TYPE_CLIENT: - case VIR_DOMAIN_NET_TYPE_MCAST: - case VIR_DOMAIN_NET_TYPE_INTERNAL: - case VIR_DOMAIN_NET_TYPE_UDP: - case VIR_DOMAIN_NET_TYPE_LAST: - break; - } - return false; -} - - static int qemuDomainChrSourceReconnectDefValidate(const virDomainChrSourceReconnectD= ef *def) { @@ -5642,126 +5618,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDe= f *net, } =20 =20 -static int -qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net, - virQEMUCapsPtr qemuCaps) -{ - bool hasIPv4 =3D false; - bool hasIPv6 =3D false; - size_t i; - - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_USER) { - if (net->guestIP.nroutes) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid attempt to set network interface " - "guest-side IP route, not supported by QEMU")= ); - return -1; - } - - for (i =3D 0; i < net->guestIP.nips; i++) { - const virNetDevIPAddr *ip =3D net->guestIP.ips[i]; - - if (VIR_SOCKET_ADDR_VALID(&net->guestIP.ips[i]->peer)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid attempt to set peer IP for guest= ")); - return -1; - } - - if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET)) { - if (hasIPv4) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Only one IPv4 address per " - "interface is allowed")); - return -1; - } - hasIPv4 =3D true; - - if (ip->prefix > 0 && - (ip->prefix < 4 || ip->prefix > 27)) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("invalid prefix, must be in range of = 4-27")); - return -1; - } - } - - if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6)) { - if (hasIPv6) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Only one IPv6 address per " - "interface is allowed")); - return -1; - } - hasIPv6 =3D true; - - if (ip->prefix > 120) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("prefix too long")); - return -1; - } - } - } - } else if (net->guestIP.nroutes || net->guestIP.nips) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Invalid attempt to set network interface " - "guest-side IP route and/or address info, " - "not supported by QEMU")); - return -1; - } - - if (virDomainNetIsVirtioModel(net)) { - if (net->driver.virtio.rx_queue_size & (net->driver.virtio.rx_queu= e_size - 1)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("rx_queue_size has to be a power of two")); - return -1; - } - if (net->driver.virtio.tx_queue_size & (net->driver.virtio.tx_queu= e_size - 1)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("tx_queue_size has to be a power of two")); - return -1; - } - } - - if (net->mtu && - !qemuDomainNetSupportsMTU(net->type)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("setting MTU on interface type %s is not supporte= d yet"), - virDomainNetTypeToString(net->type)); - return -1; - } - - if (net->teaming.type !=3D VIR_DOMAIN_NET_TEAMING_TYPE_NONE && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_FAILOVER)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtio-net failover (teaming) is not supported w= ith this QEMU binary")); - return -1; - } - if (net->teaming.type =3D=3D VIR_DOMAIN_NET_TEAMING_TYPE_PERSISTENT - && !virDomainNetIsVirtioModel(net)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("virtio-net teaming persistent interface must be = , not '%s'"), - virDomainNetGetModelString(net)); - return -1; - } - if (net->teaming.type =3D=3D VIR_DOMAIN_NET_TEAMING_TYPE_TRANSIENT && - net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && - net->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("virtio-net teaming transient interface must be t= ype=3D'hostdev', not '%s'"), - virDomainNetTypeToString(net->type)); - return -1; - } - - if (net->coalesce && !qemuDomainNetSupportsCoalesce(net->type)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("coalesce settings on interface type %s are not s= upported"), - virDomainNetTypeToString(net->type)); - return -1; - } - - return 0; -} - - static int qemuDomainMdevDefVFIOPCIValidate(const virDomainHostdevDef *hostdev, const virDomainDef *def, @@ -7749,7 +7605,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, =20 switch ((virDomainDeviceType)dev->type) { case VIR_DOMAIN_DEVICE_NET: - ret =3D qemuDomainDeviceDefValidateNetwork(dev->data.net, qemuCaps= ); + ret =3D qemuValidateDomainDeviceDefNetwork(dev->data.net, qemuCaps= ); break; =20 case VIR_DOMAIN_DEVICE_CHR: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 1bcc0c5da2..528170ac94 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1014,3 +1014,147 @@ qemuValidateDomainDeviceDefAddress(const virDomainD= eviceDef *dev, =20 return 0; } + + +static bool +qemuValidateNetSupportsCoalesce(virDomainNetType type) +{ + switch (type) { + case VIR_DOMAIN_NET_TYPE_NETWORK: + case VIR_DOMAIN_NET_TYPE_BRIDGE: + return true; + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_ETHERNET: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_LAST: + break; + } + return false; +} + + +int +qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, + virQEMUCapsPtr qemuCaps) +{ + bool hasIPv4 =3D false; + bool hasIPv6 =3D false; + size_t i; + + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_USER) { + if (net->guestIP.nroutes) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid attempt to set network interface " + "guest-side IP route, not supported by QEMU")= ); + return -1; + } + + for (i =3D 0; i < net->guestIP.nips; i++) { + const virNetDevIPAddr *ip =3D net->guestIP.ips[i]; + + if (VIR_SOCKET_ADDR_VALID(&net->guestIP.ips[i]->peer)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid attempt to set peer IP for guest= ")); + return -1; + } + + if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET)) { + if (hasIPv4) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only one IPv4 address per " + "interface is allowed")); + return -1; + } + hasIPv4 =3D true; + + if (ip->prefix > 0 && + (ip->prefix < 4 || ip->prefix > 27)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("invalid prefix, must be in range of = 4-27")); + return -1; + } + } + + if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6)) { + if (hasIPv6) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only one IPv6 address per " + "interface is allowed")); + return -1; + } + hasIPv6 =3D true; + + if (ip->prefix > 120) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("prefix too long")); + return -1; + } + } + } + } else if (net->guestIP.nroutes || net->guestIP.nips) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Invalid attempt to set network interface " + "guest-side IP route and/or address info, " + "not supported by QEMU")); + return -1; + } + + if (virDomainNetIsVirtioModel(net)) { + if (net->driver.virtio.rx_queue_size & (net->driver.virtio.rx_queu= e_size - 1)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("rx_queue_size has to be a power of two")); + return -1; + } + if (net->driver.virtio.tx_queue_size & (net->driver.virtio.tx_queu= e_size - 1)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("tx_queue_size has to be a power of two")); + return -1; + } + } + + if (net->mtu && + !qemuDomainNetSupportsMTU(net->type)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("setting MTU on interface type %s is not supporte= d yet"), + virDomainNetTypeToString(net->type)); + return -1; + } + + if (net->teaming.type !=3D VIR_DOMAIN_NET_TEAMING_TYPE_NONE && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_FAILOVER)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtio-net failover (teaming) is not supported w= ith this QEMU binary")); + return -1; + } + if (net->teaming.type =3D=3D VIR_DOMAIN_NET_TEAMING_TYPE_PERSISTENT + && !virDomainNetIsVirtioModel(net)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("virtio-net teaming persistent interface must be = , not '%s'"), + virDomainNetGetModelString(net)); + return -1; + } + if (net->teaming.type =3D=3D VIR_DOMAIN_NET_TEAMING_TYPE_TRANSIENT && + net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && + net->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("virtio-net teaming transient interface must be t= ype=3D'hostdev', not '%s'"), + virDomainNetTypeToString(net->type)); + return -1; + } + + if (net->coalesce && !qemuValidateNetSupportsCoalesce(net->type)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("coalesce settings on interface type %s are not s= upported"), + virDomainNetTypeToString(net->type)); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 440b63333c..437daebecd 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -28,3 +28,5 @@ int qemuValidateDomainDef(const virDomainDef *def, void *opaque); int qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258431; cv=none; d=zohomail.com; s=zohoarc; b=kOgNcQHC7PGAXuRkC7rcvFPacdm+eV8WbvtEPNHhn6hyafTmdBuhFre9MKcFKmplorm3l9PZZQNCKW/IwYDMDuyFEK40Y323qn8rZaBPDnWH6XYrEYXJMbmF6ueowTdRoZQ+bEErnL3NRNOG8w9yjg3QSNYK5wEY/AoJSwVEgGM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258431; 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=eAsWGrPE9XS6VJc4IbVL90GK183thZKWsgRSDzpaiP8=; b=TNCKEvK7eWcgyDRgKA68K2vug8zvydd+F/RvLvGKIloD7RkraV7r+YLh7ULi+uYSMwuZfVW+RHkmK7wwTG/35dKwJ+II8gHDvHJym1PszTLArGjBA1QuJND2B5Le1HAUWw/I0xFoOkZU+JLcX+FnJjYcpVHSVBq7KoEntMaSjDw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258431574224.76469660511998; Thu, 26 Mar 2020 14:33:51 -0700 (PDT) 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-381-jW6w-zNgPQyvjI9LfE2A2g-1; Thu, 26 Mar 2020 17:33:47 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CB73518C35A8; Thu, 26 Mar 2020 21:33:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9B81410027AF; Thu, 26 Mar 2020 21:33:40 +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 4CEE78A04B; Thu, 26 Mar 2020 21:33:40 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVukr010272 for ; Thu, 26 Mar 2020 17:31:56 -0400 Received: by smtp.corp.redhat.com (Postfix) id 09F4411F4C2; Thu, 26 Mar 2020 21:31:56 +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 058046C330 for ; Thu, 26 Mar 2020 21:31:56 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (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 BF474185A78E for ; Thu, 26 Mar 2020 21:31:55 +0000 (UTC) Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-291-RFgCW1bdPzq5sap_dp9GAw-1; Thu, 26 Mar 2020 17:31:50 -0400 Received: by mail-qv1-f45.google.com with SMTP id p60so3914033qva.5; Thu, 26 Mar 2020 14:31:50 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258430; 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=eAsWGrPE9XS6VJc4IbVL90GK183thZKWsgRSDzpaiP8=; b=A0VsF9PkNQ12Sph3migrICg+ufuKsr1P0Dn1QgigeKRNqBIqyQrVM0HGm0zr1OASsIpJAt 07jGp03Atop34TQUj9rzrY4KGPR2y6Y2Bx6l+o8ygJkX4IFmy2oSCsVnC2t4lxpC8omnK9 PfNwKVEp8oIOq4nOy7m0fTVB70knn3Q= X-MC-Unique: jW6w-zNgPQyvjI9LfE2A2g-1 X-MC-Unique: RFgCW1bdPzq5sap_dp9GAw-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=7vg4Sb/JuZ8EtURkhSbyMxpjcc7AsBkyREItaiI97Pk=; b=p4kD8+eEQqKfcKyioP4YILJkr+B+1RXAYSlWaxf3OVs0R1kSwuRtcT6u4ea9zzhoq2 L4Pm4XsKtybiUJQaZbkU6Wx6R8wMicYL7DQNxczskMOPET2dlopqMEqgInQZdYUUgqUZ YfHxdecSWvm2Smw3AGs6j2/BQn1DaqlCIXcwj1EIF4xLgNkVAJSnUB1xpUCKzxWABn/0 LEnnoOVzDPcN8rf/r7jjZRVcU7bw54gGsjPMDYUrSqJBbP1rQX70vOsWFkZpQvX2Bx+X Ewe9Gzjfbqad5YIUtbraS1Mep+dS7Mmk4ccZtMgLuoykUAu6YGhzH07TwW27XWkxIsUR 8tgg== X-Gm-Message-State: ANhLgQ3Q9ilyv8FkO3mDYqMR+g1ydRJ1dnPO75jV+Tgrwp/N6UVwRB5w LnFOWmdPO/9dlm12eqPqqJE/DWAd X-Google-Smtp-Source: ADFU+vvR+wXqMMnJHyXGWH75v1wzXFrXE6ChZfFUhe4Spnqj5PkxZyTW77y3Mf+fS7XcIYmcHqho7A== X-Received: by 2002:a0c:90aa:: with SMTP id p39mr10664969qvp.38.1585258309446; Thu, 26 Mar 2020 14:31:49 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 06/15] qemu: move qemuDomainChrDefValidate() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:16 -0300 Message-Id: <20200326213125.2306013-7-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVukr010272 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.22 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" qemuDomainChrDefValidate() has a lot of static helpers functions that needed to be moved as well. Other functions from qemuDomainDeviceDefValidate() that were also moved: - qemuValidateDomainSmartcardDef - qemuValidateDomainRNGDef - qemuValidateDomainRedirdevDef - qemuValidateDomainWatchdogDef Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 383 +-------------------------------------- src/qemu/qemu_validate.c | 373 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 11 ++ 3 files changed, 389 insertions(+), 378 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index caf5c5b73d..4726fa015d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5150,379 +5150,6 @@ qemuDomainDeviceDefValidateMemory(virDomainMemoryDe= fPtr mem, } =20 =20 -static int -qemuDomainChrSourceReconnectDefValidate(const virDomainChrSourceReconnectD= ef *def) -{ - if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES && - def->timeout =3D=3D 0) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("chardev reconnect source timeout cannot be '0'")= ); - return -1; - } - - return 0; -} - - -static int -qemuDomainChrSourceDefValidate(const virDomainChrSourceDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch ((virDomainChrType)def->type) { - case VIR_DOMAIN_CHR_TYPE_TCP: - if (qemuDomainChrSourceReconnectDefValidate(&def->data.tcp.reconne= ct) < 0) - return -1; - break; - - case VIR_DOMAIN_CHR_TYPE_UNIX: - if (qemuDomainChrSourceReconnectDefValidate(&def->data.nix.reconne= ct) < 0) - return -1; - break; - - case VIR_DOMAIN_CHR_TYPE_FILE: - if (def->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FILE_APPEND)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("append not supported in this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_CHR_TYPE_NULL: - case VIR_DOMAIN_CHR_TYPE_VC: - case VIR_DOMAIN_CHR_TYPE_PTY: - case VIR_DOMAIN_CHR_TYPE_DEV: - case VIR_DOMAIN_CHR_TYPE_PIPE: - case VIR_DOMAIN_CHR_TYPE_STDIO: - case VIR_DOMAIN_CHR_TYPE_UDP: - case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: - break; - } - - if (def->logfile) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_LOGFILE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("logfile not supported in this QEMU binary")); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainChrSerialTargetTypeToAddressType(int targetType) -{ - switch ((virDomainChrSerialTargetType)targetType) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - break; - } - - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; -} - - -static int -qemuDomainChrSerialTargetModelToTargetType(int targetModel) -{ - switch ((virDomainChrSerialTargetModel) targetModel) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; - } - - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; -} - - -static int -qemuDomainChrTargetDefValidate(const virDomainChrDef *chr) -{ - int expected; - - switch ((virDomainChrDeviceType)chr->deviceType) { - case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: - - /* Validate target type */ - switch ((virDomainChrSerialTargetType)chr->targetType) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: - - expected =3D qemuDomainChrSerialTargetTypeToAddressType(chr->t= argetType); - - if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - chr->info.type !=3D expected) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target type '%s' requires address type '= %s'"), - virDomainChrSerialTargetTypeToString(chr->t= argetType), - virDomainDeviceAddressTypeToString(expected= )); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: - if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target type '%s' cannot have an " - "associated address"), - virDomainChrSerialTargetTypeToString(chr->t= argetType)); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: - break; - } - - /* Validate target model */ - switch ((virDomainChrSerialTargetModel) chr->targetModel) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: - - expected =3D qemuDomainChrSerialTargetModelToTargetType(chr->t= argetModel); - - if (chr->targetType !=3D expected) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target model '%s' requires target type '= %s'"), - virDomainChrSerialTargetModelTypeToString(c= hr->targetModel), - virDomainChrSerialTargetTypeToString(expect= ed)); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; - } - break; - - case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: - case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: - /* Nothing to do */ - break; - } - - return 0; -} - - -static int -qemuDomainChrDefValidate(const virDomainChrDef *dev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (qemuDomainChrSourceDefValidate(dev->source, qemuCaps) < 0) - return -1; - - if (qemuDomainChrTargetDefValidate(dev) < 0) - return -1; - - if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL && - (ARCH_IS_S390(def->os.arch) || qemuDomainIsPSeries(def))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("parallel ports are not supported")); - return -1; - } - - if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) { - bool isCompatible =3D true; - - if (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTE= M) { - if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _PL011 && - !qemuDomainIsARMVirt(def)) { - isCompatible =3D false; - } - if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _16550A && - !qemuDomainIsRISCVVirt(def)) { - isCompatible =3D false; - } - } - - if (!qemuDomainIsPSeries(def) && - (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAP= R_VIO || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SP= APR_VTY)) { - isCompatible =3D false; - } - - if (!ARCH_IS_S390(def->os.arch) && - (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP= || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPCONSOLE || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPLMCONSOLE)) { - isCompatible =3D false; - } - - if (!isCompatible) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Serial device with target type '%s' and " - "target model '%s' not compatible with guest " - "architecture or machine type"), - virDomainChrSerialTargetTypeToString(dev->targe= tType), - virDomainChrSerialTargetModelTypeToString(dev->= targetModel)); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainSmartcardDefValidate(const virDomainSmartcardDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch (def->type) { - case VIR_DOMAIN_SMARTCARD_TYPE_HOST: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard host " - "mode support")); - return -1; - } - break; - - case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard host " - "mode support")); - return -1; - } - break; - - case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard " - "passthrough mode support")); - return -1; - } - break; - - default: - virReportEnumRangeError(virDomainSmartcardType, def->type); - return -1; - } - - if (def->type =3D=3D VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH && - qemuDomainChrSourceDefValidate(def->data.passthru, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainRNGDefValidate(const virDomainRNGDef *def, - virQEMUCapsPtr qemuCaps G_GNUC_UNUSED) -{ - if (def->backend =3D=3D VIR_DOMAIN_RNG_BACKEND_EGD && - qemuDomainChrSourceDefValidate(def->source.chardev, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainRedirdevDefValidate(const virDomainRedirdevDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (qemuDomainChrSourceDefValidate(def->source, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev, - const virDomainDef *def) -{ - switch ((virDomainWatchdogModel) dev->model) { - case VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog can go only on PCI bus"= ), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_IB700: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog can go only on ISA bus"= ), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog is virtual and cannot g= o on any bus."), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - if (!(ARCH_IS_S390(def->os.arch))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog is allowed for s390 and= s390x only"), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_LAST: - break; - } - - return 0; -} - - int qemuDomainValidateActualNetDef(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps) @@ -7609,23 +7236,23 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuDomainChrDefValidate(dev->data.chr, def, qemuCaps); + ret =3D qemuValidateDomainChrDef(dev->data.chr, def, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_SMARTCARD: - ret =3D qemuDomainSmartcardDefValidate(dev->data.smartcard, qemuCa= ps); + ret =3D qemuValidateDomainSmartcardDef(dev->data.smartcard, qemuCa= ps); break; =20 case VIR_DOMAIN_DEVICE_RNG: - ret =3D qemuDomainRNGDefValidate(dev->data.rng, qemuCaps); + ret =3D qemuValidateDomainRNGDef(dev->data.rng, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_REDIRDEV: - ret =3D qemuDomainRedirdevDefValidate(dev->data.redirdev, qemuCaps= ); + ret =3D qemuValidateDomainRedirdevDef(dev->data.redirdev, qemuCaps= ); break; =20 case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuDomainWatchdogDefValidate(dev->data.watchdog, def); + ret =3D qemuValidateDomainWatchdogDef(dev->data.watchdog, def); break; =20 case VIR_DOMAIN_DEVICE_HOSTDEV: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 528170ac94..9b67c753c2 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1158,3 +1158,376 @@ qemuValidateDomainDeviceDefNetwork(const virDomainN= etDef *net, =20 return 0; } + + +static int +qemuValidateDomainChrSourceReconnectDef(const virDomainChrSourceReconnectD= ef *def) +{ + if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES && + def->timeout =3D=3D 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("chardev reconnect source timeout cannot be '0'")= ); + return -1; + } + + return 0; +} + + +static int +qemuValidateChrSerialTargetTypeToAddressType(int targetType) +{ + switch ((virDomainChrSerialTargetType)targetType) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: + break; + } + + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; +} + + +static int +qemuValidateChrSerialTargetModelToTargetType(int targetModel) +{ + switch ((virDomainChrSerialTargetModel) targetModel) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + break; + } + + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; +} + + +static int +qemuValidateDomainChrTargetDef(const virDomainChrDef *chr) +{ + int expected; + + switch ((virDomainChrDeviceType)chr->deviceType) { + case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: + + /* Validate target type */ + switch ((virDomainChrSerialTargetType)chr->targetType) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: + + expected =3D qemuValidateChrSerialTargetTypeToAddressType(chr-= >targetType); + + if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + chr->info.type !=3D expected) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target type '%s' requires address type '= %s'"), + virDomainChrSerialTargetTypeToString(chr->t= argetType), + virDomainDeviceAddressTypeToString(expected= )); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: + if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target type '%s' cannot have an " + "associated address"), + virDomainChrSerialTargetTypeToString(chr->t= argetType)); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + break; + } + + /* Validate target model */ + switch ((virDomainChrSerialTargetModel) chr->targetModel) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: + + expected =3D qemuValidateChrSerialTargetModelToTargetType(chr-= >targetModel); + + if (chr->targetType !=3D expected) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target model '%s' requires target type '= %s'"), + virDomainChrSerialTargetModelTypeToString(c= hr->targetModel), + virDomainChrSerialTargetTypeToString(expect= ed)); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + break; + } + break; + + case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: + case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: + case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + /* Nothing to do */ + break; + } + + return 0; +} + + +static int +qemuValidateDomainChrSourceDef(const virDomainChrSourceDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch ((virDomainChrType)def->type) { + case VIR_DOMAIN_CHR_TYPE_TCP: + if (qemuValidateDomainChrSourceReconnectDef(&def->data.tcp.reconne= ct) < 0) + return -1; + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + if (qemuValidateDomainChrSourceReconnectDef(&def->data.nix.reconne= ct) < 0) + return -1; + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + if (def->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FILE_APPEND)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("append not supported in this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_PTY: + case VIR_DOMAIN_CHR_TYPE_DEV: + case VIR_DOMAIN_CHR_TYPE_PIPE: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_UDP: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + break; + } + + if (def->logfile) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_LOGFILE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("logfile not supported in this QEMU binary")); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainChrDef(const virDomainChrDef *dev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (qemuValidateDomainChrSourceDef(dev->source, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainChrTargetDef(dev) < 0) + return -1; + + if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL && + (ARCH_IS_S390(def->os.arch) || qemuDomainIsPSeries(def))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("parallel ports are not supported")); + return -1; + } + + if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) { + bool isCompatible =3D true; + + if (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTE= M) { + if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _PL011 && + !qemuDomainIsARMVirt(def)) { + isCompatible =3D false; + } + if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _16550A && + !qemuDomainIsRISCVVirt(def)) { + isCompatible =3D false; + } + } + + if (!qemuDomainIsPSeries(def) && + (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAP= R_VIO || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SP= APR_VTY)) { + isCompatible =3D false; + } + + if (!ARCH_IS_S390(def->os.arch) && + (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP= || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPCONSOLE || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPLMCONSOLE)) { + isCompatible =3D false; + } + + if (!isCompatible) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Serial device with target type '%s' and " + "target model '%s' not compatible with guest " + "architecture or machine type"), + virDomainChrSerialTargetTypeToString(dev->targe= tType), + virDomainChrSerialTargetModelTypeToString(dev->= targetModel)); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch (def->type) { + case VIR_DOMAIN_SMARTCARD_TYPE_HOST: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard host " + "mode support")); + return -1; + } + break; + + case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard host " + "mode support")); + return -1; + } + break; + + case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard " + "passthrough mode support")); + return -1; + } + break; + + default: + virReportEnumRangeError(virDomainSmartcardType, def->type); + return -1; + } + + if (def->type =3D=3D VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH && + qemuValidateDomainChrSourceDef(def->data.passthru, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainRNGDef(const virDomainRNGDef *def, + virQEMUCapsPtr qemuCaps G_GNUC_UNUSED) +{ + if (def->backend =3D=3D VIR_DOMAIN_RNG_BACKEND_EGD && + qemuValidateDomainChrSourceDef(def->source.chardev, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (qemuValidateDomainChrSourceDef(def->source, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, + const virDomainDef *def) +{ + switch ((virDomainWatchdogModel) dev->model) { + case VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog can go only on PCI bus"= ), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_IB700: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog can go only on ISA bus"= ), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is virtual and cannot g= o on any bus."), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + if (!(ARCH_IS_S390(def->os.arch))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is allowed for s390 and= s390x only"), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_LAST: + break; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 437daebecd..d2238445be 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -30,3 +30,14 @@ int qemuValidateDomainDeviceDefAddress(const virDomainDe= viceDef *dev, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainChrDef(const virDomainChrDef *dev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainRNGDef(const virDomainRNGDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, + const virDomainDef *def); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258331; cv=none; d=zohomail.com; s=zohoarc; b=dB1+YbwIEVcxZL18WS/6fDH+5cBGCBh21s7/YgHMxC3zKgK2y73zAPEUymPRrB42AF4WvaabRa6MqLwhw72bSrPeZul4DgrOAReIh7v9379X0UgkxWsyLVfhF00kSCzD/SK/MKIkIS+sn/GBkL5d3xPWjt/8O5gwdVrsn2UL7Y8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258331; 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=9n1gThIOl/7p+rDIVHX+ih7cIY2Qm9UCnS0ODPn+E8I=; b=ODK1+eoPDSW6VAQoxdMFdWP0FMlrMkDMoLU6hFhl2fWfxlfyQsGWcDFdn1Ql1ZFVcBWUWPafyzviNNfpwBl+xakJeQzEIxSy3toirRMwkiC1Ugi81eXhnAFvNYn6LTavdwbyKRWQWI069F1pBPUI5HdZLg7L5o31KHpwFM0SJp4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258331606628.7744933262107; Thu, 26 Mar 2020 14:32:11 -0700 (PDT) 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-296-xU_nhbLiPNmTKTgG-R5pZA-1; Thu, 26 Mar 2020 17:32:06 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 78CA48017DF; Thu, 26 Mar 2020 21:32:01 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8C6C95C1D6; Thu, 26 Mar 2020 21:32:00 +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 4EF0F8A042; Thu, 26 Mar 2020 21:31:57 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVtuW010263 for ; Thu, 26 Mar 2020 17:31:55 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3BC1C105541C; Thu, 26 Mar 2020 21:31:55 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 375181055419 for ; Thu, 26 Mar 2020 21:31:55 +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 D6B0D101A55F for ; Thu, 26 Mar 2020 21:31:54 +0000 (UTC) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-246-XxuBt-vuOWO-2XFuDx_KOw-1; Thu, 26 Mar 2020 17:31:52 -0400 Received: by mail-qk1-f193.google.com with SMTP id b62so8694155qkf.6; Thu, 26 Mar 2020 14:31:52 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258329; 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=9n1gThIOl/7p+rDIVHX+ih7cIY2Qm9UCnS0ODPn+E8I=; b=QyCMJa9PxlPkLJTalS7y1y/sw6CNuL0mU+RLuWIhS+unZiJOPLYuOlz36aOiqs5azRyw13 we56pKerIdEUGQP/R7UqZLMHlaHKpdNQPY6hCqN0isOyVJxv7f21FCD5KL7iwMYZRTgJV4 wOS0BSs0wO0uUZM0+WVfDrw6EVk+d7g= X-MC-Unique: xU_nhbLiPNmTKTgG-R5pZA-1 X-MC-Unique: XxuBt-vuOWO-2XFuDx_KOw-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=jB8W8qAIEjQnxQwAf8EisPSsdz8PrdqdJBWej7Gpb3A=; b=qFjIgoEcY4VOu2aW5h5qhthVMnpCiZ27Jkv4XaNyFURyU1hiKduBu0wowEzcf1jb+A u8T/dwuCeVCj8furAllFlyRPHXIAvDx9tXLDd1uAduI8z1evJTWIkQwIS+aS6HCgXt2A kFviTmoy9sGe2SI5VrgJSiSjkzPOt8M66Y9k6DkI0asRGyt9AUadlmDOUTSckPaHyiOJ wIRaQgorYfNUWpi2DZznsEKz8Ck0z7m21LJH7CMLPBG6N28SBCv7TGOSyR3c9Y5+cVmU RVpc8W8cYXtAOCj30xhN/BY/kuDDk59KrjCLxogpB+7jayCvpwBT+s2ahWS/drQPqpEB +G1A== X-Gm-Message-State: ANhLgQ1KeaQYyctVPjBVf391qNP/XNUilOFmQfZMIsCR+idN17NjZ4NU jIHTDGk0lZoZWG6vPoTylDgmaW8T X-Google-Smtp-Source: ADFU+vuWqqND/M7pZi/p5sWf5d35BT3ps9sU/J5D6bCz/6KoEhd62tYxSeHDdRo7G2qnkn4blt6JUw== X-Received: by 2002:a37:bd81:: with SMTP id n123mr10853569qkf.269.1585258311264; Thu, 26 Mar 2020 14:31:51 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 07/15] qemu: move qemuDomainDeviceDefValidateHostdev() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:17 -0300 Message-Id: <20200326213125.2306013-8-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVtuW010263 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.16 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" This function alone requires other 3 static functions to be moved as well, thus let's move it in its own patch. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 190 +-------------------------------------- src/qemu/qemu_validate.c | 188 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 3 + 3 files changed, 192 insertions(+), 189 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4726fa015d..25b889b2d6 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5245,194 +5245,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDe= f *net, } =20 =20 -static int -qemuDomainMdevDefVFIOPCIValidate(const virDomainHostdevDef *hostdev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const virDomainHostdevSubsysMediatedDev *dev; - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("VFIO PCI device assignment is not " - "supported by this version of QEMU")); - return -1; - } - - /* VFIO-PCI does not support boot */ - if (hostdev->info->bootIndex) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("booting from assigned devices is not " - "supported by mediated devices of " - "model vfio-pci")); - return -1; - } - - dev =3D &hostdev->source.subsys.u.mdev; - if (dev->display =3D=3D VIR_TRISTATE_SWITCH_ABSENT) - return 0; - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("display property of device vfio-pci is " - "not supported by this version of QEMU")); - return -1; - } - - if (dev->model !=3D VIR_MDEV_MODEL_TYPE_VFIO_PCI) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _(" attribute 'display' is only supported" - " with model=3D'vfio-pci'")); - - return -1; - } - - if (dev->display =3D=3D VIR_TRISTATE_SWITCH_ON) { - if (def->ngraphics =3D=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("graphics device is needed for attribute valu= e " - "'display=3Don' in ")); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainMdevDefVFIOAPValidate(const virDomainHostdevDef *hostdev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - size_t i; - bool vfioap_found =3D false; - - 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; - } - - /* VFIO-AP does not support boot */ - if (hostdev->info->bootIndex) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("booting from assigned devices is not " - "supported by mediated devices of " - "model vfio-ap")); - return -1; - } - - /* VFIO-AP is restricted to a single mediated device only */ - for (i =3D 0; i < def->nhostdevs; i++) { - virDomainHostdevDefPtr hdev =3D def->hostdevs[i]; - - if (virHostdevIsMdevDevice(hdev) && - hdev->source.subsys.u.mdev.model =3D=3D VIR_MDEV_MODEL_TYPE_VF= IO_AP) { - if (vfioap_found) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Only one hostdev of model vfio-ap is " - "supported")); - return -1; - } - vfioap_found =3D true; - } - } - - return 0; -} - - -static int -qemuDomainMdevDefValidate(const virDomainHostdevDef *hostdev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const virDomainHostdevSubsysMediatedDev *mdevsrc; - - mdevsrc =3D &hostdev->source.subsys.u.mdev; - switch ((virMediatedDeviceModelType) mdevsrc->model) { - case VIR_MDEV_MODEL_TYPE_VFIO_PCI: - return qemuDomainMdevDefVFIOPCIValidate(hostdev, def, qemuCaps); - case VIR_MDEV_MODEL_TYPE_VFIO_AP: - return qemuDomainMdevDefVFIOAPValidate(hostdev, def, qemuCaps); - case VIR_MDEV_MODEL_TYPE_VFIO_CCW: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("VFIO CCW device assignment is not " - "supported by this version of QEMU")); - return -1; - } - break; - case VIR_MDEV_MODEL_TYPE_LAST: - default: - virReportEnumRangeError(virMediatedDeviceModelType, - mdevsrc->model); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - int backend; - - /* forbid capabilities mode hostdev in this kind of hypervisor */ - if (hostdev->mode =3D=3D VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("hostdev mode 'capabilities' is not " - "supported in %s"), - virDomainVirtTypeToString(def->virtType)); - return -1; - } - - if (hostdev->mode =3D=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { - switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) { - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: - break; - - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: - backend =3D hostdev->source.subsys.u.pci.backend; - - if (backend =3D=3D 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 " - "supported by this version of qemu")); - return -1; - } - } - break; - - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: - if (hostdev->info->bootIndex) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("booting from assigned devices is not " - "supported by vhost SCSI devices")); - return -1; - } - break; - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: - return qemuDomainMdevDefValidate(hostdev, def, qemuCaps); - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - default: - virReportEnumRangeError(virDomainHostdevSubsysType, - hostdev->source.subsys.type); - return -1; - } - } - - return 0; -} - - static int qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video, virQEMUCapsPtr qemuCaps) @@ -7256,7 +7068,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_HOSTDEV: - ret =3D qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def, + ret =3D qemuValidateDomainDeviceDefHostdev(dev->data.hostdev, def, qemuCaps); break; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 9b67c753c2..62ecca3c84 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1531,3 +1531,191 @@ qemuValidateDomainWatchdogDef(const virDomainWatchd= ogDef *dev, =20 return 0; } + + +static int +qemuValidateDomainMdevDefVFIOPCI(const virDomainHostdevDef *hostdev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const virDomainHostdevSubsysMediatedDev *dev; + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VFIO PCI device assignment is not " + "supported by this version of QEMU")); + return -1; + } + + /* VFIO-PCI does not support boot */ + if (hostdev->info->bootIndex) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("booting from assigned devices is not " + "supported by mediated devices of " + "model vfio-pci")); + return -1; + } + + dev =3D &hostdev->source.subsys.u.mdev; + if (dev->display =3D=3D VIR_TRISTATE_SWITCH_ABSENT) + return 0; + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("display property of device vfio-pci is " + "not supported by this version of QEMU")); + return -1; + } + + if (dev->model !=3D VIR_MDEV_MODEL_TYPE_VFIO_PCI) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _(" attribute 'display' is only supported" + " with model=3D'vfio-pci'")); + + return -1; + } + + if (dev->display =3D=3D VIR_TRISTATE_SWITCH_ON) { + if (def->ngraphics =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("graphics device is needed for attribute valu= e " + "'display=3Don' in ")); + return -1; + } + } + + return 0; +} + + +static int +qemuValidateDomainMdevDefVFIOAP(const virDomainHostdevDef *hostdev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + bool vfioap_found =3D false; + + 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; + } + + /* VFIO-AP does not support boot */ + if (hostdev->info->bootIndex) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("booting from assigned devices is not " + "supported by mediated devices of " + "model vfio-ap")); + return -1; + } + + /* VFIO-AP is restricted to a single mediated device only */ + for (i =3D 0; i < def->nhostdevs; i++) { + virDomainHostdevDefPtr hdev =3D def->hostdevs[i]; + + if (virHostdevIsMdevDevice(hdev) && + hdev->source.subsys.u.mdev.model =3D=3D VIR_MDEV_MODEL_TYPE_VF= IO_AP) { + if (vfioap_found) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only one hostdev of model vfio-ap is " + "supported")); + return -1; + } + vfioap_found =3D true; + } + } + + return 0; +} + + +static int +qemuValidateDomainMdevDef(const virDomainHostdevDef *hostdev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const virDomainHostdevSubsysMediatedDev *mdevsrc; + + mdevsrc =3D &hostdev->source.subsys.u.mdev; + switch ((virMediatedDeviceModelType) mdevsrc->model) { + case VIR_MDEV_MODEL_TYPE_VFIO_PCI: + return qemuValidateDomainMdevDefVFIOPCI(hostdev, def, qemuCaps); + case VIR_MDEV_MODEL_TYPE_VFIO_AP: + return qemuValidateDomainMdevDefVFIOAP(hostdev, def, qemuCaps); + case VIR_MDEV_MODEL_TYPE_VFIO_CCW: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VFIO CCW device assignment is not " + "supported by this version of QEMU")); + return -1; + } + break; + case VIR_MDEV_MODEL_TYPE_LAST: + default: + virReportEnumRangeError(virMediatedDeviceModelType, + mdevsrc->model); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + int backend; + + /* forbid capabilities mode hostdev in this kind of hypervisor */ + if (hostdev->mode =3D=3D VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hostdev mode 'capabilities' is not " + "supported in %s"), + virDomainVirtTypeToString(def->virtType)); + return -1; + } + + if (hostdev->mode =3D=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { + switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: + break; + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + backend =3D hostdev->source.subsys.u.pci.backend; + + if (backend =3D=3D 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 " + "supported by this version of qemu")); + return -1; + } + } + break; + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + if (hostdev->info->bootIndex) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("booting from assigned devices is not " + "supported by vhost SCSI devices")); + return -1; + } + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + return qemuValidateDomainMdevDef(hostdev, def, qemuCaps); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportEnumRangeError(virDomainHostdevSubsysType, + hostdev->source.subsys.type); + return -1; + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index d2238445be..ca1449c27f 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -41,3 +41,6 @@ int qemuValidateDomainRedirdevDef(const virDomainRedirdev= Def *def, virQEMUCapsPtr qemuCaps); int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, const virDomainDef *def); +int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258350; cv=none; d=zohomail.com; s=zohoarc; b=TkukKtHYDduf8v2JR5zcUsxgGt7Kmo94nIplQCQ7lNWO6zN5IYj5tjCwwPibiInpWbg+D3pBpjLjBEUi2qViadtTP0JOhhNvtH4Ej99AO4xvS1NfyKvX/DuagiSv4/b1owShe7jqILisAhJdYLDMCOTEeAtkcGDsCrjUufXoqn8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258350; 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=YGjnXZzbmmmpIbifzyouFNoalER9CPcl1L5zIaBF92E=; b=R3wt5sbBR9GM42dWIP2VY+hz0cUaGIqmHgGQPX6xdRIVqtY8M+8tuj8u4DyJ+XIbuAFzYcwbnFJgo9fR4vug8vfrghjqbFhbjlCBp6acAv0sT5QchLBvOaZlIMqY8K8w5e4/3OKBStNr7A/8l9Wuk2d5GA590/wJG/iHuHSYCnI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258350484652.9814270728766; Thu, 26 Mar 2020 14:32:30 -0700 (PDT) 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-482-7Nh17gAtNNeuJpP72hgcvg-1; Thu, 26 Mar 2020 17:32:27 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 927F818C35A3; Thu, 26 Mar 2020 21:32:21 +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 6048310027AF; Thu, 26 Mar 2020 21:32:21 +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 0889B18089C8; Thu, 26 Mar 2020 21:32:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVupS010277 for ; Thu, 26 Mar 2020 17:31:56 -0400 Received: by smtp.corp.redhat.com (Postfix) id 839A81055419; Thu, 26 Mar 2020 21:31:56 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7EADD105541B for ; Thu, 26 Mar 2020 21:31:56 +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 617EE101A55A for ; Thu, 26 Mar 2020 21:31:56 +0000 (UTC) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-480-bQtFsRAJNaWWBnPvDu0i7g-1; Thu, 26 Mar 2020 17:31:54 -0400 Received: by mail-qk1-f193.google.com with SMTP id x3so8679639qki.4; Thu, 26 Mar 2020 14:31:53 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258349; 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=YGjnXZzbmmmpIbifzyouFNoalER9CPcl1L5zIaBF92E=; b=H64lfjnecn+yUmjQfTUlH3XmEWtwBGUk81YUNpqPqcP9+n7kQfo+J5L0INVnB78NMZX/Dr ZuMtPD36eb/Zij754WEGRkK5UGyaf0tqsBHXTZZQU9s3VKjerpdO5R413uUxZ0bRpHoOLx n/yGfPpvUfu5eOdv6HXlzRO6UCXhNgE= X-MC-Unique: 7Nh17gAtNNeuJpP72hgcvg-1 X-MC-Unique: bQtFsRAJNaWWBnPvDu0i7g-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=IuLEzyJlMvIERfBpLrheZ9w90ZsdO8YAaAQ7IZA2GKs=; b=LJqbjuH1Oo/15CdnBn5Q8lsut8pvFWQaec/Oh3I+826JRlsQN2fOKI1egQQlF/dNDV 7vfA4KsAJTAq2t8KoI4L2NXn2i1HKipn2F11V/qQidTDuheYywiU8WwkaR0wm0g0wzu0 SxwBiJbIJ8NhLybOFz19A/ujUWdlHX9kuW/DkH9I5Ao93a8j7Bw3s9oj5zLa4UMuGn3y bQl9/vKTD52iN6axto5VuQrb8ov6LSs1awHZ0q9cVR+fBTa9uxp9LWadVl2vPP+c62gl P2pJCcpY8zjLLIeryfjfMka+GBBitdrqnMHCQfEaN3YAjCtzCO76lTnXf/EkWRXOFWn3 At1Q== X-Gm-Message-State: ANhLgQ13whJddQ1ifpktOk1RPobcI16Sk+KRy0gY6WWQDmYw3BwLhWG6 xybllu30oOnAhSe/xmLThbJ3wAOc X-Google-Smtp-Source: ADFU+vvjHhxEH8AiEMjd4pNmfV94p12yfNq7LNbi2Z5gCyUGPuF7UZ3821NUlTOiaOFktnN/BveWWQ== X-Received: by 2002:a37:aa54:: with SMTP id t81mr11267234qke.234.1585258313082; Thu, 26 Mar 2020 14:31:53 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 08/15] qemu: move qemuDomainDeviceDefValidateVideo() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:18 -0300 Message-Id: <20200326213125.2306013-9-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVupS010277 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.22 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" Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 98 +--------------------------------------- src/qemu/qemu_validate.c | 96 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 2 + 3 files changed, 99 insertions(+), 97 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 25b889b2d6..6fa2326edc 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5245,102 +5245,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDe= f *net, } =20 =20 -static int -qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video, - virQEMUCapsPtr qemuCaps) -{ - /* there's no properties to validate for NONE video devices */ - if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_NONE) - return 0; - - if (!video->primary && - video->type !=3D VIR_DOMAIN_VIDEO_TYPE_QXL && - video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("video type '%s' is only valid as primary " - "video device"), - virDomainVideoTypeToString(video->type)); - return -1; - } - - if (video->accel && video->accel->accel2d =3D=3D VIR_TRISTATE_SWITCH_O= N) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("qemu does not support the accel2d setting")); - return -1; - } - - if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_QXL) { - if (video->vram > (UINT_MAX / 1024)) { - virReportError(VIR_ERR_OVERFLOW, - _("value for 'vram' must be less than '%u'"), - UINT_MAX / 1024); - return -1; - } - if (video->ram > (UINT_MAX / 1024)) { - virReportError(VIR_ERR_OVERFLOW, - _("value for 'ram' must be less than '%u'"), - UINT_MAX / 1024); - return -1; - } - if (video->vgamem) { - if (video->vgamem < 1024) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("value for 'vgamem' must be at least 1 Mi= B " - "(1024 KiB)")); - return -1; - } - - if (video->vgamem !=3D VIR_ROUND_UP_POWER_OF_TWO(video->vgamem= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("value for 'vgamem' must be power of two"= )); - return -1; - } - } - } - - if (video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VGA && - video->type !=3D VIR_DOMAIN_VIDEO_TYPE_QXL && - video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO && - video->type !=3D VIR_DOMAIN_VIDEO_TYPE_BOCHS) { - if (video->res) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("model resolution is not supported")); - return -1; - } - } - - if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VGA || - video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VMVGA) { - if (video->vram && video->vram < 1024) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - "%s", _("value for 'vram' must be at least " - "1 MiB (1024 KiB)")); - return -1; - } - } - - if (video->backend =3D=3D VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) { - if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_GPU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU does not support 'vhost-user' vide= o device")); - return -1; - } - } else if (video->accel) { - if (video->accel->accel3d =3D=3D VIR_TRISTATE_SWITCH_ON && - (video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO || - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s 3d acceleration is not supported"), - virDomainVideoTypeToString(video->type)); - return -1; - } - } - - return 0; -} - - int qemuDomainValidateStorageSource(virStorageSourcePtr src, virQEMUCapsPtr qemuCaps) @@ -7073,7 +6977,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_VIDEO: - ret =3D qemuDomainDeviceDefValidateVideo(dev->data.video, qemuCaps= ); + ret =3D qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps= ); break; =20 case VIR_DOMAIN_DEVICE_DISK: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 62ecca3c84..0caec1fce3 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1719,3 +1719,99 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHo= stdevDef *hostdev, =20 return 0; } + + +int +qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video, + virQEMUCapsPtr qemuCaps) +{ + /* there's no properties to validate for NONE video devices */ + if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_NONE) + return 0; + + if (!video->primary && + video->type !=3D VIR_DOMAIN_VIDEO_TYPE_QXL && + video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type '%s' is only valid as primary " + "video device"), + virDomainVideoTypeToString(video->type)); + return -1; + } + + if (video->accel && video->accel->accel2d =3D=3D VIR_TRISTATE_SWITCH_O= N) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("qemu does not support the accel2d setting")); + return -1; + } + + if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_QXL) { + if (video->vram > (UINT_MAX / 1024)) { + virReportError(VIR_ERR_OVERFLOW, + _("value for 'vram' must be less than '%u'"), + UINT_MAX / 1024); + return -1; + } + if (video->ram > (UINT_MAX / 1024)) { + virReportError(VIR_ERR_OVERFLOW, + _("value for 'ram' must be less than '%u'"), + UINT_MAX / 1024); + return -1; + } + if (video->vgamem) { + if (video->vgamem < 1024) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("value for 'vgamem' must be at least 1 Mi= B " + "(1024 KiB)")); + return -1; + } + + if (video->vgamem !=3D VIR_ROUND_UP_POWER_OF_TWO(video->vgamem= )) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("value for 'vgamem' must be power of two"= )); + return -1; + } + } + } + + if (video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VGA && + video->type !=3D VIR_DOMAIN_VIDEO_TYPE_QXL && + video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO && + video->type !=3D VIR_DOMAIN_VIDEO_TYPE_BOCHS) { + if (video->res) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("model resolution is not supported")); + return -1; + } + } + + if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VGA || + video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VMVGA) { + if (video->vram && video->vram < 1024) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("value for 'vram' must be at least " + "1 MiB (1024 KiB)")); + return -1; + } + } + + if (video->backend =3D=3D VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) { + if (video->type =3D=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_GPU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU does not support 'vhost-user' vide= o device")); + return -1; + } + } else if (video->accel) { + if (video->accel->accel3d =3D=3D VIR_TRISTATE_SWITCH_ON && + (video->type !=3D VIR_DOMAIN_VIDEO_TYPE_VIRTIO || + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s 3d acceleration is not supported"), + virDomainVideoTypeToString(video->type)); + return -1; + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index ca1449c27f..387c6ce556 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -44,3 +44,5 @@ int qemuValidateDomainWatchdogDef(const virDomainWatchdog= Def *dev, int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, const virDomainDef *def, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258434; cv=none; d=zohomail.com; s=zohoarc; b=QH6MJlOBnp6tqNxaKlF2bWoNn9dHFw7yY3Hf7jgybHlXw0Uuu2gT42s++kXPqIi4U7871eRqQU64KzrTfaaA7xr6LeV6aX0SuJJbDU8eYXni4gYxf4C3wNRg9JeEMIyX9GpJBn4AoV4SMN5vqCvCNB6iuimsoqzePJdzK2YIg/A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258434; 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=+ZMjt6KiVG2jeQIBTQ15KHVJVqMHDqBV4xvAErbdvKo=; b=Atiq+JqNUTuZXRZoAEMBp5t8/M/3tMoqeYazD/eFqU5bNL4NwXPQr91ppejJuYKbQDw0uitnA4BuI1P7wvfzNr4HrXwSL0tn8pczduMg6+8q4o02QuYqx2TJaecBS01ww9bPaXnbyOk7ha3AgZJofJv/T3kDYRBn0z0jvIizyYU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258434389566.9607596925421; Thu, 26 Mar 2020 14:33:54 -0700 (PDT) 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-426-3XFSgOzcO5Kc_WCkTYuE0g-1; Thu, 26 Mar 2020 17:33:50 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 86EF9801E70; Thu, 26 Mar 2020 21:33:44 +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 5FFFC92FA5; Thu, 26 Mar 2020 21:33:44 +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 18A8D18089D5; Thu, 26 Mar 2020 21:33:44 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLW2lo010298 for ; Thu, 26 Mar 2020 17:32:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id AD3702037E45; Thu, 26 Mar 2020 21:32:02 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A93252026D67 for ; Thu, 26 Mar 2020 21:32:00 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (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 202338F7834 for ; Thu, 26 Mar 2020 21:32:00 +0000 (UTC) Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-463-gvg_saQtOiC3GQmHG3WQfg-1; Thu, 26 Mar 2020 17:31:56 -0400 Received: by mail-qt1-f193.google.com with SMTP id z12so6898456qtq.5; Thu, 26 Mar 2020 14:31:55 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258433; 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=+ZMjt6KiVG2jeQIBTQ15KHVJVqMHDqBV4xvAErbdvKo=; b=CsTdynxcETbjDJ2XXzIr4DSU3PmIrYhFu/evSrjwgbGlRMNLJJ7q2Ds4OYurJ6V2v5UZL+ 0zd0Qz2r2N1XY3kEODkK3MnaW8+bAqRFMNlTK0BoIf++8FE/Z9Sy8sxa6e4B37p1kL2ubx Kjwj8Z9mf4QAOrDYLgwFIShxcl4zbSM= X-MC-Unique: 3XFSgOzcO5Kc_WCkTYuE0g-1 X-MC-Unique: gvg_saQtOiC3GQmHG3WQfg-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=MEKsOIY2yaNHzvgHZIIAcWqSd60w1HBRsGSvV/zWo30=; b=pqzZBLNkc7nNtoUTlmBBOlBFJSwBVL6se7jF/V3yeOCLaeII8wkDD+YI0RyQ2mecWK KmR2W8ZMlQqtaKbfI8UWYL9uc95ZL4x1v+aHv+TOoF2AysBToc2Pnfhq3/9t6yyl4YNk NqiDbF0iAx2cczjpz8L4+WUqSwzfWQNWdvfCciTyXV2nqE1IKTjUVQfRIcduRclmBPmh Od++ToJiMl45EBoVUF4+blOz4iNULf9N2RmnE034a6+4lZeadBY6XcoYmkzyunHRPumu 51HfSNNOP26TVWPBIIdLznGvTwoPMY8o5ysU2LpV7GTOMFoTdDPM4+5Md3SL/AdnferZ 1Tpw== X-Gm-Message-State: ANhLgQ3IEW9wGGycyj1cdsyFCyLzBlfpp6vZiPzIlpmnLH2regNiughF nVUQAomPc4lCT8bRyGQEBq/LFhHa X-Google-Smtp-Source: ADFU+vsN3NiUC8GfPc7p/9Gr+Av6sCVuQlnmrcD/CbRUN4gr1YW3+Ko22nQb3i5objny691wDNaoYw== X-Received: by 2002:ac8:4416:: with SMTP id j22mr10562952qtn.85.1585258314908; Thu, 26 Mar 2020 14:31:54 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 09/15] qemu: move qemuDomainDeviceDefValidateDisk() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:19 -0300 Message-Id: <20200326213125.2306013-10-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLW2lo010298 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.13 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" This function will remain public due to its usage in qemublocktest.c even after moving qemuDomainDeviceDefValidate(). The position of its header in qemu_validate.h is no accident. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 100 +-------------------------------------- src/qemu/qemu_validate.c | 99 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 2 + tests/qemublocktest.c | 3 +- 4 files changed, 104 insertions(+), 100 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6fa2326edc..2b3dea9d3f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5421,104 +5421,6 @@ qemuDomainValidateStorageSource(virStorageSourcePtr= src, } =20 =20 -int -qemuDomainDeviceDefValidateDisk(const virDomainDiskDef *disk, - virQEMUCapsPtr qemuCaps) -{ - const char *driverName =3D virDomainDiskGetDriver(disk); - virStorageSourcePtr n; - int idx; - int partition; - - if (disk->src->shared && !disk->src->readonly && - !qemuBlockStorageSourceSupportsConcurrentAccess(disk->src)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("shared access for disk '%s' requires use of " - "supported storage format"), disk->dst); - return -1; - } - - if (disk->copy_on_read =3D=3D VIR_TRISTATE_SWITCH_ON) { - if (disk->src->readonly) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("copy_on_read is not compatible with read-onl= y disk '%s'"), - disk->dst); - return -1; - } - - if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM || - disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_FLOPPY) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("copy_on_read is not supported with removable= disk '%s'"), - disk->dst); - return -1; - } - } - - if (disk->geometry.cylinders > 0 && - disk->geometry.heads > 0 && - disk->geometry.sectors > 0) { - if (disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_USB || - disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_SD) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("CHS geometry can not be set for '%s' bus"), - virDomainDiskBusTypeToString(disk->bus)); - return -1; - } - - if (disk->geometry.trans !=3D VIR_DOMAIN_DISK_TRANS_DEFAULT && - disk->bus !=3D VIR_DOMAIN_DISK_BUS_IDE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("CHS translation mode can only be set for 'id= e' bus not '%s'"), - virDomainDiskBusTypeToString(disk->bus)); - return -1; - } - } - - if (disk->serial && disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_SD) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Serial property not supported for drive bus '%s'= "), - virDomainDiskBusTypeToString(disk->bus)); - return -1; - } - - if (driverName && STRNEQ(driverName, "qemu")) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported driver name '%s' for disk '%s'"), - driverName, disk->dst); - return -1; - } - - if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM && - disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_VIRTIO) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("disk type 'virtio' of '%s' does not support ejec= table media"), - disk->dst); - return -1; - } - - if (virDiskNameParse(disk->dst, &idx, &partition) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid disk target '%s'"), disk->dst); - return -1; - } - - if (partition !=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid disk target '%s', partitions can't appea= r in disk targets"), - disk->dst); - return -1; - } - - for (n =3D disk->src; virStorageSourceIsBacking(n); n =3D n->backingSt= ore) { - if (qemuDomainValidateStorageSource(n, qemuCaps) < 0) - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidateControllerAttributes(const virDomainControllerD= ef *controller) { @@ -6981,7 +6883,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_DISK: - ret =3D qemuDomainDeviceDefValidateDisk(dev->data.disk, qemuCaps); + ret =3D qemuValidateDomainDeviceDefDisk(dev->data.disk, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_CONTROLLER: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 0caec1fce3..0f267b4abe 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -21,6 +21,7 @@ #include =20 #include "qemu_validate.h" +#include "qemu_block.h" #include "qemu_domain.h" #include "virlog.h" #include "virutil.h" @@ -1815,3 +1816,101 @@ qemuValidateDomainDeviceDefVideo(const virDomainVid= eoDef *video, =20 return 0; } + + +int +qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk, + virQEMUCapsPtr qemuCaps) +{ + const char *driverName =3D virDomainDiskGetDriver(disk); + virStorageSourcePtr n; + int idx; + int partition; + + if (disk->src->shared && !disk->src->readonly && + !qemuBlockStorageSourceSupportsConcurrentAccess(disk->src)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("shared access for disk '%s' requires use of " + "supported storage format"), disk->dst); + return -1; + } + + if (disk->copy_on_read =3D=3D VIR_TRISTATE_SWITCH_ON) { + if (disk->src->readonly) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("copy_on_read is not compatible with read-onl= y disk '%s'"), + disk->dst); + return -1; + } + + if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM || + disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("copy_on_read is not supported with removable= disk '%s'"), + disk->dst); + return -1; + } + } + + if (disk->geometry.cylinders > 0 && + disk->geometry.heads > 0 && + disk->geometry.sectors > 0) { + if (disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_USB || + disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_SD) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("CHS geometry can not be set for '%s' bus"), + virDomainDiskBusTypeToString(disk->bus)); + return -1; + } + + if (disk->geometry.trans !=3D VIR_DOMAIN_DISK_TRANS_DEFAULT && + disk->bus !=3D VIR_DOMAIN_DISK_BUS_IDE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("CHS translation mode can only be set for 'id= e' bus not '%s'"), + virDomainDiskBusTypeToString(disk->bus)); + return -1; + } + } + + if (disk->serial && disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_SD) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Serial property not supported for drive bus '%s'= "), + virDomainDiskBusTypeToString(disk->bus)); + return -1; + } + + if (driverName && STRNEQ(driverName, "qemu")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported driver name '%s' for disk '%s'"), + driverName, disk->dst); + return -1; + } + + if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM && + disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_VIRTIO) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("disk type 'virtio' of '%s' does not support ejec= table media"), + disk->dst); + return -1; + } + + if (virDiskNameParse(disk->dst, &idx, &partition) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid disk target '%s'"), disk->dst); + return -1; + } + + if (partition !=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid disk target '%s', partitions can't appea= r in disk targets"), + disk->dst); + return -1; + } + + for (n =3D disk->src; virStorageSourceIsBacking(n); n =3D n->backingSt= ore) { + if (qemuDomainValidateStorageSource(n, qemuCaps) < 0) + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 387c6ce556..ba732d05d8 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -26,6 +26,8 @@ #include "qemu_capabilities.h" =20 int qemuValidateDomainDef(const virDomainDef *def, void *opaque); +int qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk, + virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c index 124eaea752..f9fbfc98f2 100644 --- a/tests/qemublocktest.c +++ b/tests/qemublocktest.c @@ -28,6 +28,7 @@ #include "qemu/qemu_monitor_json.h" #include "qemu/qemu_backup.h" #include "qemu/qemu_checkpoint.h" +#include "qemu/qemu_validate.h" =20 #include "qemu/qemu_command.h" =20 @@ -283,7 +284,7 @@ testQemuDiskXMLToProps(const void *opaque) return -1; =20 if (qemuCheckDiskConfig(disk, vmdef, data->qemuCaps) < 0 || - qemuDomainDeviceDefValidateDisk(disk, data->qemuCaps) < 0) { + qemuValidateDomainDeviceDefDisk(disk, data->qemuCaps) < 0) { VIR_TEST_VERBOSE("invalid configuration for disk"); return -1; } --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258438; cv=none; d=zohomail.com; s=zohoarc; b=EXfkZqdl7mDnaqvipg573Afb4LhH4rTrlsHpfoa9NVvcdg7J8AU/ARHt6AADTQLL8HNfZzwu1Mdyi1c7dhXBIe4pL2Wc99NQsbnZk2LBEP+esis4IccNe3LboMEt8YwHFnvcFFJtVFA51DOx55Dpy5iivKo6UB0FFY85lubG4lM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258438; 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=4mNIaUxqyuYRJ0Tz0w92DB5JFk4hFQEzccLhnYXTStY=; b=KNNBuZECaDOBBNBb9oAiuSXa39oQDJXb11z3LYLPxnM2FjTSv0VLHivPS16UL9ZGSMyzmbZ1CYD6zJ7gbDZydAivrZK2DcvXeWQ6xm9I6Dkg1sizf18waJmKDo9dG0/km2Cc5aS35FG7349tHxQZzYqMADFf/hADiyG6738EAZ0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258438531536.5906427672246; Thu, 26 Mar 2020 14:33:58 -0700 (PDT) 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-152-VGq2wiWrPriWUdKxhfYQiA-1; Thu, 26 Mar 2020 17:33:54 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7BC58801E6C; Thu, 26 Mar 2020 21:33:48 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4E31B92F9D; Thu, 26 Mar 2020 21:33:48 +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 05C958A045; Thu, 26 Mar 2020 21:33:48 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLW3sw010306 for ; Thu, 26 Mar 2020 17:32:04 -0400 Received: by smtp.corp.redhat.com (Postfix) id D06186C330; Thu, 26 Mar 2020 21:32:03 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CA7ED120EAD for ; Thu, 26 Mar 2020 21:32:02 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 D88BB8F783B for ; Thu, 26 Mar 2020 21:32:01 +0000 (UTC) Received: from mail-qk1-f174.google.com (mail-qk1-f174.google.com [209.85.222.174]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-428-MvPlsY1INPi_5G9LAm4yxQ-1; Thu, 26 Mar 2020 17:31:59 -0400 Received: by mail-qk1-f174.google.com with SMTP id j4so8626811qkc.11; Thu, 26 Mar 2020 14:31:58 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258437; 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=4mNIaUxqyuYRJ0Tz0w92DB5JFk4hFQEzccLhnYXTStY=; b=aMQIJIEiNXNZNyII4tzMGmijGncxoNRC5jmyyPXTLR6bAH7hOLldqgq4uALFC6ZibjfKhc dhRFQatcggE+qfuIaIipXJogiKgOZAXCQiUBDMm4RJEL3XLKZACd5Gi/pdj6ey7/rNZ2kH 5WlP+HEUPN6DXPaqoM/qBEpBgRHCS6o= X-MC-Unique: VGq2wiWrPriWUdKxhfYQiA-1 X-MC-Unique: MvPlsY1INPi_5G9LAm4yxQ-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=EpeVpw8lZ+z9OZRhVnpn17gRtN17hwnroMfFVW8hwwE=; b=lykUxvcXE8eS9Z++ay3iq169iFwLDobfN8OkHXUysWGZYUrHCbKpD+sMYdkifhgELz OuintlIdcC7TFXMw4Rho/SU2qxHbyIg301H8hrvcfnlrydP/Y+zvH7XNh2hQSy/p/xEm PvV39OF6Q7pKIA/yxwyyH25NXlqqKYLUT21e5SPL4wgW2KGMvyLey4RFoPwq+0JzHbQK qIhNchTi3sa6WAnRULXTJfOJZS0z3vakgEB01HraN3W6WmkG71vCrill/QsPpDTY8+QW cyCzIf3JHD98H1Ld6fLSHD7kbhDgeBwLtxDmBWrNZRc6wKE7oMju/hTvANsCm9SVob2O NS8g== X-Gm-Message-State: ANhLgQ2JHqz/yLXvlKY82v3gkmaLK/hun+CKe2t5Fl3i+Ho5s9m4MOhy VCX7ckBubNnba+V+EgtL6JeEcBgY X-Google-Smtp-Source: ADFU+vsFNQU2FZweO2ka2TlS3y4UsXhaRkgHODHx/RT2SsrvA51p3FqCyuOmdK/8GqJoDa4kp4Vv1w== X-Received: by 2002:a37:2f41:: with SMTP id v62mr10918554qkh.207.1585258316951; Thu, 26 Mar 2020 14:31:56 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 10/15] qemu: move qemuValidateDomainDeviceDefController() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:20 -0300 Message-Id: <20200326213125.2306013-11-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLW3sw010306 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.13 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" Move the function and all its static helper functions. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 804 +-------------------------------------- src/qemu/qemu_validate.c | 804 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 3 + 3 files changed, 808 insertions(+), 803 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2b3dea9d3f..522edb8274 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5421,808 +5421,6 @@ qemuDomainValidateStorageSource(virStorageSourcePtr= src, } =20 =20 -static int -qemuDomainDeviceDefValidateControllerAttributes(const virDomainControllerD= ef *controller) -{ - if (!(controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && - (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_SCSI || - controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_TRANSITIONAL || - controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_NON_TRANSITIONAL))) { - if (controller->queues) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'queues' is only supported by virtio-scsi co= ntroller")); - return -1; - } - if (controller->cmd_per_lun) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'cmd_per_lun' is only supported by virtio-sc= si controller")); - return -1; - } - if (controller->max_sectors) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'max_sectors' is only supported by virtio-sc= si controller")); - return -1; - } - if (controller->ioeventfd) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'ioeventfd' is only supported by virtio-scsi= controller")); - return -1; - } - if (controller->iothread) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'iothread' is only supported for virtio-scsi= controller")); - return -1; - } - } - - return 0; -} - - -/** - * @qemuCaps: QEMU capabilities - * @model: SCSI model to check - * - * Using the @qemuCaps, let's ensure the provided @model can be supported - * - * Returns true if acceptable, false otherwise with error message set. - */ -static bool -qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, - int model) -{ - switch ((virDomainControllerModelSCSI) model) { - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support " - "the LSI 53C895A SCSI controller")); - return false; - } - break; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_SCSI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support " - "virtio scsi controller")); - return false; - } - break; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: - /*TODO: need checking work here if necessary */ - break; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_MPTSAS1068)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support " - "the LSI SAS1068 (MPT Fusion) controller")); - return false; - } - break; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_MEGASAS)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support " - "the LSI SAS1078 (MegaRAID) controller")); - return false; - } - break; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported controller model: %s"), - virDomainControllerModelSCSITypeToString(model)); - return false; - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unexpected SCSI controller model %d"), - model); - return false; - } - - return true; -} - - -static int -qemuDomainDeviceDefValidateControllerIDE(const virDomainControllerDef *con= troller, - const virDomainDef *def) -{ - /* first IDE controller is implicit on various machines */ - if (controller->idx =3D=3D 0 && qemuDomainHasBuiltinIDE(def)) - return 0; - - /* Since we currently only support the integrated IDE - * controller on various boards, if we ever get to here, it's - * because some other machinetype had an IDE controller - * specified, or one with a single IDE controller had multiple - * IDE controllers specified. - */ - if (qemuDomainHasBuiltinIDE(def)) - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Only a single IDE controller is supported " - "for this machine type")); - else - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("IDE controllers are unsupported for " - "this QEMU binary or machine type")); - return -1; -} - - -/* qemuDomainCheckSCSIControllerIOThreads: - * @controller: Pointer to controller def - * @def: Pointer to domain def - * - * If this controller definition has iothreads set, let's make sure the - * configuration is right before adding to the command line - * - * Returns true if either supported or there are no iothreads for controll= er; - * otherwise, returns false if configuration is not quite right. - */ -static bool -qemuDomainCheckSCSIControllerIOThreads(const virDomainControllerDef *contr= oller, - const virDomainDef *def) -{ - if (!controller->iothread) - return true; - - if (controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && - controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtio-scsi IOThreads only available for virtio " - "pci and virtio ccw controllers")); - return false; - } - - /* Can we find the controller iothread in the iothreadid list? */ - if (!virDomainIOThreadIDFind(def, controller->iothread)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("controller iothread '%u' not defined in iothread= id"), - controller->iothread); - return false; - } - - return true; -} - - -static int -qemuDomainDeviceDefValidateControllerSCSI(const virDomainControllerDef *co= ntroller, - const virDomainDef *def) -{ - switch ((virDomainControllerModelSCSI) controller->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL: - if (!qemuDomainCheckSCSIControllerIOThreads(controller, def)) - return -1; - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: - break; - } - - return 0; -} - - -/** - * virDomainControllerPCIModelNameToQEMUCaps: - * @modelName: model name - * - * Maps model names for PCI controllers (virDomainControllerPCIModelName) - * to the QEMU capabilities required to use them (virQEMUCapsFlags). - * - * Returns: the QEMU capability itself (>0) on success; 0 if no QEMU - * capability is needed; <0 on error. - */ -static int -virDomainControllerPCIModelNameToQEMUCaps(int modelName) -{ - switch ((virDomainControllerPCIModelName) modelName) { - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCI_BRIDGE: - return QEMU_CAPS_DEVICE_PCI_BRIDGE; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I82801B11_BRIDGE: - return QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_IOH3420: - return QEMU_CAPS_DEVICE_IOH3420; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X3130_UPSTREAM: - return QEMU_CAPS_DEVICE_X3130_UPSTREAM; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_XIO3130_DOWNSTREAM: - return QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB: - return QEMU_CAPS_DEVICE_PXB; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE: - return QEMU_CAPS_DEVICE_PXB_PCIE; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCIE_ROOT_PORT: - return QEMU_CAPS_DEVICE_PCIE_ROOT_PORT; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE: - return QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCIE_PCI_BRIDGE: - return QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE: - return 0; - case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_LAST: - default: - return -1; - } - - return -1; -} - - -#define virReportControllerMissingOption(cont, model, modelName, option) \ - virReportError(VIR_ERR_INTERNAL_ERROR, \ - _("Required option '%s' is not set for PCI controller "= \ - "with index '%d', model '%s' and modelName '%s'"), \ - (option), (cont->idx), (model), (modelName)); -#define virReportControllerInvalidOption(cont, model, modelName, option) \ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ - _("Option '%s' is not valid for PCI controller " \ - "with index '%d', model '%s' and modelName '%s'"), \ - (option), (cont->idx), (model), (modelName)); -#define virReportControllerInvalidValue(cont, model, modelName, option) \ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ - _("Option '%s' has invalid value for PCI controller " \ - "with index '%d', model '%s' and modelName '%s'"), \ - (option), (cont->idx), (model), (modelName)); - - -static int -qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *con= t, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) - -{ - const virDomainPCIControllerOpts *pciopts =3D &cont->opts.pciopts; - const char *model =3D virDomainControllerModelPCITypeToString(cont->mo= del); - const char *modelName =3D virDomainControllerPCIModelNameTypeToString(= pciopts->modelName); - int cap =3D virDomainControllerPCIModelNameToQEMUCaps(pciopts->modelNa= me); - - if (!model) { - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - if (!modelName) { - virReportEnumRangeError(virDomainControllerPCIModelName, pciopts->= modelName); - return -1; - } - - /* modelName */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - /* modelName should have been set automatically */ - if (pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _NONE) { - virReportControllerMissingOption(cont, model, modelName, "mode= lName"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - /* modelName must be set for pSeries guests, but it's an error - * for it to be set for any other guest */ - if (qemuDomainIsPSeries(def)) { - if (pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_= NAME_NONE) { - virReportControllerMissingOption(cont, model, modelName, "= modelName"); - return -1; - } - } else { - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NA= ME_NONE) { - virReportControllerInvalidOption(cont, model, modelName, "= modelName"); - return -1; - } - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE) { - virReportControllerInvalidOption(cont, model, modelName, "mode= lName"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* modelName (cont'd) */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE && - pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CI_BRIDGE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I= 82801B11_BRIDGE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I= OH3420 && - pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CIE_ROOT_PORT) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X= 3130_UPSTREAM) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X= IO3130_DOWNSTREAM) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= XB) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= XB_PCIE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CIE_PCI_BRIDGE) { - virReportControllerInvalidValue(cont, model, modelName, "model= Name"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* index */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (cont->idx =3D=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Index for '%s' controllers must be > 0"), - model); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - /* pSeries guests can have multiple PHBs, so it's expected that - * the index will not be zero for some of them */ - if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT && - pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE) { - break; - } - - /* For all other pci-root and pcie-root controllers, though, - * the index must be zero */ - if (cont->idx !=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Index for '%s' controllers must be 0"), - model); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* targetIndex */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - /* PHBs for pSeries guests must have been assigned a targetIndex */ - if (pciopts->targetIndex =3D=3D -1 && - pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE) { - virReportControllerMissingOption(cont, model, modelName, "targ= etIndex"); - return -1; - } - - /* targetIndex only applies to PHBs, so for any other pci-root - * controller it being present is an error */ - if (pciopts->targetIndex !=3D -1 && - pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { - virReportControllerInvalidOption(cont, model, modelName, "targ= etIndex"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->targetIndex !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "targ= etIndex"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* pcihole64 */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - if (pciopts->pcihole64 || pciopts->pcihole64size !=3D 0) { - if (!qemuDomainIsI440FX(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Setting the 64-bit PCI hole size is not " - "supported for machine '%s'"), def->os.ma= chine); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_I440FX_PCI_HOLE64_SIZE= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("64-bit PCI hole size setting is not supp= orted " - "with this QEMU binary")); - return -1; - } - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - if (pciopts->pcihole64 || pciopts->pcihole64size !=3D 0) { - if (!qemuDomainIsQ35(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Setting the 64-bit PCI hole size is not " - "supported for machine '%s'"), def->os.ma= chine); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_Q35_PCI_HOLE64_SIZE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("64-bit PCI hole size setting is not supp= orted " - "with this QEMU binary")); - return -1; - } - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->pcihole64 || - pciopts->pcihole64size !=3D 0) { - virReportControllerInvalidOption(cont, model, modelName, "pcih= ole64"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* busNr */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - if (pciopts->busNr =3D=3D -1) { - virReportControllerMissingOption(cont, model, modelName, "busN= r"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->busNr !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "busN= r"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* numaNode */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - /* numaNode can be used for these controllers, but it's not set - * automatically so it can be missing */ - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - /* Only PHBs support numaNode */ - if (pciopts->numaNode !=3D -1 && - pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { - virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); - return -1; - } - - /* However, the default PHB doesn't support numaNode */ - if (pciopts->numaNode !=3D -1 && - pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE && - pciopts->targetIndex =3D=3D 0) { - virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->numaNode !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* chassisNr */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - if (pciopts->chassisNr =3D=3D -1) { - virReportControllerMissingOption(cont, model, modelName, "chas= sisNr"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->chassisNr !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "chas= sisNr"); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - return -1; - } - - /* chassis and port */ - switch ((virDomainControllerModelPCI) cont->model) { - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: - if (pciopts->chassis =3D=3D -1) { - virReportControllerMissingOption(cont, model, modelName, "chas= sis"); - return -1; - } - if (pciopts->port =3D=3D -1) { - virReportControllerMissingOption(cont, model, modelName, "port= "); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: - if (pciopts->chassis !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "chas= sis"); - return -1; - } - if (pciopts->port !=3D -1) { - virReportControllerInvalidOption(cont, model, modelName, "port= "); - return -1; - } - break; - - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - default: - virReportEnumRangeError(virDomainControllerModelPCI, cont->model); - } - - /* QEMU device availability */ - if (cap < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown QEMU device for '%s' controller"), - modelName); - return -1; - } - if (cap > 0 && !virQEMUCapsGet(qemuCaps, cap)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The '%s' device is not supported by this QEMU bi= nary"), - modelName); - return -1; - } - - /* PHBs didn't support numaNode from the very beginning, so an extra - * capability check is required */ - if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT && - pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPA= PR_PCI_HOST_BRIDGE && - pciopts->numaNode !=3D -1 && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPAPR_PCI_HOST_BRIDGE_NUMA_NOD= E)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Option '%s' is not supported by '%s' device with= this QEMU binary"), - "numaNode", modelName); - return -1; - } - - return 0; -} - - -#undef virReportControllerInvalidValue -#undef virReportControllerInvalidOption -#undef virReportControllerMissingOption - - -static int -qemuDomainDeviceDefValidateControllerSATA(const virDomainControllerDef *co= ntroller, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - /* first SATA controller on Q35 machines is implicit */ - if (controller->idx =3D=3D 0 && qemuDomainIsQ35(def)) - return 0; - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("SATA is not supported with this QEMU binary")); - return -1; - } - return 0; -} - - -static int -qemuDomainDeviceDefValidateController(const virDomainControllerDef *contro= ller, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - int ret =3D 0; - - if (!qemuDomainCheckCCWS390AddressSupport(def, &controller->info, qemu= Caps, - "controller")) - return -1; - - if (controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && - !qemuDomainCheckSCSIControllerModel(qemuCaps, controller->model)) - return -1; - - if (qemuDomainDeviceDefValidateControllerAttributes(controller) < 0) - return -1; - - switch ((virDomainControllerType)controller->type) { - case VIR_DOMAIN_CONTROLLER_TYPE_IDE: - ret =3D qemuDomainDeviceDefValidateControllerIDE(controller, def); - break; - - case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: - ret =3D qemuDomainDeviceDefValidateControllerSCSI(controller, def); - break; - - case VIR_DOMAIN_CONTROLLER_TYPE_PCI: - ret =3D qemuDomainDeviceDefValidateControllerPCI(controller, def, - qemuCaps); - break; - - case VIR_DOMAIN_CONTROLLER_TYPE_SATA: - ret =3D qemuDomainDeviceDefValidateControllerSATA(controller, def, - qemuCaps); - break; - - case VIR_DOMAIN_CONTROLLER_TYPE_FDC: - case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: - case VIR_DOMAIN_CONTROLLER_TYPE_CCID: - case VIR_DOMAIN_CONTROLLER_TYPE_USB: - case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: - case VIR_DOMAIN_CONTROLLER_TYPE_LAST: - break; - } - - return ret; -} - - static int qemuDomainDeviceDefValidateVsock(const virDomainVsockDef *vsock, const virDomainDef *def, @@ -6887,7 +6085,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_CONTROLLER: - ret =3D qemuDomainDeviceDefValidateController(dev->data.controller= , def, + ret =3D qemuValidateDomainDeviceDefController(dev->data.controller= , def, qemuCaps); break; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 0f267b4abe..f8228f3491 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -23,6 +23,7 @@ #include "qemu_validate.h" #include "qemu_block.h" #include "qemu_domain.h" +#include "domain_conf.h" #include "virlog.h" #include "virutil.h" =20 @@ -1914,3 +1915,806 @@ qemuValidateDomainDeviceDefDisk(const virDomainDisk= Def *disk, =20 return 0; } + + +/** + * @qemuCaps: QEMU capabilities + * @model: SCSI model to check + * + * Using the @qemuCaps, let's ensure the provided @model can be supported + * + * Returns true if acceptable, false otherwise with error message set. + */ +static bool +qemuValidateCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, + int model) +{ + switch ((virDomainControllerModelSCSI) model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support " + "the LSI 53C895A SCSI controller")); + return false; + } + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_SCSI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support " + "virtio scsi controller")); + return false; + } + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: + /*TODO: need checking work here if necessary */ + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_MPTSAS1068)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support " + "the LSI SAS1068 (MPT Fusion) controller")); + return false; + } + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_MEGASAS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support " + "the LSI SAS1078 (MegaRAID) controller")); + return false; + } + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported controller model: %s"), + virDomainControllerModelSCSITypeToString(model)); + return false; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + model); + return false; + } + + return true; +} + + + +static int +qemuValidateDomainDeviceDefControllerSATA(const virDomainControllerDef *co= ntroller, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + /* first SATA controller on Q35 machines is implicit */ + if (controller->idx =3D=3D 0 && qemuDomainIsQ35(def)) + return 0; + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("SATA is not supported with this QEMU binary")); + return -1; + } + return 0; +} + + +static int +qemuValidateDomainDeviceDefControllerIDE(const virDomainControllerDef *con= troller, + const virDomainDef *def) +{ + /* first IDE controller is implicit on various machines */ + if (controller->idx =3D=3D 0 && qemuDomainHasBuiltinIDE(def)) + return 0; + + /* Since we currently only support the integrated IDE + * controller on various boards, if we ever get to here, it's + * because some other machinetype had an IDE controller + * specified, or one with a single IDE controller had multiple + * IDE controllers specified. + */ + if (qemuDomainHasBuiltinIDE(def)) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only a single IDE controller is supported " + "for this machine type")); + else + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IDE controllers are unsupported for " + "this QEMU binary or machine type")); + return -1; +} + + +/* qemuValidateCheckSCSIControllerIOThreads: + * @controller: Pointer to controller def + * @def: Pointer to domain def + * + * If this controller definition has iothreads set, let's make sure the + * configuration is right before adding to the command line + * + * Returns true if either supported or there are no iothreads for controll= er; + * otherwise, returns false if configuration is not quite right. + */ +static bool +qemuValidateCheckSCSIControllerIOThreads(const virDomainControllerDef *con= troller, + const virDomainDef *def) +{ + if (!controller->iothread) + return true; + + if (controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + controller->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtio-scsi IOThreads only available for virtio " + "pci and virtio ccw controllers")); + return false; + } + + /* Can we find the controller iothread in the iothreadid list? */ + if (!virDomainIOThreadIDFind(def, controller->iothread)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("controller iothread '%u' not defined in iothread= id"), + controller->iothread); + return false; + } + + return true; +} + + +static int +qemuValidateDomainDeviceDefControllerSCSI(const virDomainControllerDef *co= ntroller, + const virDomainDef *def) +{ + switch ((virDomainControllerModelSCSI) controller->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL: + if (!qemuValidateCheckSCSIControllerIOThreads(controller, def)) + return -1; + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + break; + } + + return 0; +} + + +/** + * virValidateControllerPCIModelNameToQEMUCaps: + * @modelName: model name + * + * Maps model names for PCI controllers (virDomainControllerPCIModelName) + * to the QEMU capabilities required to use them (virQEMUCapsFlags). + * + * Returns: the QEMU capability itself (>0) on success; 0 if no QEMU + * capability is needed; <0 on error. + */ +static int +virValidateControllerPCIModelNameToQEMUCaps(int modelName) +{ + switch ((virDomainControllerPCIModelName) modelName) { + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCI_BRIDGE: + return QEMU_CAPS_DEVICE_PCI_BRIDGE; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I82801B11_BRIDGE: + return QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_IOH3420: + return QEMU_CAPS_DEVICE_IOH3420; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X3130_UPSTREAM: + return QEMU_CAPS_DEVICE_X3130_UPSTREAM; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_XIO3130_DOWNSTREAM: + return QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB: + return QEMU_CAPS_DEVICE_PXB; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE: + return QEMU_CAPS_DEVICE_PXB_PCIE; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCIE_ROOT_PORT: + return QEMU_CAPS_DEVICE_PCIE_ROOT_PORT; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE: + return QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCIE_PCI_BRIDGE: + return QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE: + return 0; + case VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_LAST: + default: + return -1; + } + + return -1; +} + + +static int +qemuValidateDomainDeviceDefControllerAttributes(const virDomainControllerD= ef *controller) +{ + if (!(controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && + (controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_SCSI || + controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_TRANSITIONAL || + controller->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTI= O_NON_TRANSITIONAL))) { + if (controller->queues) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'queues' is only supported by virtio-scsi co= ntroller")); + return -1; + } + if (controller->cmd_per_lun) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'cmd_per_lun' is only supported by virtio-sc= si controller")); + return -1; + } + if (controller->max_sectors) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'max_sectors' is only supported by virtio-sc= si controller")); + return -1; + } + if (controller->ioeventfd) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'ioeventfd' is only supported by virtio-scsi= controller")); + return -1; + } + if (controller->iothread) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'iothread' is only supported for virtio-scsi= controller")); + return -1; + } + } + + return 0; +} + + +#define virReportControllerMissingOption(cont, model, modelName, option) \ + virReportError(VIR_ERR_INTERNAL_ERROR, \ + _("Required option '%s' is not set for PCI controller "= \ + "with index '%d', model '%s' and modelName '%s'"), \ + (option), (cont->idx), (model), (modelName)); +#define virReportControllerInvalidOption(cont, model, modelName, option) \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("Option '%s' is not valid for PCI controller " \ + "with index '%d', model '%s' and modelName '%s'"), \ + (option), (cont->idx), (model), (modelName)); +#define virReportControllerInvalidValue(cont, model, modelName, option) \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("Option '%s' has invalid value for PCI controller " \ + "with index '%d', model '%s' and modelName '%s'"), \ + (option), (cont->idx), (model), (modelName)); + + +static int +qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *con= t, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) + +{ + const virDomainPCIControllerOpts *pciopts =3D &cont->opts.pciopts; + const char *model =3D virDomainControllerModelPCITypeToString(cont->mo= del); + const char *modelName =3D virDomainControllerPCIModelNameTypeToString(= pciopts->modelName); + int cap =3D virValidateControllerPCIModelNameToQEMUCaps(pciopts->model= Name); + + if (!model) { + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + if (!modelName) { + virReportEnumRangeError(virDomainControllerPCIModelName, pciopts->= modelName); + return -1; + } + + /* modelName */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + /* modelName should have been set automatically */ + if (pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _NONE) { + virReportControllerMissingOption(cont, model, modelName, "mode= lName"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + /* modelName must be set for pSeries guests, but it's an error + * for it to be set for any other guest */ + if (qemuDomainIsPSeries(def)) { + if (pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_= NAME_NONE) { + virReportControllerMissingOption(cont, model, modelName, "= modelName"); + return -1; + } + } else { + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NA= ME_NONE) { + virReportControllerInvalidOption(cont, model, modelName, "= modelName"); + return -1; + } + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE) { + virReportControllerInvalidOption(cont, model, modelName, "mode= lName"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* modelName (cont'd) */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE && + pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CI_BRIDGE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I= 82801B11_BRIDGE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I= OH3420 && + pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CIE_ROOT_PORT) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X= 3130_UPSTREAM) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_X= IO3130_DOWNSTREAM) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= XB) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= XB_PCIE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_N= ONE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_P= CIE_PCI_BRIDGE) { + virReportControllerInvalidValue(cont, model, modelName, "model= Name"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* index */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (cont->idx =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Index for '%s' controllers must be > 0"), + model); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + /* pSeries guests can have multiple PHBs, so it's expected that + * the index will not be zero for some of them */ + if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT && + pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE) { + break; + } + + /* For all other pci-root and pcie-root controllers, though, + * the index must be zero */ + if (cont->idx !=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Index for '%s' controllers must be 0"), + model); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* targetIndex */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + /* PHBs for pSeries guests must have been assigned a targetIndex */ + if (pciopts->targetIndex =3D=3D -1 && + pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE) { + virReportControllerMissingOption(cont, model, modelName, "targ= etIndex"); + return -1; + } + + /* targetIndex only applies to PHBs, so for any other pci-root + * controller it being present is an error */ + if (pciopts->targetIndex !=3D -1 && + pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { + virReportControllerInvalidOption(cont, model, modelName, "targ= etIndex"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->targetIndex !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "targ= etIndex"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* pcihole64 */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + if (pciopts->pcihole64 || pciopts->pcihole64size !=3D 0) { + if (!qemuDomainIsI440FX(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Setting the 64-bit PCI hole size is not " + "supported for machine '%s'"), def->os.ma= chine); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_I440FX_PCI_HOLE64_SIZE= )) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("64-bit PCI hole size setting is not supp= orted " + "with this QEMU binary")); + return -1; + } + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + if (pciopts->pcihole64 || pciopts->pcihole64size !=3D 0) { + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Setting the 64-bit PCI hole size is not " + "supported for machine '%s'"), def->os.ma= chine); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_Q35_PCI_HOLE64_SIZE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("64-bit PCI hole size setting is not supp= orted " + "with this QEMU binary")); + return -1; + } + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->pcihole64 || + pciopts->pcihole64size !=3D 0) { + virReportControllerInvalidOption(cont, model, modelName, "pcih= ole64"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* busNr */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + if (pciopts->busNr =3D=3D -1) { + virReportControllerMissingOption(cont, model, modelName, "busN= r"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->busNr !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "busN= r"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* numaNode */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + /* numaNode can be used for these controllers, but it's not set + * automatically so it can be missing */ + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + /* Only PHBs support numaNode */ + if (pciopts->numaNode !=3D -1 && + pciopts->modelName !=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_S= PAPR_PCI_HOST_BRIDGE) { + virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); + return -1; + } + + /* However, the default PHB doesn't support numaNode */ + if (pciopts->numaNode !=3D -1 && + pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME= _SPAPR_PCI_HOST_BRIDGE && + pciopts->targetIndex =3D=3D 0) { + virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->numaNode !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "numa= Node"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* chassisNr */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + if (pciopts->chassisNr =3D=3D -1) { + virReportControllerMissingOption(cont, model, modelName, "chas= sisNr"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->chassisNr !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "chas= sisNr"); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + return -1; + } + + /* chassis and port */ + switch ((virDomainControllerModelPCI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: + if (pciopts->chassis =3D=3D -1) { + virReportControllerMissingOption(cont, model, modelName, "chas= sis"); + return -1; + } + if (pciopts->port =3D=3D -1) { + virReportControllerMissingOption(cont, model, modelName, "port= "); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + if (pciopts->chassis !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "chas= sis"); + return -1; + } + if (pciopts->port !=3D -1) { + virReportControllerInvalidOption(cont, model, modelName, "port= "); + return -1; + } + break; + + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + } + + /* QEMU device availability */ + if (cap < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown QEMU device for '%s' controller"), + modelName); + return -1; + } + if (cap > 0 && !virQEMUCapsGet(qemuCaps, cap)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' device is not supported by this QEMU bi= nary"), + modelName); + return -1; + } + + /* PHBs didn't support numaNode from the very beginning, so an extra + * capability check is required */ + if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT && + pciopts->modelName =3D=3D VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPA= PR_PCI_HOST_BRIDGE && + pciopts->numaNode !=3D -1 && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPAPR_PCI_HOST_BRIDGE_NUMA_NOD= E)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Option '%s' is not supported by '%s' device with= this QEMU binary"), + "numaNode", modelName); + return -1; + } + + return 0; +} + + +#undef virReportControllerInvalidValue +#undef virReportControllerInvalidOption +#undef virReportControllerMissingOption + + +int +qemuValidateDomainDeviceDefController(const virDomainControllerDef *contro= ller, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + int ret =3D 0; + + if (!qemuDomainCheckCCWS390AddressSupport(def, &controller->info, qemu= Caps, + "controller")) + return -1; + + if (controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && + !qemuValidateCheckSCSIControllerModel(qemuCaps, controller->model)) + return -1; + + if (qemuValidateDomainDeviceDefControllerAttributes(controller) < 0) + return -1; + + switch ((virDomainControllerType)controller->type) { + case VIR_DOMAIN_CONTROLLER_TYPE_IDE: + ret =3D qemuValidateDomainDeviceDefControllerIDE(controller, def); + break; + + case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: + ret =3D qemuValidateDomainDeviceDefControllerSCSI(controller, def); + break; + + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: + ret =3D qemuValidateDomainDeviceDefControllerPCI(controller, def, + qemuCaps); + break; + + case VIR_DOMAIN_CONTROLLER_TYPE_SATA: + ret =3D qemuValidateDomainDeviceDefControllerSATA(controller, def, + qemuCaps); + break; + + case VIR_DOMAIN_CONTROLLER_TYPE_FDC: + case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: + case VIR_DOMAIN_CONTROLLER_TYPE_CCID: + case VIR_DOMAIN_CONTROLLER_TYPE_USB: + case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + break; + } + + return ret; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index ba732d05d8..85efa9354f 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -48,3 +48,6 @@ int qemuValidateDomainDeviceDefHostdev(const virDomainHos= tdevDef *hostdev, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefController(const virDomainControllerDef *co= ntroller, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258360; cv=none; d=zohomail.com; s=zohoarc; b=UkQ5VujhEvA3ltWu7dxJS5RtZaJvDphX2ktg0UpIQuFVzKP5H2BKNRhD1sOxdnZ1gcoC16kcjmQSpNP9TQ6DJK6mm07DGZvj78Qaq0gdQCeYIh6zhVCwkXkva9ZseRqrh2ltcph1f4PKpS7ofrdtx1ZJQ70pPccSl5pTRC88CvI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258360; 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=B1497Yy6TLCGMenWFQw4pOy8tBq1rrsQbrYDowI/hJ8=; b=hl+wQCXnawf/8re7oJezLjyxP2kAp/cr08mm6+yL1m5wzBDMu6gcJ1+StHPXrabHvzSCJYFL4UfqMWGyGdyzna/cvOfBc4N9iV+cacUtw8Dh/2sADZ3YNfphe3Qtj7/ksXN10axIIWnJVBZtkNHqAMDj1OtIBnF4LfBVPAO30gc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258359996977.566922903103; Thu, 26 Mar 2020 14:32:39 -0700 (PDT) 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-299-g7JWk8dEPf6OccaDhusLyQ-1; Thu, 26 Mar 2020 17:32:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0BCA5107ACCC; Thu, 26 Mar 2020 21:32:17 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CE9625C1D8; Thu, 26 Mar 2020 21:32:16 +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 6F5B68A042; Thu, 26 Mar 2020 21:32:16 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLW7O0010324 for ; Thu, 26 Mar 2020 17:32:07 -0400 Received: by smtp.corp.redhat.com (Postfix) id 602192037E4F; Thu, 26 Mar 2020 21:32:07 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 58E842026D67 for ; Thu, 26 Mar 2020 21:32:07 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 39674101A55F for ; Thu, 26 Mar 2020 21:32:07 +0000 (UTC) Received: from mail-qk1-f180.google.com (mail-qk1-f180.google.com [209.85.222.180]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-402-dNl2izaSOHqRTK-LBROgPA-1; Thu, 26 Mar 2020 17:32:00 -0400 Received: by mail-qk1-f180.google.com with SMTP id c145so8637635qke.12; Thu, 26 Mar 2020 14:31:59 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258358; 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=B1497Yy6TLCGMenWFQw4pOy8tBq1rrsQbrYDowI/hJ8=; b=fs6FYZWZd364oEhtZJfsiVFXc/hRpXAgebhjS08AyTTb4qWM90JxQZrPCMQUaIRTCR55JK HvAdO6BeeP7LPUEnmLeKNTJoLD4aw5v/BYLIiRk0Sy59fh4sannDoi7y/+3VxFgBrxMtux iiZwCzIGPizI2D0iB5cq5RWHJT1ejpc= X-MC-Unique: g7JWk8dEPf6OccaDhusLyQ-1 X-MC-Unique: dNl2izaSOHqRTK-LBROgPA-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=gI7e4fQ+oK3GskpCd2HeWkFbnrNEeyJYif8kLM98cNU=; b=MUcP0fB24GXOIIGtyh10gR4CcbbY1wR43hFvkEY6yhBTF7bLMYk9VLYNSAup8+NXSI ohSyQvC61qmYzmcv3SEOMCLK72q3626AxLNrNjve+XslPpKp9HEe+MRyoKbXKLg1F7KY EwjMpTJjrYmlEqYlD5J5+Qr1F9K3+zHySv51Eb8PlDse/R+vg/zHn+tnQRwIcmkyWuax YcSA+ZoNRYuQ1uZHksRo5f3U+vnvzNDien3w9Or4+TK5ethI3XEekNzB3ciEjyqJWtK3 PVB8yhaXNSNXTvZIVgaFOl5Wwi9ASaf99rHn5NpIYxPIBccHGwgPyjGeEwbfjpxdwdag roDQ== X-Gm-Message-State: ANhLgQ1OF/dK2oKbAwhGrYDInsPBEejt8p68k/uFdJ53aN1tpRA/Z3RJ PEqtJzVfakDFdupcfyPzcr8PGs+r X-Google-Smtp-Source: ADFU+vv3Mz21Vs2tUog1XxqcX2hCZQagYqniw6Bprw+IVXWkT7bHyXtubYxFuB8/6p571ssV8NmZdw== X-Received: by 2002:a37:9c07:: with SMTP id f7mr11107474qke.349.1585258319024; Thu, 26 Mar 2020 14:31:59 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 11/15] qemu: move qemuDomainDeviceDefValidateGraphics() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:21 -0300 Message-Id: <20200326213125.2306013-12-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLW7O0010324 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.16 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" Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 177 +-------------------------------------- src/qemu/qemu_validate.c | 175 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 5 ++ 3 files changed, 181 insertions(+), 176 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 522edb8274..ca9e642632 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5521,181 +5521,6 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm, } =20 =20 -static int -qemuDomainDeviceDefValidateSPICEGraphics(const virDomainGraphicsDef *graph= ics, - virQEMUDriverPtr driver, - virQEMUCapsPtr qemuCaps) -{ - g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - virDomainGraphicsListenDefPtr glisten =3D NULL; - int tlsPort =3D graphics->data.spice.tlsPort; - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("spice graphics are not supported with this QEMU"= )); - return -1; - } - - glisten =3D virDomainGraphicsGetListen((virDomainGraphicsDefPtr)graphi= cs, 0); - if (!glisten) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("missing listen element")); - return -1; - } - - switch (glisten->type) { - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_UNIX)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("unix socket for spice graphics are not suppo= rted " - "with this QEMU")); - return -1; - } - break; - - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK: - if (tlsPort > 0 && !cfg->spiceTLS) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("spice TLS port set in XML configuration, " - "but TLS is disabled in qemu.conf")); - return -1; - } - break; - - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: - break; - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: - break; - } - - if (graphics->data.spice.filetransfer =3D=3D VIR_TRISTATE_BOOL_NO && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU can't disable file transfers throu= gh spice")); - return -1; - } - - if (graphics->data.spice.gl =3D=3D VIR_TRISTATE_BOOL_YES) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_GL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support spice OpenGL")); - return -1; - } - - if (graphics->data.spice.rendernode && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support spice OpenGL rende= rnode")); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics, - const virDomainDef *def, - virQEMUDriverPtr driver, - virQEMUCapsPtr qemuCaps) -{ - bool have_egl_headless =3D false; - size_t i; - - for (i =3D 0; i < def->ngraphics; i++) { - if (def->graphics[i]->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEA= DLESS) { - have_egl_headless =3D true; - break; - } - } - - /* Only VNC and SPICE can be paired with egl-headless, the other types - * either don't make sense to pair with egl-headless or aren't even - * supported by QEMU. - */ - if (have_egl_headless) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("egl-headless display is not supported with t= his " - "QEMU binary")); - return -1; - } - - if (graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS && - graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC && - graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("graphics type 'egl-headless' is only support= ed " - "with one of: 'vnc', 'spice' graphics types")= ); - return -1; - } - - /* '-spice gl=3Don' and '-display egl-headless' are mutually - * exclusive - */ - if (graphics->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_SPICE && - graphics->data.spice.gl =3D=3D VIR_TRISTATE_BOOL_YES) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("multiple OpenGL displays are not supported " - "by QEMU")); - return -1; - } - } - - switch (graphics->type) { - case VIR_DOMAIN_GRAPHICS_TYPE_SDL: - if (graphics->data.sdl.gl !=3D VIR_TRISTATE_BOOL_ABSENT) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SDL_GL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("OpenGL for SDL is not supported with thi= s QEMU " - "binary")); - return -1; - } - } - break; - - case VIR_DOMAIN_GRAPHICS_TYPE_VNC: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VNC)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vnc graphics are not supported with this QEM= U")); - return -1; - } - break; - - case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: - if (qemuDomainDeviceDefValidateSPICEGraphics(graphics, driver, - qemuCaps) < 0) - return -1; - - break; - - case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: - if (graphics->data.egl_headless.rendernode && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS_RENDERNODE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("This QEMU doesn't support OpenGL rendernode " - "with egl-headless graphics type")); - return -1; - } - - break; - case VIR_DOMAIN_GRAPHICS_TYPE_RDP: - case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported graphics type '%s'"), - virDomainGraphicsTypeToString(graphics->type)); - return -1; - case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - default: - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidateInput(const virDomainInputDef *input, const virDomainDef *def, @@ -6098,7 +5923,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_GRAPHICS: - ret =3D qemuDomainDeviceDefValidateGraphics(dev->data.graphics, de= f, + ret =3D qemuValidateDomainDeviceDefGraphics(dev->data.graphics, de= f, driver, qemuCaps); break; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index f8228f3491..5438431e93 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2718,3 +2718,178 @@ qemuValidateDomainDeviceDefController(const virDoma= inControllerDef *controller, =20 return ret; } + + +static int +qemuValidateDomainDeviceDefSPICEGraphics(const virDomainGraphicsDef *graph= ics, + virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + virDomainGraphicsListenDefPtr glisten =3D NULL; + int tlsPort =3D graphics->data.spice.tlsPort; + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("spice graphics are not supported with this QEMU"= )); + return -1; + } + + glisten =3D virDomainGraphicsGetListen((virDomainGraphicsDefPtr)graphi= cs, 0); + if (!glisten) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing listen element")); + return -1; + } + + switch (glisten->type) { + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_UNIX)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("unix socket for spice graphics are not suppo= rted " + "with this QEMU")); + return -1; + } + break; + + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS: + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK: + if (tlsPort > 0 && !cfg->spiceTLS) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("spice TLS port set in XML configuration, " + "but TLS is disabled in qemu.conf")); + return -1; + } + break; + + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: + break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + break; + } + + if (graphics->data.spice.filetransfer =3D=3D VIR_TRISTATE_BOOL_NO && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU can't disable file transfers throu= gh spice")); + return -1; + } + + if (graphics->data.spice.gl =3D=3D VIR_TRISTATE_BOOL_YES) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_GL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support spice OpenGL")); + return -1; + } + + if (graphics->data.spice.rendernode && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support spice OpenGL rende= rnode")); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics, + const virDomainDef *def, + virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps) +{ + bool have_egl_headless =3D false; + size_t i; + + for (i =3D 0; i < def->ngraphics; i++) { + if (def->graphics[i]->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEA= DLESS) { + have_egl_headless =3D true; + break; + } + } + + /* Only VNC and SPICE can be paired with egl-headless, the other types + * either don't make sense to pair with egl-headless or aren't even + * supported by QEMU. + */ + if (have_egl_headless) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("egl-headless display is not supported with t= his " + "QEMU binary")); + return -1; + } + + if (graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS && + graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC && + graphics->type !=3D VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("graphics type 'egl-headless' is only support= ed " + "with one of: 'vnc', 'spice' graphics types")= ); + return -1; + } + + /* '-spice gl=3Don' and '-display egl-headless' are mutually + * exclusive + */ + if (graphics->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_SPICE && + graphics->data.spice.gl =3D=3D VIR_TRISTATE_BOOL_YES) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("multiple OpenGL displays are not supported " + "by QEMU")); + return -1; + } + } + + switch (graphics->type) { + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + if (graphics->data.sdl.gl !=3D VIR_TRISTATE_BOOL_ABSENT) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SDL_GL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("OpenGL for SDL is not supported with thi= s QEMU " + "binary")); + return -1; + } + } + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VNC)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vnc graphics are not supported with this QEM= U")); + return -1; + } + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + if (qemuValidateDomainDeviceDefSPICEGraphics(graphics, driver, + qemuCaps) < 0) + return -1; + + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + if (graphics->data.egl_headless.rendernode && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_EGL_HEADLESS_RENDERNODE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support OpenGL rendernode " + "with egl-headless graphics type")); + return -1; + } + + break; + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported graphics type '%s'"), + virDomainGraphicsTypeToString(graphics->type)); + return -1; + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 85efa9354f..3b34cd55a2 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -24,6 +24,7 @@ =20 #include "domain_conf.h" #include "qemu_capabilities.h" +#include "qemu_conf.h" =20 int qemuValidateDomainDef(const virDomainDef *def, void *opaque); int qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk, @@ -51,3 +52,7 @@ int qemuValidateDomainDeviceDefVideo(const virDomainVideo= Def *video, int qemuValidateDomainDeviceDefController(const virDomainControllerDef *co= ntroller, const virDomainDef *def, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphi= cs, + const virDomainDef *def, + virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258446; cv=none; d=zohomail.com; s=zohoarc; b=I8MK8zF3tt5hZQyHF3ROb+agVFiAOHfK6EvHUm/3GMOMxEpKzB3iLlZ7CsBnrdZLpN4hRWirkpf3U+wdR8qV375E0I9Pg6u5LkArPQ31EoQsxMU4UnczprvqsQVcq03w7OGGKRj9gzNQiAYaIbRHuqhp6hbNIW9G+oYKm9Fw1ME= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258446; 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=I2MOVcwA0Y2lXHr1i4jMzCSHdi/buxT6jnYW5pMZgzg=; b=GBad3W8254C229ZzlKncTxd+4hrp7iU0/CRWFFllFSkZcYdo93CnTdKs+3Sq23BCZ4aPwZ1CpDqLVQNVFyKVg3/cfGo9V3VYdSZLhAQaKE2c6j0yfWq+NCB1FskTfC/95wBDkzoL53AOl35/CnYNOXqwAjBzpMnX9gkblEnwub4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258446484580.2023579052791; Thu, 26 Mar 2020 14:34:06 -0700 (PDT) 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-296-EIg7G-q1MJ-zp5cbSaZAyg-1; Thu, 26 Mar 2020 17:34:02 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 798CB801E6C; Thu, 26 Mar 2020 21:33:56 +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 4EF7EA0A94; Thu, 26 Mar 2020 21:33:56 +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 F16FD180887A; Thu, 26 Mar 2020 21:33:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLW9TN010335 for ; Thu, 26 Mar 2020 17:32:09 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5C415105541B; Thu, 26 Mar 2020 21:32:09 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5834A1055419 for ; Thu, 26 Mar 2020 21:32:06 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 D1ABA8007C9 for ; Thu, 26 Mar 2020 21:32:06 +0000 (UTC) Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-278-7zDoJ8lTMkq4_qZUdAQDtg-1; Thu, 26 Mar 2020 17:32:02 -0400 Received: by mail-qk1-f196.google.com with SMTP id b62so8694919qkf.6; Thu, 26 Mar 2020 14:32:02 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:32:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258445; 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=I2MOVcwA0Y2lXHr1i4jMzCSHdi/buxT6jnYW5pMZgzg=; b=BV/pqdjyrdQCsoweuwgpw4Ff6ZrQtX13AXQI8tTG834R8yB2fOKN7xU/jiiUwCMwofyS2j ZUaEgK9pkv9hMW+JewOnnpIc45Ego2DGJw+BHSuWudHDNWb8yifWbDplMCARrqNd8DWuNi sIq7+RbvxtzC4mj7LeTJ5FnKEgHc+7k= X-MC-Unique: EIg7G-q1MJ-zp5cbSaZAyg-1 X-MC-Unique: 7zDoJ8lTMkq4_qZUdAQDtg-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=P35VGjexxX/K6LmYhXigf3uQPvd4kGd2kTV7LfS8lsI=; b=bfnq4kxpx/NmIUItKOw08u2umODOQ/pEMyigZcJcoAm7uzDa0+K81pjYGkuxyP2P1c ysd1jjqEwT1J5Ygl0CNmgWi5NWURwPHWelxltT/+oh/eYQRq2W3nrFczkYLaZhWhxn5m 6kFUgLzOGFkFM2KyMx/JqdN4nPnIyAUMDi1mj/yPQanmMtPIBd+aolzDzFmPWf2Y7LIT jxnHdjbQmfB7AxZEObRt4hMlgsxgVVDDscxvyrt6cn0+6SwXBYFQreNONZMTDGFUfdvN 6+0ADuuNzLGD40ovaTFigDTFQJPJrB4JdrPuRbCmIXoNuS5gG1F17HG0mAO5ItRTD9vv pOsw== X-Gm-Message-State: ANhLgQ3PlSTphTHhCOi1AcOSN7/9eYjqSbhlgy6FbGm2mIiADrA+yU0H DARLFCNZl7BqPMgY/QMd4lO+8ydA X-Google-Smtp-Source: ADFU+vuFSigFKSs7FvyUvMxgSc+GE94ZRgEwNkOmpwdc/piXVTc02+uFq9kfUMbwjLdMi6y52/ef6Q== X-Received: by 2002:a37:bd81:: with SMTP id n123mr10854330qkf.269.1585258321533; Thu, 26 Mar 2020 14:32:01 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 12/15] qemu: move qemuDomainDeviceDefValidateFS() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:22 -0300 Message-Id: <20200326213125.2306013-13-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLW9TN010335 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.11 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" Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 119 +-------------------------------------- src/qemu/qemu_validate.c | 119 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 4 ++ 3 files changed, 124 insertions(+), 118 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ca9e642632..110d5b3fb2 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5727,123 +5727,6 @@ qemuDomainDeviceDefValidateIOMMU(const virDomainIOM= MUDef *iommu, return 0; } =20 -static int -qemuDomainDefValidateVirtioFSSharedMemory(const virDomainDef *def) -{ - size_t numa_nodes =3D virDomainNumaGetNodeCount(def->numa); - size_t i; - - if (numa_nodes =3D=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs requires one or more NUMA nodes")); - return -1; - } - - for (i =3D 0; i < numa_nodes; i++) { - virDomainMemoryAccess node_access =3D - virDomainNumaGetNodeMemoryAccessMode(def->numa, i); - - switch (node_access) { - case VIR_DOMAIN_MEMORY_ACCESS_DEFAULT: - if (def->mem.access !=3D VIR_DOMAIN_MEMORY_ACCESS_SHARED) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs requires shared memory")); - return -1; - } - break; - case VIR_DOMAIN_MEMORY_ACCESS_SHARED: - break; - case VIR_DOMAIN_MEMORY_ACCESS_PRIVATE: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs requires shared memory")); - return -1; - - case VIR_DOMAIN_MEMORY_ACCESS_LAST: - default: - virReportEnumRangeError(virDomainMemoryAccess, node_access); - return -1; - - } - } - return 0; -} - -static int -qemuDomainDeviceDefValidateFS(virDomainFSDefPtr fs, - const virDomainDef *def, - virQEMUDriverPtr driver, - virQEMUCapsPtr qemuCaps) -{ - if (fs->type !=3D VIR_DOMAIN_FS_TYPE_MOUNT) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("only supports mount filesystem type")); - return -1; - } - - switch ((virDomainFSDriverType) fs->fsdriver) { - case VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT: - case VIR_DOMAIN_FS_DRIVER_TYPE_PATH: - break; - - case VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE: - if (fs->accessmode !=3D VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("only supports passthrough accessmode")); - return -1; - } - break; - - case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP: - case VIR_DOMAIN_FS_DRIVER_TYPE_NBD: - case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Filesystem driver type not supported")); - return -1; - - case VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS: - if (!virQEMUDriverIsPrivileged(driver)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs is not yet supported in session mod= e")); - return -1; - } - if (fs->accessmode !=3D VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs only supports passthrough accessmod= e")); - return -1; - } - if (fs->wrpolicy !=3D VIR_DOMAIN_FS_WRPOLICY_DEFAULT) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs does not support wrpolicy")); - return -1; - } - if (fs->model !=3D VIR_DOMAIN_FS_MODEL_DEFAULT) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs does not support model")); - return -1; - } - if (fs->format !=3D VIR_STORAGE_FILE_NONE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs does not support format")); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_FS)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("virtiofs is not supported with this QEMU bin= ary")); - return -1; - } - if (qemuDomainDefValidateVirtioFSSharedMemory(def) < 0) - return -1; - break; - - case VIR_DOMAIN_FS_DRIVER_TYPE_LAST: - default: - virReportEnumRangeError(virDomainFSDriverType, fs->fsdriver); - return -1; - } - - return 0; -} - =20 static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, @@ -5940,7 +5823,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_FS: - ret =3D qemuDomainDeviceDefValidateFS(dev->data.fs, def, driver, q= emuCaps); + ret =3D qemuValidateDomainDeviceDefFS(dev->data.fs, def, driver, q= emuCaps); break; =20 case VIR_DOMAIN_DEVICE_NVRAM: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 5438431e93..79fc56b849 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2893,3 +2893,122 @@ qemuValidateDomainDeviceDefGraphics(const virDomain= GraphicsDef *graphics, =20 return 0; } + + +static int +qemuValidateDomainDefVirtioFSSharedMemory(const virDomainDef *def) +{ + size_t numa_nodes =3D virDomainNumaGetNodeCount(def->numa); + size_t i; + + if (numa_nodes =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs requires one or more NUMA nodes")); + return -1; + } + + for (i =3D 0; i < numa_nodes; i++) { + virDomainMemoryAccess node_access =3D + virDomainNumaGetNodeMemoryAccessMode(def->numa, i); + + switch (node_access) { + case VIR_DOMAIN_MEMORY_ACCESS_DEFAULT: + if (def->mem.access !=3D VIR_DOMAIN_MEMORY_ACCESS_SHARED) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs requires shared memory")); + return -1; + } + break; + case VIR_DOMAIN_MEMORY_ACCESS_SHARED: + break; + case VIR_DOMAIN_MEMORY_ACCESS_PRIVATE: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs requires shared memory")); + return -1; + + case VIR_DOMAIN_MEMORY_ACCESS_LAST: + default: + virReportEnumRangeError(virDomainMemoryAccess, node_access); + return -1; + + } + } + return 0; +} + + +int +qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, + const virDomainDef *def, + virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps) +{ + if (fs->type !=3D VIR_DOMAIN_FS_TYPE_MOUNT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("only supports mount filesystem type")); + return -1; + } + + switch ((virDomainFSDriverType) fs->fsdriver) { + case VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT: + case VIR_DOMAIN_FS_DRIVER_TYPE_PATH: + break; + + case VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE: + if (fs->accessmode !=3D VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("only supports passthrough accessmode")); + return -1; + } + break; + + case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP: + case VIR_DOMAIN_FS_DRIVER_TYPE_NBD: + case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Filesystem driver type not supported")); + return -1; + + case VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS: + if (!virQEMUDriverIsPrivileged(driver)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs is not yet supported in session mod= e")); + return -1; + } + if (fs->accessmode !=3D VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs only supports passthrough accessmod= e")); + return -1; + } + if (fs->wrpolicy !=3D VIR_DOMAIN_FS_WRPOLICY_DEFAULT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs does not support wrpolicy")); + return -1; + } + if (fs->model !=3D VIR_DOMAIN_FS_MODEL_DEFAULT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs does not support model")); + return -1; + } + if (fs->format !=3D VIR_STORAGE_FILE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs does not support format")); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_FS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtiofs is not supported with this QEMU bin= ary")); + return -1; + } + if (qemuValidateDomainDefVirtioFSSharedMemory(def) < 0) + return -1; + break; + + case VIR_DOMAIN_FS_DRIVER_TYPE_LAST: + default: + virReportEnumRangeError(virDomainFSDriverType, fs->fsdriver); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 3b34cd55a2..623f80fcb2 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -56,3 +56,7 @@ int qemuValidateDomainDeviceDefGraphics(const virDomainGr= aphicsDef *graphics, const virDomainDef *def, virQEMUDriverPtr driver, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, + const virDomainDef *def, + virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258442; cv=none; d=zohomail.com; s=zohoarc; b=Q4d0GVh6GQ7rZxv0supnGnHq5qDjon4bw1eSjjsxECqUKzl84jc72bLqTSmeZ2NCjBVTl4tbntT0oz+766ufI+IJar13tLD7FpaJbAOYvzGbFPcc25Mi9/1uC5g3jil/Od6eFeEw62zslACXAmihyyOE86w6kmePq9HuE5bf4Zg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258442; 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=jjmLUJqDLPOrLJAwYmCfy/9mIPcSZPSGtHSt05X7+XQ=; b=MvW8a9LR7xfAY3RmB+eOU8a0VLAz1NYExuXVaczgDWK7wo2a4QzTGjdOd2vPLjOIewoMWjYho2i5Pbq4T/bNeKRUcAv9k7I3Z+j8/wApCPhMpLugcrmc0rSR1AQhFwN6UavJu0X+cBaUkewaVefwW54ApiQo1dEAsLbIe7jOLLk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 158525844255221.83574029385875; Thu, 26 Mar 2020 14:34:02 -0700 (PDT) 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-289-GiyTlJV9N9mqnaBrmW1ssw-1; Thu, 26 Mar 2020 17:33:59 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AF577107ACC4; Thu, 26 Mar 2020 21:33:52 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 841195DC18; Thu, 26 Mar 2020 21:33:52 +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 2FEDA8A04D; Thu, 26 Mar 2020 21:33:52 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLW61e010319 for ; Thu, 26 Mar 2020 17:32:06 -0400 Received: by smtp.corp.redhat.com (Postfix) id B90262037E4D; Thu, 26 Mar 2020 21:32:06 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B4A0A2026D67 for ; Thu, 26 Mar 2020 21:32:06 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 950048FF667 for ; Thu, 26 Mar 2020 21:32:06 +0000 (UTC) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-430-QZFgjcEoOUCM4sWh1OFUkw-1; Thu, 26 Mar 2020 17:32:04 -0400 Received: by mail-qk1-f193.google.com with SMTP id b62so8695043qkf.6; Thu, 26 Mar 2020 14:32:04 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.32.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:32:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258441; 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=jjmLUJqDLPOrLJAwYmCfy/9mIPcSZPSGtHSt05X7+XQ=; b=biR1jD6dGhxF4dCwEm5epVo91cdBFFCypUpMjQxO8O3E3WZmNaChBWbA0kYj7FEVKm4zAn LZm6iUWfL3Rte0+ysw0AHtkrfZoYuOvCA9/2oc4kC8D95K4m8bOzKOCHyFnAOz9i9BSs2g VJVd/t6bDxJ7HJviohzlx7iNr0nBdzo= X-MC-Unique: GiyTlJV9N9mqnaBrmW1ssw-1 X-MC-Unique: QZFgjcEoOUCM4sWh1OFUkw-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=pERYNtMWhobHJbJnFAyIidricBnhryCzOmb+Xb/jByk=; b=nSz/YWdUOOy1eW5/7Nh/qCFFn3m8O5tNqtoypsZ5l6mBLiJh4uBU+VWAAQyC3KonQy DOeNE47ch0Gm/9VabbPFAiX07apbPlaQI8oWGvHEey5D19d4fQRoEvgEqshqsUb+yBdX 0HzshBRhop6uTAYh+eeGIbvXuXO04cFKzC7ilw27jaxopJIMzpUq75eyic4uCDJRFU3D cbxnIbRxNaGBswhz2fgDcJiurCwM4rcAbc43jkiiKGNOeqF3obv3ahuUeI3D46odMPDP OQyw6L8iBzMGJ6uSe++NN9zRM1h27cpK+mr7VqjYaW8jw4jROFZPIBnatNWK586wBURn GIRg== X-Gm-Message-State: ANhLgQ0SQL4CPoKIYL5KHyFg7ZYKHfRfbBer1a5Yz6dVx6YgTZel+cDj HGPZD31brHVuF8JBltDXUvtk4gmB X-Google-Smtp-Source: ADFU+vu9GZqWuyNAcUPI0D06HgGAAbhpBxlppQQob4hnmjfAtBbelkBNBLpYBHsPa8cY7VkorSRRJw== X-Received: by 2002:a05:620a:709:: with SMTP id 9mr11015002qkc.355.1585258323695; Thu, 26 Mar 2020 14:32:03 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 13/15] qemu: move qemuDomainDeviceDefValidateSound() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:23 -0300 Message-Id: <20200326213125.2306013-14-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLW61e010319 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.14 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" Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 76 +--------------------------------------- src/qemu/qemu_validate.c | 76 ++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 2 ++ 3 files changed, 79 insertions(+), 75 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 110d5b3fb2..ddcc0551db 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5061,80 +5061,6 @@ qemuDomainDeviceDefValidateHub(virDomainHubDefPtr hu= b, } =20 =20 -static int -qemuSoundCodecTypeToCaps(int type) -{ - switch (type) { - case VIR_DOMAIN_SOUND_CODEC_TYPE_DUPLEX: - return QEMU_CAPS_HDA_DUPLEX; - case VIR_DOMAIN_SOUND_CODEC_TYPE_MICRO: - return QEMU_CAPS_HDA_MICRO; - case VIR_DOMAIN_SOUND_CODEC_TYPE_OUTPUT: - return QEMU_CAPS_HDA_OUTPUT; - default: - return -1; - } -} - - -static int -qemuDomainDeviceDefValidateSound(virDomainSoundDefPtr sound, - virQEMUCapsPtr qemuCaps) -{ - size_t i; - - switch ((virDomainSoundModel) sound->model) { - case VIR_DOMAIN_SOUND_MODEL_USB: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_USB_AUDIO)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("usb-audio controller is not supported " - "by this QEMU binary")); - return -1; - } - break; - case VIR_DOMAIN_SOUND_MODEL_ICH9: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ICH9_INTEL_HDA)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("The ich9-intel-hda audio controller " - "is not supported in this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_SOUND_MODEL_ES1370: - case VIR_DOMAIN_SOUND_MODEL_AC97: - case VIR_DOMAIN_SOUND_MODEL_ICH6: - case VIR_DOMAIN_SOUND_MODEL_SB16: - case VIR_DOMAIN_SOUND_MODEL_PCSPK: - break; - case VIR_DOMAIN_SOUND_MODEL_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("sound card model '%s' is not supported by qemu"), - virDomainSoundModelTypeToString(sound->model)); - return -1; - } - - if (sound->model =3D=3D VIR_DOMAIN_SOUND_MODEL_ICH6 || - sound->model =3D=3D VIR_DOMAIN_SOUND_MODEL_ICH9) { - for (i =3D 0; i < sound->ncodecs; i++) { - const char *stype; - int type, flags; - - type =3D sound->codecs[i]->type; - stype =3D qemuSoundCodecTypeToString(type); - flags =3D qemuSoundCodecTypeToCaps(type); - - if (flags =3D=3D -1 || !virQEMUCapsGet(qemuCaps, flags)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s not supported in this QEMU binary"), = stype); - return -1; - } - } - } - - return 0; -} - static int qemuDomainDeviceDefValidateMemory(virDomainMemoryDefPtr mem, virQEMUCapsPtr qemuCaps) @@ -5835,7 +5761,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_SOUND: - ret =3D qemuDomainDeviceDefValidateSound(dev->data.sound, qemuCaps= ); + ret =3D qemuValidateDomainDeviceDefSound(dev->data.sound, qemuCaps= ); break; =20 case VIR_DOMAIN_DEVICE_MEMORY: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 79fc56b849..58ed2512d4 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -22,6 +22,7 @@ =20 #include "qemu_validate.h" #include "qemu_block.h" +#include "qemu_command.h" #include "qemu_domain.h" #include "domain_conf.h" #include "virlog.h" @@ -3012,3 +3013,78 @@ qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, =20 return 0; } + + +static int +qemuSoundCodecTypeToCaps(int type) +{ + switch (type) { + case VIR_DOMAIN_SOUND_CODEC_TYPE_DUPLEX: + return QEMU_CAPS_HDA_DUPLEX; + case VIR_DOMAIN_SOUND_CODEC_TYPE_MICRO: + return QEMU_CAPS_HDA_MICRO; + case VIR_DOMAIN_SOUND_CODEC_TYPE_OUTPUT: + return QEMU_CAPS_HDA_OUTPUT; + default: + return -1; + } +} + + +int +qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, + virQEMUCapsPtr qemuCaps) +{ + size_t i; + + switch ((virDomainSoundModel) sound->model) { + case VIR_DOMAIN_SOUND_MODEL_USB: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_USB_AUDIO)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("usb-audio controller is not supported " + "by this QEMU binary")); + return -1; + } + break; + case VIR_DOMAIN_SOUND_MODEL_ICH9: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ICH9_INTEL_HDA)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("The ich9-intel-hda audio controller " + "is not supported in this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_SOUND_MODEL_ES1370: + case VIR_DOMAIN_SOUND_MODEL_AC97: + case VIR_DOMAIN_SOUND_MODEL_ICH6: + case VIR_DOMAIN_SOUND_MODEL_SB16: + case VIR_DOMAIN_SOUND_MODEL_PCSPK: + break; + case VIR_DOMAIN_SOUND_MODEL_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("sound card model '%s' is not supported by qemu"), + virDomainSoundModelTypeToString(sound->model)); + return -1; + } + + if (sound->model =3D=3D VIR_DOMAIN_SOUND_MODEL_ICH6 || + sound->model =3D=3D VIR_DOMAIN_SOUND_MODEL_ICH9) { + for (i =3D 0; i < sound->ncodecs; i++) { + const char *stype; + int type, flags; + + type =3D sound->codecs[i]->type; + stype =3D qemuSoundCodecTypeToString(type); + flags =3D qemuSoundCodecTypeToCaps(type); + + if (flags =3D=3D -1 || !virQEMUCapsGet(qemuCaps, flags)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s not supported in this QEMU binary"), = stype); + return -1; + } + } + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 623f80fcb2..e61a932809 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -60,3 +60,5 @@ int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, const virDomainDef *def, virQEMUDriverPtr driver, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) client-ip=63.128.21.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258384; cv=none; d=zohomail.com; s=zohoarc; b=G9tsPkD9Cf9MFnAH8jDoWNZG58WIEfZh4wpnkSiKdJGRJjW17inu+9SaUK6j3vRh2Sampwk/8FWkLSBBYzP6vRpzjc06XM1w74wrIwoWGu6hyaQ9xwTI3zNhAPF5XZlvxwCaKENe6v1JxodIJ0Ul4JN/bvSyroaMeAdhiHgSIi0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258384; 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=rbZsP74cLmC+RMxQMUoUMCGlfoHfoyYzQH9nafppbj4=; b=HEEnYLiPl3AIYtyNOq+9m0tRcFU0oFvMuXzj33tFtmEA8DIYhE66CuvBWf4C7S8ccznFxSlTHzUF/PolpgiWfT3cHVMHQLnz2EgpiqgoN0WJ2mF7G2bPwhc1vlgrDeek7wvQKEqsYJ9mEMQAbYfvO3ZGbg1G0YmT6rRDdFf5Oiw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [63.128.21.74]) by mx.zohomail.com with SMTPS id 1585258384692561.2739334657198; Thu, 26 Mar 2020 14:33:04 -0700 (PDT) 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-167-nXUMlDRIO4Ki_-mtvOW-eg-1; Thu, 26 Mar 2020 17:32:31 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D7E6E8018A2; Thu, 26 Mar 2020 21:32:25 +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 ABDA110002A9; Thu, 26 Mar 2020 21:32:25 +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 6229F18089D0; Thu, 26 Mar 2020 21:32:25 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLWA7t010343 for ; Thu, 26 Mar 2020 17:32:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7A645105541B; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7605E1055419 for ; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (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 47CDA800298 for ; Thu, 26 Mar 2020 21:32:10 +0000 (UTC) Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-445-e0_OtB1GOamCmouWo79tnA-1; Thu, 26 Mar 2020 17:32:07 -0400 Received: by mail-qk1-f193.google.com with SMTP id j4so8627399qkc.11; Thu, 26 Mar 2020 14:32:07 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.32.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:32:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258383; 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=rbZsP74cLmC+RMxQMUoUMCGlfoHfoyYzQH9nafppbj4=; b=JJPM6DjNDeTuSlGVFXXW/ifCPSbXLEh0nsZUntSczFSULHsBhJuEFKG/97bPOdHcUVUX2+ a4jKOiYGTzTR7Z34A0dSq1Y2XX52jjMWWNfy7BEm1jBSLE0fNnJzxzXJLRyaKwAGPEvecD prr6o1xiZDSEhOldaMTZ3nLrl7TnCYU= X-MC-Unique: nXUMlDRIO4Ki_-mtvOW-eg-1 X-MC-Unique: e0_OtB1GOamCmouWo79tnA-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=1w4PHNPaGjFpKwSBZNag/UIQXkH+PjZCLEO66enRoFc=; b=IKrifVtC7v4CPm1BawKwKGzfc5uL2YubSRNVxdZ+tUbeIpCveSx/XtQChqPU4gUxii drZokIn+kgYeBbCLNS0NBXbIXAHsyZELfOw4+lDpijIjfwf8XBk0xVDxltnbUhrGum3S Xmr0Ib7srpOW0EYZ/VpxDcUv73EfUKPPxrhdM+FEjSVVekfJVA5NQ84UfGE90jllXhi3 AxPUdG6m1C7v90VjqTvygODu9blRnDfDlHGONUpV2qwreedtXaJIVdrhQvdmEjOrywfF ssQWwS6u7zJntLhYhL02ideyq06G8S2khLD/Vd0Ixn2nnnjtFThaM0lrsniyGUKL/G4b bkqw== X-Gm-Message-State: ANhLgQ0jkle6HHa0+lcMv/QMECdA4/REsXPiKpJz7QU5jGmtpCR2Ft7Z LMy70UjX+OkPhdGUzfTEraDvA2CV X-Google-Smtp-Source: ADFU+vuwQshOG0qZ4+HDZnCqzPCsm9hmxB2whXniZMXBoiDspLuKuKYaEpmQmObILlNaAAM49d1jlg== X-Received: by 2002:a37:2f41:: with SMTP id v62mr10919218qkh.207.1585258326009; Thu, 26 Mar 2020 14:32:06 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 14/15] qemu: move remaining qemuDomainDeviceDefValidate() helpers Date: Thu, 26 Mar 2020 18:31:24 -0300 Message-Id: <20200326213125.2306013-15-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLWA7t010343 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.22 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" This will allow to move qemuDomainDeviceDefValidate() itself in the next patch in a cleaner way. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 392 +-------------------------------------- src/qemu/qemu_validate.c | 376 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 21 +++ 3 files changed, 405 insertions(+), 384 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ddcc0551db..3ab2bfe879 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5007,75 +5007,6 @@ qemuDomainDefPostParse(virDomainDefPtr def, } =20 =20 -static int -qemuDomainDeviceDefValidateNVRAM(virDomainNVRAMDefPtr nvram, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (!nvram) - return 0; - - if (qemuDomainIsPSeries(def)) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvram device is not supported by " - "this QEMU binary")); - return -1; - } - } else { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvram device is only supported for PPC64")); - return -1; - } - - if (!(nvram->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO = && - nvram->info.addr.spaprvio.has_reg)) { - - virReportError(VIR_ERR_XML_ERROR, "%s", - _("nvram address type must be spaprvio")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateHub(virDomainHubDefPtr hub, - virQEMUCapsPtr qemuCaps) -{ - if (hub->type !=3D VIR_DOMAIN_HUB_TYPE_USB) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("hub type %s not supported"), - virDomainHubTypeToString(hub->type)); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("usb-hub not supported by QEMU binary")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateMemory(virDomainMemoryDefPtr mem, - virQEMUCapsPtr qemuCaps) -{ - if (mem->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_NVDIMM && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("nvdimm isn't supported by this QEMU binary")); - return -1; - } - - return 0; -} - - int qemuDomainValidateActualNetDef(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps) @@ -5347,313 +5278,6 @@ qemuDomainValidateStorageSource(virStorageSourcePtr= src, } =20 =20 -static int -qemuDomainDeviceDefValidateVsock(const virDomainVsockDef *vsock, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_VSOCK)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vsock device is not supported " - "with this QEMU binary")); - return -1; - } - - if (!qemuDomainCheckCCWS390AddressSupport(def, &vsock->info, qemuCaps, - "vsock")) - return -1; - - return 0; -} - - -static int -qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - virQEMUCapsFlags flag; - - /* TPM 1.2 and 2 are not compatible, so we choose a specific version h= ere */ - if (tpm->version =3D=3D VIR_DOMAIN_TPM_VERSION_DEFAULT) - tpm->version =3D VIR_DOMAIN_TPM_VERSION_1_2; - - switch (tpm->version) { - case VIR_DOMAIN_TPM_VERSION_1_2: - /* TPM 1.2 + CRB do not work */ - if (tpm->type =3D=3D VIR_DOMAIN_TPM_TYPE_EMULATOR && - tpm->model =3D=3D VIR_DOMAIN_TPM_MODEL_CRB) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported interface %s for TPM 1.2"), - virDomainTPMModelTypeToString(tpm->model)); - return -1; - } - break; - case VIR_DOMAIN_TPM_VERSION_2_0: - case VIR_DOMAIN_TPM_VERSION_DEFAULT: - case VIR_DOMAIN_TPM_VERSION_LAST: - break; - } - - switch (tpm->type) { - case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) - goto no_support; - break; - - case VIR_DOMAIN_TPM_TYPE_EMULATOR: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR)) - goto no_support; - - break; - case VIR_DOMAIN_TPM_TYPE_LAST: - break; - } - - switch (tpm->model) { - case VIR_DOMAIN_TPM_MODEL_TIS: - flag =3D QEMU_CAPS_DEVICE_TPM_TIS; - break; - case VIR_DOMAIN_TPM_MODEL_CRB: - flag =3D QEMU_CAPS_DEVICE_TPM_CRB; - break; - case VIR_DOMAIN_TPM_MODEL_SPAPR: - flag =3D QEMU_CAPS_DEVICE_TPM_SPAPR; - break; - case VIR_DOMAIN_TPM_MODEL_LAST: - default: - virReportEnumRangeError(virDomainTPMModel, tpm->model); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, flag)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The QEMU executable %s does not support TPM " - "model %s"), - def->emulator, - virDomainTPMModelTypeToString(tpm->model)); - return -1; - } - - return 0; - - no_support: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The QEMU executable %s does not support TPM " - "backend type %s"), - def->emulator, - virDomainTPMBackendTypeToString(tpm->type)); - return -1; -} - - -static int -qemuDomainDeviceDefValidateInput(const virDomainInputDef *input, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - const char *baseName; - int cap; - int ccwCap; - - if (input->bus =3D=3D VIR_DOMAIN_INPUT_BUS_PS2 && !ARCH_IS_X86(def->os= .arch) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_I8042)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s is not supported by this QEMU binary"), - virDomainInputBusTypeToString(input->bus)); - return -1; - } - - if (input->bus !=3D VIR_DOMAIN_INPUT_BUS_VIRTIO) - return 0; - - /* Only type=3Dpassthrough supports model=3Dvirtio-(non-)transitional = */ - switch ((virDomainInputModel)input->model) { - case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL: - case VIR_DOMAIN_INPUT_MODEL_VIRTIO_NON_TRANSITIONAL: - switch ((virDomainInputType)input->type) { - case VIR_DOMAIN_INPUT_TYPE_MOUSE: - case VIR_DOMAIN_INPUT_TYPE_TABLET: - case VIR_DOMAIN_INPUT_TYPE_KBD: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("virtio (non-)transitional models are not " - "supported for input type=3D%s"), - virDomainInputTypeToString(input->type)); - return -1; - case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: - break; - case VIR_DOMAIN_INPUT_TYPE_LAST: - default: - virReportEnumRangeError(virDomainInputType, - input->type); - return -1; - } - break; - case VIR_DOMAIN_INPUT_MODEL_VIRTIO: - case VIR_DOMAIN_INPUT_MODEL_DEFAULT: - break; - case VIR_DOMAIN_INPUT_MODEL_LAST: - default: - virReportEnumRangeError(virDomainInputModel, - input->model); - return -1; - } - - switch ((virDomainInputType)input->type) { - case VIR_DOMAIN_INPUT_TYPE_MOUSE: - baseName =3D "virtio-mouse"; - cap =3D QEMU_CAPS_VIRTIO_MOUSE; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_TABLET: - baseName =3D "virtio-tablet"; - cap =3D QEMU_CAPS_VIRTIO_TABLET; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_KBD: - baseName =3D "virtio-keyboard"; - cap =3D QEMU_CAPS_VIRTIO_KEYBOARD; - ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_KEYBOARD_CCW; - break; - case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: - baseName =3D "virtio-input-host"; - cap =3D QEMU_CAPS_VIRTIO_INPUT_HOST; - ccwCap =3D QEMU_CAPS_LAST; - break; - case VIR_DOMAIN_INPUT_TYPE_LAST: - default: - virReportEnumRangeError(virDomainInputType, - input->type); - return -1; - } - - if (!virQEMUCapsGet(qemuCaps, cap) || - (input->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && - !virQEMUCapsGet(qemuCaps, ccwCap))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s is not supported by this QEMU binary"), - baseName); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateMemballoon(const virDomainMemballoonDef *membal= loon, - virQEMUCapsPtr qemuCaps) -{ - if (!memballoon || - memballoon->model =3D=3D VIR_DOMAIN_MEMBALLOON_MODEL_NONE) { - return 0; - } - - if (memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO && - memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_TRANSITI= ONAL && - memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_NON_TRAN= SITIONAL) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Memory balloon device type '%s' is not supported= by this version of qemu"), - virDomainMemballoonModelTypeToString(memballoon->mo= del)); - return -1; - } - - if (memballoon->autodeflate !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("deflate-on-oom is not supported by this QEMU bin= ary")); - return -1; - } - - return 0; -} - - -static int -qemuDomainDeviceDefValidateIOMMU(const virDomainIOMMUDef *iommu, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch (iommu->model) { - case VIR_DOMAIN_IOMMU_MODEL_INTEL: - if (!qemuDomainIsQ35(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is only supported with " - "Q35 machines"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU) && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is not supported with " - "this QEMU binary"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - break; - - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - if (!qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is only supported with " - "ARM Virt machines"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("IOMMU device: '%s' is not supported with " - "this QEMU binary"), - virDomainIOMMUModelTypeToString(iommu->model)); - return -1; - } - break; - - case VIR_DOMAIN_IOMMU_MODEL_LAST: - default: - virReportEnumRangeError(virDomainIOMMUModel, iommu->model); - return -1; - } - - /* These capability checks ensure we're not trying to use features - * of Intel IOMMU that the QEMU binary does not support, but they - * also make sure we report an error when trying to use features - * that are not implemented by SMMUv3 */ - - if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: interrupt remapping is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_CACHING_MODE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: caching mode is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: eim is not supported " - "with this QEMU binary")); - return -1; - } - if (iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("iommu: device IOTLB is not supported " - "with this QEMU binary")); - return -1; - } - - return 0; -} - - static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -5724,11 +5348,11 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_VSOCK: - ret =3D qemuDomainDeviceDefValidateVsock(dev->data.vsock, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefVsock(dev->data.vsock, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_TPM: - ret =3D qemuDomainDeviceDefValidateTPM(dev->data.tpm, def, qemuCap= s); + ret =3D qemuValidateDomainDeviceDefTPM(dev->data.tpm, def, qemuCap= s); break; =20 case VIR_DOMAIN_DEVICE_GRAPHICS: @@ -5737,15 +5361,15 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_INPUT: - ret =3D qemuDomainDeviceDefValidateInput(dev->data.input, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefInput(dev->data.input, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_MEMBALLOON: - ret =3D qemuDomainDeviceDefValidateMemballoon(dev->data.memballoon= , qemuCaps); + ret =3D qemuValidateDomainDeviceDefMemballoon(dev->data.memballoon= , qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_IOMMU: - ret =3D qemuDomainDeviceDefValidateIOMMU(dev->data.iommu, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefIOMMU(dev->data.iommu, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_FS: @@ -5753,11 +5377,11 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_NVRAM: - ret =3D qemuDomainDeviceDefValidateNVRAM(dev->data.nvram, def, qem= uCaps); + ret =3D qemuValidateDomainDeviceDefNVRAM(dev->data.nvram, def, qem= uCaps); break; =20 case VIR_DOMAIN_DEVICE_HUB: - ret =3D qemuDomainDeviceDefValidateHub(dev->data.hub, qemuCaps); + ret =3D qemuValidateDomainDeviceDefHub(dev->data.hub, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_SOUND: @@ -5765,7 +5389,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, break; =20 case VIR_DOMAIN_DEVICE_MEMORY: - ret =3D qemuDomainDeviceDefValidateMemory(dev->data.memory, qemuCa= ps); + ret =3D qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCa= ps); break; =20 case VIR_DOMAIN_DEVICE_LEASE: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 58ed2512d4..6c772093de 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -3088,3 +3088,379 @@ qemuValidateDomainDeviceDefSound(virDomainSoundDefP= tr sound, =20 return 0; } + + +int +qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_VSOCK)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vsock device is not supported " + "with this QEMU binary")); + return -1; + } + + if (!qemuDomainCheckCCWS390AddressSupport(def, &vsock->info, qemuCaps, + "vsock")) + return -1; + + return 0; +} + + +int +qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + virQEMUCapsFlags flag; + + /* TPM 1.2 and 2 are not compatible, so we choose a specific version h= ere */ + if (tpm->version =3D=3D VIR_DOMAIN_TPM_VERSION_DEFAULT) + tpm->version =3D VIR_DOMAIN_TPM_VERSION_1_2; + + switch (tpm->version) { + case VIR_DOMAIN_TPM_VERSION_1_2: + /* TPM 1.2 + CRB do not work */ + if (tpm->type =3D=3D VIR_DOMAIN_TPM_TYPE_EMULATOR && + tpm->model =3D=3D VIR_DOMAIN_TPM_MODEL_CRB) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported interface %s for TPM 1.2"), + virDomainTPMModelTypeToString(tpm->model)); + return -1; + } + break; + case VIR_DOMAIN_TPM_VERSION_2_0: + case VIR_DOMAIN_TPM_VERSION_DEFAULT: + case VIR_DOMAIN_TPM_VERSION_LAST: + break; + } + + switch (tpm->type) { + case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) + goto no_support; + break; + + case VIR_DOMAIN_TPM_TYPE_EMULATOR: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR)) + goto no_support; + + break; + case VIR_DOMAIN_TPM_TYPE_LAST: + break; + } + + switch (tpm->model) { + case VIR_DOMAIN_TPM_MODEL_TIS: + flag =3D QEMU_CAPS_DEVICE_TPM_TIS; + break; + case VIR_DOMAIN_TPM_MODEL_CRB: + flag =3D QEMU_CAPS_DEVICE_TPM_CRB; + break; + case VIR_DOMAIN_TPM_MODEL_SPAPR: + flag =3D QEMU_CAPS_DEVICE_TPM_SPAPR; + break; + case VIR_DOMAIN_TPM_MODEL_LAST: + default: + virReportEnumRangeError(virDomainTPMModel, tpm->model); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, flag)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The QEMU executable %s does not support TPM " + "model %s"), + def->emulator, + virDomainTPMModelTypeToString(tpm->model)); + return -1; + } + + return 0; + + no_support: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The QEMU executable %s does not support TPM " + "backend type %s"), + def->emulator, + virDomainTPMBackendTypeToString(tpm->type)); + return -1; +} + + +int +qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + const char *baseName; + int cap; + int ccwCap; + + if (input->bus =3D=3D VIR_DOMAIN_INPUT_BUS_PS2 && !ARCH_IS_X86(def->os= .arch) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_I8042)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s is not supported by this QEMU binary"), + virDomainInputBusTypeToString(input->bus)); + return -1; + } + + if (input->bus !=3D VIR_DOMAIN_INPUT_BUS_VIRTIO) + return 0; + + /* Only type=3Dpassthrough supports model=3Dvirtio-(non-)transitional = */ + switch ((virDomainInputModel)input->model) { + case VIR_DOMAIN_INPUT_MODEL_VIRTIO_TRANSITIONAL: + case VIR_DOMAIN_INPUT_MODEL_VIRTIO_NON_TRANSITIONAL: + switch ((virDomainInputType)input->type) { + case VIR_DOMAIN_INPUT_TYPE_MOUSE: + case VIR_DOMAIN_INPUT_TYPE_TABLET: + case VIR_DOMAIN_INPUT_TYPE_KBD: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("virtio (non-)transitional models are not " + "supported for input type=3D%s"), + virDomainInputTypeToString(input->type)); + return -1; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportEnumRangeError(virDomainInputType, + input->type); + return -1; + } + break; + case VIR_DOMAIN_INPUT_MODEL_VIRTIO: + case VIR_DOMAIN_INPUT_MODEL_DEFAULT: + break; + case VIR_DOMAIN_INPUT_MODEL_LAST: + default: + virReportEnumRangeError(virDomainInputModel, + input->model); + return -1; + } + + switch ((virDomainInputType)input->type) { + case VIR_DOMAIN_INPUT_TYPE_MOUSE: + baseName =3D "virtio-mouse"; + cap =3D QEMU_CAPS_VIRTIO_MOUSE; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_TABLET: + baseName =3D "virtio-tablet"; + cap =3D QEMU_CAPS_VIRTIO_TABLET; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_KBD: + baseName =3D "virtio-keyboard"; + cap =3D QEMU_CAPS_VIRTIO_KEYBOARD; + ccwCap =3D QEMU_CAPS_DEVICE_VIRTIO_KEYBOARD_CCW; + break; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + baseName =3D "virtio-input-host"; + cap =3D QEMU_CAPS_VIRTIO_INPUT_HOST; + ccwCap =3D QEMU_CAPS_LAST; + break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportEnumRangeError(virDomainInputType, + input->type); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, cap) || + (input->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && + !virQEMUCapsGet(qemuCaps, ccwCap))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s is not supported by this QEMU binary"), + baseName); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *membal= loon, + virQEMUCapsPtr qemuCaps) +{ + if (!memballoon || + memballoon->model =3D=3D VIR_DOMAIN_MEMBALLOON_MODEL_NONE) { + return 0; + } + + if (memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO && + memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_TRANSITI= ONAL && + memballoon->model !=3D VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_NON_TRAN= SITIONAL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Memory balloon device type '%s' is not supported= by this version of qemu"), + virDomainMemballoonModelTypeToString(memballoon->mo= del)); + return -1; + } + + if (memballoon->autodeflate !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("deflate-on-oom is not supported by this QEMU bin= ary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch (iommu->model) { + case VIR_DOMAIN_IOMMU_MODEL_INTEL: + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is only supported with " + "Q35 machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is not supported with " + "this QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (!qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is only supported with " + "ARM Virt machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%s' is not supported with " + "this QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + + case VIR_DOMAIN_IOMMU_MODEL_LAST: + default: + virReportEnumRangeError(virDomainIOMMUModel, iommu->model); + return -1; + } + + /* These capability checks ensure we're not trying to use features + * of Intel IOMMU that the QEMU binary does not support, but they + * also make sure we report an error when trying to use features + * that are not implemented by SMMUv3 */ + + if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: interrupt remapping is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_CACHING_MODE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: caching mode is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: eim is not supported " + "with this QEMU binary")); + return -1; + } + if (iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: device IOTLB is not supported " + "with this QEMU binary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (!nvram) + return 0; + + if (qemuDomainIsPSeries(def)) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvram device is not supported by " + "this QEMU binary")); + return -1; + } + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvram device is only supported for PPC64")); + return -1; + } + + if (!(nvram->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO = && + nvram->info.addr.spaprvio.has_reg)) { + + virReportError(VIR_ERR_XML_ERROR, "%s", + _("nvram address type must be spaprvio")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, + virQEMUCapsPtr qemuCaps) +{ + if (hub->type !=3D VIR_DOMAIN_HUB_TYPE_USB) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hub type %s not supported"), + virDomainHubTypeToString(hub->type)); + return -1; + } + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("usb-hub not supported by QEMU binary")); + return -1; + } + + return 0; +} + + +int +qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, + virQEMUCapsPtr qemuCaps) +{ + if (mem->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_NVDIMM && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("nvdimm isn't supported by this QEMU binary")); + return -1; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index e61a932809..ac4eb9b772 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -62,3 +62,24 @@ int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *me= mballoon, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); --=20 2.25.1 From nobody Sat May 4 21:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258352; cv=none; d=zohomail.com; s=zohoarc; b=G67u49/rpq0BKeRqYPoI+j3NvZYrq4fC0DW4+Y1mB/h9yupSNTJwN9iy/ZTKve3aUcscRoaRaks3JCNrsbkAMp04d59Y6Ox7nsASWq2rdsc5HUB9tQfq+o2AdJI/7KW5PNHbsA7j+A/SArei66u7GACWlXE5qSD6AVS0VZiQzg4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258352; 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=ub57j/OYO/lmXfVE3NxYuclHkl3419OKGfjuMgo2h48=; b=H222Z6xhudWbmcxruhB6ti8QlP24p5JP3qUjUgCSrtmCn0G5lkfP1AEZXCYBKtFt1tla575C6/C9tal0ecVS+h1MtuHIeWbn2yo59kfGQ8y5RUWqcta54WeBDsRX6frIeMNoRgLQbksEQO6GBBb3kbm+6Oop+zVWSi9BfA3ny8s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 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-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258352886895.3131878356979; Thu, 26 Mar 2020 14:32:32 -0700 (PDT) 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-37-acNVd9PFMw6KiUlA_sk28g-1; Thu, 26 Mar 2020 17:32:29 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 366328010E8; Thu, 26 Mar 2020 21:32:23 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0465096F81; Thu, 26 Mar 2020 21:32:23 +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 A7BC08A03F; Thu, 26 Mar 2020 21:32:22 +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 02QLWEXX010361 for ; Thu, 26 Mar 2020 17:32:14 -0400 Received: by smtp.corp.redhat.com (Postfix) id 95D3C2166B2C; Thu, 26 Mar 2020 21:32:14 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 91A932166B2B for ; Thu, 26 Mar 2020 21:32:12 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (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 D8EC48F783B for ; Thu, 26 Mar 2020 21:32:11 +0000 (UTC) Received: from mail-qk1-f174.google.com (mail-qk1-f174.google.com [209.85.222.174]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-439-1talif_6OxaAPU0co5T34A-1; Thu, 26 Mar 2020 17:32:09 -0400 Received: by mail-qk1-f174.google.com with SMTP id u4so8629642qkj.13; Thu, 26 Mar 2020 14:32:08 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.32.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:32:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258351; 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=ub57j/OYO/lmXfVE3NxYuclHkl3419OKGfjuMgo2h48=; b=bsijdfkvTSfCokgxW5duhojv75tVo/g8ONkBRso/KVBe2xO28Up/IaDE2bmgg0mvxJ0yen hwRN86GUFObHOoxV8jsDm1RD1sBdka0KnS3fHoqS8VMsjWxdLUynsDdkj/+gSODudMKscu WCo8LnQIlzCCjNYBFa8wuiffqbGD6uE= X-MC-Unique: acNVd9PFMw6KiUlA_sk28g-1 X-MC-Unique: 1talif_6OxaAPU0co5T34A-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=UNidP6kAzKEGsa9Y7D66S50vLFDvJtX+VI+dTF6PN/g=; b=qeYNXiD1ihkO8nnhhaFIrIpW9Hp4kldSPzD8e2y3+lWQTrkIq9CTM1J91AosGxYC/4 OoTXou4B7yP26X52aCWuvmrZo3elvLk3oH8CzlpF9QTZqnmibh08O8LS6E9m2JbmoUuk SZ/hFUoek6Biab06i/1C+n//2CUTze3DwtLQkQs8PVGsTdcr3HTy+dG9yktydQAVeDWg ng9QvbauWZIpyCK9hsw/sABvDkrZT734sU6vY3pHujz3Ub4JQWBotfS4Xti3zoo/KNtd vqtZeY+3hmxWaFGBs5abmxHf6ItwC7AvP/vW7rC49M8gsQgxmjQci8U52uqBrdQR9Pvv 3G5Q== X-Gm-Message-State: ANhLgQ1lz+APxiDZHvVfJf/4YioNowUcqIdGjQk5baNJ44xkyw3+p3WW f3+dDSJGns1LBvjg/o2Myu0K0Sz/ X-Google-Smtp-Source: ADFU+vvnB90qPKrJLRZquVVYC/e6H1A8cDaH9robPUb+wHokPQqDwXXjhp5HQh9CDBcHmpsJpEFzGQ== X-Received: by 2002:a37:7d5:: with SMTP id 204mr11005065qkh.171.1585258328037; Thu, 26 Mar 2020 14:32:08 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 15/15] qemu: move qemuValidateDomainDeviceDef() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:25 -0300 Message-Id: <20200326213125.2306013-16-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.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 02QLWEXX010361 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com 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.79 on 10.5.11.13 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" Now that all its helper functions are in qemu_validate.c, we can move the function itself. The helpers can become static again since they're all in the same file. Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 128 +---------------------------- src/qemu/qemu_validate.c | 168 ++++++++++++++++++++++++++++++++++----- src/qemu/qemu_validate.h | 57 +------------ 3 files changed, 151 insertions(+), 202 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 3ab2bfe879..76ef0c531f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5278,132 +5278,6 @@ qemuDomainValidateStorageSource(virStorageSourcePtr= src, } =20 =20 -static int -qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, - const virDomainDef *def, - void *opaque) -{ - int ret =3D 0; - virQEMUDriverPtr driver =3D opaque; - g_autoptr(virQEMUCaps) qemuCaps =3D NULL; - g_autoptr(virDomainCaps) domCaps =3D NULL; - - if (!(qemuCaps =3D virQEMUCapsCacheLookup(driver->qemuCapsCache, - def->emulator))) - return -1; - - if (!(domCaps =3D virQEMUDriverGetDomainCapabilities(driver, qemuCaps, - def->os.machine, - def->os.arch, - def->virtType))) - return -1; - - if ((ret =3D qemuValidateDomainDeviceDefAddress(dev, qemuCaps)) < 0) - return ret; - - if ((ret =3D virDomainCapsDeviceDefValidate(domCaps, dev, def)) < 0) - return ret; - - switch ((virDomainDeviceType)dev->type) { - case VIR_DOMAIN_DEVICE_NET: - ret =3D qemuValidateDomainDeviceDefNetwork(dev->data.net, qemuCaps= ); - break; - - case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuValidateDomainChrDef(dev->data.chr, def, qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_SMARTCARD: - ret =3D qemuValidateDomainSmartcardDef(dev->data.smartcard, qemuCa= ps); - break; - - case VIR_DOMAIN_DEVICE_RNG: - ret =3D qemuValidateDomainRNGDef(dev->data.rng, qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_REDIRDEV: - ret =3D qemuValidateDomainRedirdevDef(dev->data.redirdev, qemuCaps= ); - break; - - case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuValidateDomainWatchdogDef(dev->data.watchdog, def); - break; - - case VIR_DOMAIN_DEVICE_HOSTDEV: - ret =3D qemuValidateDomainDeviceDefHostdev(dev->data.hostdev, def, - qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_VIDEO: - ret =3D qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps= ); - break; - - case VIR_DOMAIN_DEVICE_DISK: - ret =3D qemuValidateDomainDeviceDefDisk(dev->data.disk, qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_CONTROLLER: - ret =3D qemuValidateDomainDeviceDefController(dev->data.controller= , def, - qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_VSOCK: - ret =3D qemuValidateDomainDeviceDefVsock(dev->data.vsock, def, qem= uCaps); - break; - - case VIR_DOMAIN_DEVICE_TPM: - ret =3D qemuValidateDomainDeviceDefTPM(dev->data.tpm, def, qemuCap= s); - break; - - case VIR_DOMAIN_DEVICE_GRAPHICS: - ret =3D qemuValidateDomainDeviceDefGraphics(dev->data.graphics, de= f, - driver, qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_INPUT: - ret =3D qemuValidateDomainDeviceDefInput(dev->data.input, def, qem= uCaps); - break; - - case VIR_DOMAIN_DEVICE_MEMBALLOON: - ret =3D qemuValidateDomainDeviceDefMemballoon(dev->data.memballoon= , qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_IOMMU: - ret =3D qemuValidateDomainDeviceDefIOMMU(dev->data.iommu, def, qem= uCaps); - break; - - case VIR_DOMAIN_DEVICE_FS: - ret =3D qemuValidateDomainDeviceDefFS(dev->data.fs, def, driver, q= emuCaps); - break; - - case VIR_DOMAIN_DEVICE_NVRAM: - ret =3D qemuValidateDomainDeviceDefNVRAM(dev->data.nvram, def, qem= uCaps); - break; - - case VIR_DOMAIN_DEVICE_HUB: - ret =3D qemuValidateDomainDeviceDefHub(dev->data.hub, qemuCaps); - break; - - case VIR_DOMAIN_DEVICE_SOUND: - ret =3D qemuValidateDomainDeviceDefSound(dev->data.sound, qemuCaps= ); - break; - - case VIR_DOMAIN_DEVICE_MEMORY: - ret =3D qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCa= ps); - break; - - case VIR_DOMAIN_DEVICE_LEASE: - case VIR_DOMAIN_DEVICE_SHMEM: - case VIR_DOMAIN_DEVICE_PANIC: - case VIR_DOMAIN_DEVICE_NONE: - case VIR_DOMAIN_DEVICE_LAST: - break; - } - - return ret; -} - - /** * qemuDomainDefaultNetModel: * @def: domain definition @@ -6153,7 +6027,7 @@ virDomainDefParserConfig virQEMUDriverDomainDefParser= Config =3D { .domainPostParseCallback =3D qemuDomainDefPostParse, .assignAddressesCallback =3D qemuDomainDefAssignAddresses, .domainValidateCallback =3D qemuValidateDomainDef, - .deviceValidateCallback =3D qemuDomainDeviceDefValidate, + .deviceValidateCallback =3D qemuValidateDomainDeviceDef, =20 .features =3D VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG | VIR_DOMAIN_DEF_FEATURE_OFFLINE_VCPUPIN | diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 6c772093de..e059ad79e1 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -963,7 +963,7 @@ qemuValidateDomainDeviceDefZPCIAddress(virDomainDeviceI= nfoPtr info, } =20 =20 -int +static int qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, virQEMUCapsPtr qemuCaps) { @@ -1043,7 +1043,7 @@ qemuValidateNetSupportsCoalesce(virDomainNetType type) } =20 =20 -int +static int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps) { @@ -1360,7 +1360,7 @@ qemuValidateDomainChrSourceDef(const virDomainChrSour= ceDef *def, } =20 =20 -int +static int qemuValidateDomainChrDef(const virDomainChrDef *dev, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -1420,7 +1420,7 @@ qemuValidateDomainChrDef(const virDomainChrDef *dev, } =20 =20 -int +static int qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, virQEMUCapsPtr qemuCaps) { @@ -1465,7 +1465,7 @@ qemuValidateDomainSmartcardDef(const virDomainSmartca= rdDef *def, } =20 =20 -int +static int qemuValidateDomainRNGDef(const virDomainRNGDef *def, virQEMUCapsPtr qemuCaps G_GNUC_UNUSED) { @@ -1477,7 +1477,7 @@ qemuValidateDomainRNGDef(const virDomainRNGDef *def, } =20 =20 -int +static int qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, virQEMUCapsPtr qemuCaps) { @@ -1488,7 +1488,7 @@ qemuValidateDomainRedirdevDef(const virDomainRedirdev= Def *def, } =20 =20 -int +static int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, const virDomainDef *def) { @@ -1667,7 +1667,7 @@ qemuValidateDomainMdevDef(const virDomainHostdevDef *= hostdev, } =20 =20 -int +static int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -1724,7 +1724,7 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHos= tdevDef *hostdev, } =20 =20 -int +static int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video, virQEMUCapsPtr qemuCaps) { @@ -2671,7 +2671,7 @@ qemuValidateDomainDeviceDefControllerPCI(const virDom= ainControllerDef *cont, #undef virReportControllerMissingOption =20 =20 -int +static int qemuValidateDomainDeviceDefController(const virDomainControllerDef *contro= ller, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -2795,7 +2795,7 @@ qemuValidateDomainDeviceDefSPICEGraphics(const virDom= ainGraphicsDef *graphics, } =20 =20 -int +static int qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics, const virDomainDef *def, virQEMUDriverPtr driver, @@ -2938,7 +2938,7 @@ qemuValidateDomainDefVirtioFSSharedMemory(const virDo= mainDef *def) } =20 =20 -int +static int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, const virDomainDef *def, virQEMUDriverPtr driver, @@ -3031,7 +3031,7 @@ qemuSoundCodecTypeToCaps(int type) } =20 =20 -int +static int qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, virQEMUCapsPtr qemuCaps) { @@ -3090,7 +3090,7 @@ qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr= sound, } =20 =20 -int +static int qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -3110,7 +3110,7 @@ qemuValidateDomainDeviceDefVsock(const virDomainVsock= Def *vsock, } =20 =20 -int +static int qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -3190,7 +3190,7 @@ qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, } =20 =20 -int +static int qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -3283,7 +3283,7 @@ qemuValidateDomainDeviceDefInput(const virDomainInput= Def *input, } =20 =20 -int +static int qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *membal= loon, virQEMUCapsPtr qemuCaps) { @@ -3312,7 +3312,7 @@ qemuValidateDomainDeviceDefMemballoon(const virDomain= MemballoonDef *memballoon, } =20 =20 -int +static int qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -3397,7 +3397,7 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMU= Def *iommu, } =20 =20 -int +static int qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, const virDomainDef *def, virQEMUCapsPtr qemuCaps) @@ -3430,7 +3430,7 @@ qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr= nvram, } =20 =20 -int +static int qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, virQEMUCapsPtr qemuCaps) { @@ -3451,7 +3451,7 @@ qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, } =20 =20 -int +static int qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, virQEMUCapsPtr qemuCaps) { @@ -3464,3 +3464,129 @@ qemuValidateDomainDeviceDefMemory(virDomainMemoryDe= fPtr mem, =20 return 0; } + + +int +qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, + const virDomainDef *def, + void *opaque) +{ + int ret =3D 0; + virQEMUDriverPtr driver =3D opaque; + g_autoptr(virQEMUCaps) qemuCaps =3D NULL; + g_autoptr(virDomainCaps) domCaps =3D NULL; + + if (!(qemuCaps =3D virQEMUCapsCacheLookup(driver->qemuCapsCache, + def->emulator))) + return -1; + + if (!(domCaps =3D virQEMUDriverGetDomainCapabilities(driver, qemuCaps, + def->os.machine, + def->os.arch, + def->virtType))) + return -1; + + if ((ret =3D qemuValidateDomainDeviceDefAddress(dev, qemuCaps)) < 0) + return ret; + + if ((ret =3D virDomainCapsDeviceDefValidate(domCaps, dev, def)) < 0) + return ret; + + switch ((virDomainDeviceType)dev->type) { + case VIR_DOMAIN_DEVICE_NET: + ret =3D qemuValidateDomainDeviceDefNetwork(dev->data.net, qemuCaps= ); + break; + + case VIR_DOMAIN_DEVICE_CHR: + ret =3D qemuValidateDomainChrDef(dev->data.chr, def, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_SMARTCARD: + ret =3D qemuValidateDomainSmartcardDef(dev->data.smartcard, qemuCa= ps); + break; + + case VIR_DOMAIN_DEVICE_RNG: + ret =3D qemuValidateDomainRNGDef(dev->data.rng, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_REDIRDEV: + ret =3D qemuValidateDomainRedirdevDef(dev->data.redirdev, qemuCaps= ); + break; + + case VIR_DOMAIN_DEVICE_WATCHDOG: + ret =3D qemuValidateDomainWatchdogDef(dev->data.watchdog, def); + break; + + case VIR_DOMAIN_DEVICE_HOSTDEV: + ret =3D qemuValidateDomainDeviceDefHostdev(dev->data.hostdev, def, + qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_VIDEO: + ret =3D qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps= ); + break; + + case VIR_DOMAIN_DEVICE_DISK: + ret =3D qemuValidateDomainDeviceDefDisk(dev->data.disk, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_CONTROLLER: + ret =3D qemuValidateDomainDeviceDefController(dev->data.controller= , def, + qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_VSOCK: + ret =3D qemuValidateDomainDeviceDefVsock(dev->data.vsock, def, qem= uCaps); + break; + + case VIR_DOMAIN_DEVICE_TPM: + ret =3D qemuValidateDomainDeviceDefTPM(dev->data.tpm, def, qemuCap= s); + break; + + case VIR_DOMAIN_DEVICE_GRAPHICS: + ret =3D qemuValidateDomainDeviceDefGraphics(dev->data.graphics, de= f, + driver, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_INPUT: + ret =3D qemuValidateDomainDeviceDefInput(dev->data.input, def, qem= uCaps); + break; + + case VIR_DOMAIN_DEVICE_MEMBALLOON: + ret =3D qemuValidateDomainDeviceDefMemballoon(dev->data.memballoon= , qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_IOMMU: + ret =3D qemuValidateDomainDeviceDefIOMMU(dev->data.iommu, def, qem= uCaps); + break; + + case VIR_DOMAIN_DEVICE_FS: + ret =3D qemuValidateDomainDeviceDefFS(dev->data.fs, def, driver, q= emuCaps); + break; + + case VIR_DOMAIN_DEVICE_NVRAM: + ret =3D qemuValidateDomainDeviceDefNVRAM(dev->data.nvram, def, qem= uCaps); + break; + + case VIR_DOMAIN_DEVICE_HUB: + ret =3D qemuValidateDomainDeviceDefHub(dev->data.hub, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_SOUND: + ret =3D qemuValidateDomainDeviceDefSound(dev->data.sound, qemuCaps= ); + break; + + case VIR_DOMAIN_DEVICE_MEMORY: + ret =3D qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCa= ps); + break; + + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_SHMEM: + case VIR_DOMAIN_DEVICE_PANIC: + case VIR_DOMAIN_DEVICE_NONE: + case VIR_DOMAIN_DEVICE_LAST: + break; + } + + return ret; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index ac4eb9b772..f667a57195 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -29,57 +29,6 @@ int qemuValidateDomainDef(const virDomainDef *def, void *opaque); int qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk, virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainChrDef(const virDomainChrDef *dev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainRNGDef(const virDomainRNGDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, - const virDomainDef *def); -int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefController(const virDomainControllerDef *co= ntroller, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphi= cs, - const virDomainDef *def, - virQEMUDriverPtr driver, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefFS(virDomainFSDefPtr fs, - const virDomainDef *def, - virQEMUDriverPtr driver, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefSound(virDomainSoundDefPtr sound, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefVsock(const virDomainVsockDef *vsock, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefTPM(virDomainTPMDef *tpm, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefMemballoon(const virDomainMemballoonDef *me= mballoon, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefHub(virDomainHubDefPtr hub, - virQEMUCapsPtr qemuCaps); -int qemuValidateDomainDeviceDefNVRAM(virDomainNVRAMDefPtr nvram, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps); +int qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, + const virDomainDef *def, + void *opaque); --=20 2.25.1