From patchwork Thu Apr 4 23:37:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cole Robinson X-Patchwork-Id: 161822 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp2205495jan; Thu, 4 Apr 2019 16:39:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqxKpN5m+vNDexVGpk2A6f5Fp3Trb/0xASZKy/VzSAJsy2tElLBDChRag6+BnBY93Zz683mh X-Received: by 2002:ae9:e909:: with SMTP id x9mr7680302qkf.130.1554421196410; Thu, 04 Apr 2019 16:39:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554421196; cv=none; d=google.com; s=arc-20160816; b=TxUOksTQMCJjezSUxqDa5s/RPnqt6S2YXjj+qotFxjTNjPHSQKXxe8L7leTmSC40Kn gelgXQpAoZPNfARgqos7h5VxSXQSZnsJS/nWR3MgC1m4xebVRIra4XOsUyOor1amCHQF j3ecOZvtA19h7ToIx3iLMmJ0XT3Woicaza76rl3yvm3Od7kvp6tFLuv8K63Opw4WHhJL EPmsdtJQsO2IgTa8RImEq9ZxRbkwOOswLXlm1eebUJF8U7KoTK5hM1nh6FPYEmt61Ju2 ZuBrVPwKcfJIjif4G2HVJUfxABoqv2NzGnQe7jshyLNwNPY4QZXAQ28LGEQQGUM1q9l/ Sz0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:sender:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:references:in-reply-to:message-id:date:to:from :delivered-to; bh=3kc4p88gsdQs5mdOdOMeK8r2FbIOa3WUWwaC3RQFk8o=; b=ZcZ/4sbZlK4eIQC1VNRGSUbaGVMZDOEiVMq6ph4RWtYgebrOJ1LAfd1541zaNZ6ZqC PjHkHv1bzmSgoWxRGhipm8C2ZaM6rvtb0t5gqbtmrLH1q0Avx5jUEMBFMPlRBFnAmats YWEVbqyo6BqIOCbjhYXWAC7r70kNmSQZpzTtBS1z3AqYOijHDdY1bH1ueuFO6jsxWEQ4 H+P9WKCDTkte7O39JaPtUiPdhZClEDp99p3O/lZQXymEyqG4ftZs0yqFbpm9TcDN8uVG EqIWnptUcLImTF3wXOx0qZaLr+5okawdmzAXVPs2vQnp1KSYAbIpp1yY1PFk/RMpf5Jw sgjw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of libvir-list-bounces@redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com. [209.132.183.28]) by mx.google.com with ESMTPS id b194si955482qkg.58.2019.04.04.16.39.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Apr 2019 16:39:56 -0700 (PDT) Received-SPF: pass (google.com: domain of libvir-list-bounces@redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; Authentication-Results: mx.google.com; spf=pass (google.com: domain of libvir-list-bounces@redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com 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 mx1.redhat.com (Postfix) with ESMTPS id 274DF99DD7; Thu, 4 Apr 2019 23:39:55 +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 0003780FE; Thu, 4 Apr 2019 23:39:54 +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 B9207181AC44; Thu, 4 Apr 2019 23:39:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x34Nbk5s011070 for ; Thu, 4 Apr 2019 19:37:46 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1679460919; Thu, 4 Apr 2019 23:37:46 +0000 (UTC) Delivered-To: libvirt-list@redhat.com Received: from worklaptop.redhat.com (ovpn-124-22.rdu2.redhat.com [10.10.124.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3DE91608E5; Thu, 4 Apr 2019 23:37:45 +0000 (UTC) From: Cole Robinson To: libvirt-list@redhat.com Date: Thu, 4 Apr 2019 19:37:27 -0400 Message-Id: <72fe0785355cf6a844416218dfba1d6aeaaba5bb.1554419814.git.crobinso@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 7/7] qemu: Move rng model validation to domcaps 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-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 04 Apr 2019 23:39:55 +0000 (UTC) The qemu driver already does some model validation, based on qemuCaps. However, the logic for exposing model values in domcaps is basically identical. This drops the qemuCaps checking and compares against the domCaps data directly. This approach makes it basically impossible to add a new model to the qemu driver without extending domcaps. The validation can also be shared with other drivers eventually. Signed-off-by: Cole Robinson --- src/conf/domain_capabilities.c | 35 +++++++++++++++++++++++++++++++--- src/conf/domain_capabilities.h | 1 + src/qemu/qemu_domain.c | 26 +------------------------ 3 files changed, 34 insertions(+), 28 deletions(-) -- 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index aef5703df6..977f15b9ed 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -659,19 +659,48 @@ virDomainCapsFormat(virDomainCapsPtr const caps) } +#define ENUM_VALUE_MISSING(capsEnum, value) !(capsEnum.values & (1 << value)) + +#define ENUM_VALUE_ERROR(valueLabel, valueString) \ + do { \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("domain configuration does not support '%s' value '%s'"), \ + valueLabel, valueString); \ + } while (0) + + +static int +virDomainCapsDeviceRNGDefValidate(virDomainCapsPtr const caps, + const virDomainRNGDef *dev) +{ + if (ENUM_VALUE_MISSING(caps->rng.model, dev->model)) { + ENUM_VALUE_ERROR("rng model", + virDomainRNGModelTypeToString(dev->model)); + return -1; + } + + return 0; +} + + int -virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps ATTRIBUTE_UNUSED, +virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps, const virDomainDeviceDef *dev, const virDomainDef *def ATTRIBUTE_UNUSED) { + int ret = 0; + switch ((virDomainDeviceType) dev->type) { + case VIR_DOMAIN_DEVICE_RNG: + ret = virDomainCapsDeviceRNGDefValidate(caps, dev->data.rng); + break; + case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_REDIRDEV: case VIR_DOMAIN_DEVICE_NET: case VIR_DOMAIN_DEVICE_CONTROLLER: case VIR_DOMAIN_DEVICE_CHR: case VIR_DOMAIN_DEVICE_SMARTCARD: - case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_HOSTDEV: case VIR_DOMAIN_DEVICE_VIDEO: case VIR_DOMAIN_DEVICE_MEMORY: @@ -694,5 +723,5 @@ virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps ATTRIBUTE_UNUSED, break; } - return 0; + return ret; } diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index ffce2c2964..997c7d9444 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -215,6 +215,7 @@ virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels, __nvalues, __values); \ } while (0) + int virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum, const char *capsEnumName, size_t nvalues, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6da27a79b0..cad08439b1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4523,36 +4523,12 @@ qemuDomainSmartcardDefValidate(const virDomainSmartcardDef *def) static int qemuDomainRNGDefValidate(const virDomainRNGDef *def, - virQEMUCapsPtr qemuCaps) + virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED) { - bool modelIsSupported = false; - if (def->backend == VIR_DOMAIN_RNG_BACKEND_EGD && qemuDomainChrSourceDefValidate(def->source.chardev) < 0) return -1; - switch ((virDomainRNGModel) def->model) { - case VIR_DOMAIN_RNG_MODEL_VIRTIO: - modelIsSupported = virQEMUCapsGet(qemuCaps, - QEMU_CAPS_DEVICE_VIRTIO_RNG); - break; - case VIR_DOMAIN_RNG_MODEL_VIRTIO_TRANSITIONAL: - case VIR_DOMAIN_RNG_MODEL_VIRTIO_NON_TRANSITIONAL: - modelIsSupported = (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_RNG) && - (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL) || - virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY))); - break; - case VIR_DOMAIN_RNG_MODEL_LAST: - break; - } - - if (!modelIsSupported) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("this qemu doesn't support RNG device type '%s'"), - virDomainRNGModelTypeToString(def->model)); - return -1; - } - return 0; }