From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1580402736835593.0595529585916; Thu, 30 Jan 2020 08:45:36 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-323-KpGPqQk2OuCqB-7ZONoztg-1; Thu, 30 Jan 2020 11:45:32 -0500 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 23A7A190B2BD; Thu, 30 Jan 2020 16:45:26 +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 2F3A87794E; Thu, 30 Jan 2020 16:45: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 D9F2487A91; Thu, 30 Jan 2020 16:45:24 +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 00UGiuvO031888 for ; Thu, 30 Jan 2020 11:44:56 -0500 Received: by smtp.corp.redhat.com (Postfix) id 49847F8A07; Thu, 30 Jan 2020 16:44:56 +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 44689F8A0B for ; Thu, 30 Jan 2020 16:44:54 +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 EAA49803B5C for ; Thu, 30 Jan 2020 16:44:53 +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-231-fnY80bEbMq-jTZUl_9vPTw-1; Thu, 30 Jan 2020 11:44:50 -0500 Received: by mail-qk1-f196.google.com with SMTP id g195so3484532qke.13 for ; Thu, 30 Jan 2020 08:44:50 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402735; 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=PZU49kV2PEo9MpwRqyMaMvIcXPeLG4O8atkAK7txNbk=; b=OqdJOzbg5GgdJ//AqbH84j1ZReV+j3Y0DQEhm+YDk/nHgNhUiFH8P/TXmTDNEuu8Z7iLxg 7ejME2iDi7FOAXKCBUVmnRKfTFeiU8nrz4mcHSmyu33yBE+PvhEz6G5feMFj2Rs8Uk8UkN PRMdKCTEgyuZKjOm15pa2yiCkqBtcew= 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=H5oMu+1KkR/5xtz8rtF1Gcwuy6uNttWpWZCZ2JqewOI=; b=kyYXt58xEfmVp9F9qbs0qyF+4PAscToW8adnP39UOaaF3I7Ct3tuHBKwEghhA25jnF +LAIxv6C3R9e9JiTy3weWJk93YlQA0mzN1Tp65QWuikFIx8AvIkIdf4aFRqCR5/AQ8cV o6g/gda3hEjCvKYe6+K1YbRYLgZz9/BhdfRvCLHtcnLmGUBcxp94LRsPMTqRfykfOTNV psdF+qXfGvHc4M0pMd7f+3/xOyJS+FynWIuGqnq46uMtPz307jM+Xf+Y0Hi1YC3luxhF 1UUUWjpcXu4ziR2dElnmin0pEwoim0Xgry1WP4XrCiyn4SSQ3EA9N+S5obpuHlE5sE5g ooxg== X-Gm-Message-State: APjAAAUILmJ2bDEamq/RjxN3w6goA+K97a6DvQ+oyuz53e93LLib2Ba+ dO6NKmwUaEzHkmWhnJvuWVk15NSXj7k= X-Google-Smtp-Source: APXvYqwzJ9vcsmYFH88d1+HCyY3+6OQO8luyJGUd0/ePY664A2rLz2NY8kDtCUrNkfh876sXXP9T/Q== X-Received: by 2002:ae9:f408:: with SMTP id y8mr5829797qkl.97.1580402689407; Thu, 30 Jan 2020 08:44:49 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 01/21] qemu: address: Separate the slots into multiple aggregates Date: Thu, 30 Jan 2020 13:44:13 -0300 Message-Id: <20200130164433.2694119-2-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: fnY80bEbMq-jTZUl_9vPTw-1 X-MC-Unique: KpGPqQk2OuCqB-7ZONoztg-1 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 00UGiuvO031888 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat Today's aggregate flag with the slot being true for pcie-root-ports is not enough as there will more number of aggregates depending on the number of Multifunction PCI cards assigned to the domain. The aggregate is changed to unsigned int. Zero means Not Applicable, 1 is reserved for the pcie-root-ports and >=3D 2 for the the PCI Multifunction cards(coming..). Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/conf/device_conf.h | 1 + src/conf/domain_addr.c | 45 ++++++++++++------ src/conf/domain_addr.h | 38 +++++++-------- src/qemu/qemu_domain_address.c | 84 ++++++++++++++++++++++++++++------ src/qemu/qemu_domain_address.h | 9 ++++ 5 files changed, 127 insertions(+), 50 deletions(-) diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index e091d7cfe2..d8649daa6d 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -170,6 +170,7 @@ struct _virDomainDeviceInfo { */ int pciAddrExtFlags; /* enum virDomainPCIAddressExtensionFlags */ char *loadparm; + unsigned int aggregateSlotIdx; /* Used when the aggregate flag is set = */ =20 /* PCI devices will only be automatically placed on a PCI bus * that shares the same isolation group */ diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 607ba56efd..8e4817689e 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -297,7 +297,7 @@ virDomainPCIControllerModelToConnectType(virDomainContr= ollerModelPCI model) return VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE; =20 case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: - return VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT | VIR_PCI_CONNECT_AGGRE= GATE_SLOT; + return VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT; =20 case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: return VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT; @@ -827,6 +827,7 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAddr= essSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags, unsigned int isolationGroup, + unsigned int aggregateSlotIdx, bool fromConfig) { int ret =3D -1; @@ -859,9 +860,14 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAdd= ressSetPtr addrs, * the device it's being reserved for can aggregate multiples on a * slot, set the slot's aggregate flag. */ - if (!bus->slot[addr->slot].functions && - flags & VIR_PCI_CONNECT_AGGREGATE_SLOT) { - bus->slot[addr->slot].aggregate =3D true; + if (!bus->slot[addr->slot].functions && aggregateSlotIdx > 0) { + bus->slot[addr->slot].aggregateSlotIdx =3D aggregateSlotIdx; + } else if (bus->slot[addr->slot].aggregateSlotIdx !=3D + aggregateSlotIdx && fromConfig) { + bus->slot[addr->slot].aggregateSlotIdx =3D 0; + VIR_DEBUG("PCI functions of %.4x:%.2x is aggregated to slot %u" + "because of user assigned address %s", + addr->domain, addr->bus, aggregateSlotIdx, addrStr); } =20 if (virDomainPCIAddressBusIsEmpty(bus) && !bus->isolationGroupLocked) { @@ -886,8 +892,8 @@ virDomainPCIAddressReserveAddrInternal(virDomainPCIAddr= essSetPtr addrs, =20 /* mark the requested function as reserved */ bus->slot[addr->slot].functions |=3D (1 << addr->function); - VIR_DEBUG("Reserving PCI address %s (aggregate=3D'%s')", addrStr, - bus->slot[addr->slot].aggregate ? "true" : "false"); + VIR_DEBUG("Reserving PCI address %s (aggregateSlotIdx=3D'%d')", + addrStr, bus->slot[addr->slot].aggregateSlotIdx); =20 ret =3D 0; cleanup: @@ -900,10 +906,11 @@ int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags, - unsigned int isolationGroup) + unsigned int isolationGroup, + unsigned int aggregateSlotIdx) { return virDomainPCIAddressReserveAddrInternal(addrs, addr, flags, - isolationGroup, true); + isolationGroup, aggregat= eSlotIdx, true); } =20 int @@ -940,6 +947,7 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr= addrs, =20 if (virDomainPCIAddressReserveAddrInternal(addrs, &dev->addr.pci, flags, dev->isolationGr= oup, + dev->aggregateSlotIdx, true) < 0) { goto cleanup; } @@ -1109,6 +1117,7 @@ virDomainPCIAddressSetFree(virDomainPCIAddressSetPtr = addrs) static int virDomainPCIAddressFindUnusedFunctionOnBus(virDomainPCIAddressBusPtr bus, virPCIDeviceAddressPtr searchAd= dr, + unsigned int aggregateSlotIdx, int function, virDomainPCIConnectFlags flags, bool *found) @@ -1132,8 +1141,8 @@ virDomainPCIAddressFindUnusedFunctionOnBus(virDomainP= CIAddressBusPtr bus, break; } =20 - if (flags & VIR_PCI_CONNECT_AGGREGATE_SLOT && - bus->slot[searchAddr->slot].aggregate) { + if (bus->slot[searchAddr->slot].aggregateSlotIdx > 0 && + bus->slot[searchAddr->slot].aggregateSlotIdx =3D=3D aggreg= ateSlotIdx) { /* slot and device are okay with aggregating devices */ if ((bus->slot[searchAddr->slot].functions & (1 << searchAddr->function)) =3D=3D 0) { @@ -1178,6 +1187,7 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSet= Ptr addrs, virPCIDeviceAddressPtr next_addr, virDomainPCIConnectFlags flags, unsigned int isolationGroup, + unsigned int aggregateSlotIdx, int function) { virPCIDeviceAddress a =3D { 0 }; @@ -1206,7 +1216,9 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSet= Ptr addrs, =20 a.slot =3D bus->minSlot; =20 - if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, function, + if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, + aggregateSlotIdx, + function, flags, &found) < 0)= { return -1; } @@ -1230,7 +1242,9 @@ virDomainPCIAddressGetNextAddr(virDomainPCIAddressSet= Ptr addrs, =20 a.slot =3D bus->minSlot; =20 - if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, function, + if (virDomainPCIAddressFindUnusedFunctionOnBus(bus, &a, + aggregateSlotIdx, + function, flags, &found) < 0)= { return -1; } @@ -1288,12 +1302,13 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddr= essSetPtr addrs, { virPCIDeviceAddress addr; =20 - if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags, - dev->isolationGroup, function) < 0) + if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags, dev->isolation= Group, + dev->aggregateSlotIdx, function) < = 0) return -1; =20 if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, - dev->isolationGroup, false)= < 0) + dev->isolationGroup, + dev->aggregateSlotIdx, fals= e) < 0) return -1; =20 addr.extFlags =3D dev->addr.pci.extFlags; diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index dcb90618f8..65dbdb3286 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -34,24 +34,19 @@ typedef enum { typedef enum { VIR_PCI_CONNECT_HOTPLUGGABLE =3D 1 << 0, /* is hotplug needed/supported= */ =20 - /* set for devices that can share a single slot in auto-assignment - * (by assigning one device to each of the 8 functions on the slot) - */ - VIR_PCI_CONNECT_AGGREGATE_SLOT =3D 1 << 1, - /* kinds of devices as a bitmap so they can be combined (some PCI * controllers permit connecting multiple types of devices) */ - VIR_PCI_CONNECT_TYPE_PCI_DEVICE =3D 1 << 2, - VIR_PCI_CONNECT_TYPE_PCIE_DEVICE =3D 1 << 3, - VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT =3D 1 << 4, - VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT =3D 1 << 5, - VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT =3D 1 << 6, - VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE =3D 1 << 7, - VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS =3D 1 << 8, - VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS =3D 1 << 9, - VIR_PCI_CONNECT_TYPE_PCI_BRIDGE =3D 1 << 10, - VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE =3D 1 << 11, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE =3D 1 << 1, + VIR_PCI_CONNECT_TYPE_PCIE_DEVICE =3D 1 << 2, + VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT =3D 1 << 3, + VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT =3D 1 << 4, + VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT =3D 1 << 5, + VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE =3D 1 << 6, + VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS =3D 1 << 7, + VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS =3D 1 << 8, + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE =3D 1 << 9, + VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE =3D 1 << 10, } virDomainPCIConnectFlags; =20 /* a combination of all bits that describe the type of connections @@ -85,12 +80,12 @@ typedef struct { */ uint8_t functions; =20 - /* aggregate is true if this slot has only devices with - * VIR_PCI_CONNECT_AGGREGATE assigned to its functions (meaning - * that other devices with the same flags could also be - * auto-assigned to the other functions) + /* aggregate is greater than zero if this slot has only devices with + * VIR_PCI_CONNECT_AGGREGATE assigned to its functions and + * that other devices with the same aggregateSlotIdx could also be + * auto-assigned to the other functions on this slot) */ - bool aggregate; + unsigned int aggregateSlotIdx; } virDomainPCIAddressSlot; =20 typedef struct { @@ -168,7 +163,8 @@ int virDomainPCIAddressExtensionReserveNextAddr(virDoma= inPCIAddressSetPtr addrs, int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags, - unsigned int isolationGroup) + unsigned int isolationGroup, + unsigned int agregateSlotIdx) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index b663e05391..bff81082ef 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -24,6 +24,7 @@ #include "qemu_domain_address.h" #include "qemu_domain.h" #include "viralloc.h" +#include "virhostdev.h" #include "virerror.h" #include "virlog.h" =20 @@ -1408,6 +1409,54 @@ qemuDomainSetupIsolationGroups(virDomainDefPtr def) } =20 =20 +void +qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr def G_GNUC_UNUSED, + virDomainDeviceDefPtr dev) +{ + virDomainDeviceInfoPtr info =3D virDomainDeviceGetInfo(dev); + + if (!info) + return; + + info->aggregateSlotIdx =3D 0; + + if (dev->type =3D=3D VIR_DOMAIN_DEVICE_CONTROLLER) { + virDomainControllerDefPtr cont =3D dev->data.controller; + if (cont->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI && + cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT)= { + info->aggregateSlotIdx =3D 1; + } + } + + return; +} + + +static int +qemuDomainFillDeviceSlotAggregationIter(virDomainDefPtr def, + virDomainDeviceDefPtr dev, + virDomainDeviceInfoPtr info G_GNUC= _UNUSED, + void *opaque G_GNUC_UNUSED) +{ + qemuDomainSetDeviceSlotAggregateIdx(def, dev); + + return 0; +} + + +static int +qemuDomainSetupSlotAggregation(virDomainDefPtr def) +{ + if (virDomainDeviceInfoIterate(def, + qemuDomainFillDeviceSlotAggregationIter, + NULL) < 0) { + return -1; + } + + return 0; +} + + /** * qemuDomainFillDevicePCIConnectFlags: * @@ -1579,7 +1628,8 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def G_GNU= C_UNUSED, =20 if (virDomainPCIAddressReserveAddr(addrs, addr, info->pciConnectFlags, - info->isolationGroup) < 0) { + info->isolationGroup, + info->aggregateSlotIdx) < 0) { return -1; } =20 @@ -1772,7 +1822,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr= def, continue; } if (addrs->nbuses && - virDomainPCIAddressReserveAddr(addrs, &cont->info.addr.pci, fl= ags, 0) < 0) + virDomainPCIAddressReserveAddr(addrs, &cont->info.addr.pci, fl= ags, 0, 0) < 0) return -1; } =20 @@ -1781,11 +1831,11 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefP= tr def, memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot =3D 1; /* ISA Bridge at 00:01.0 */ - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0, 0) = < 0) return -1; /* Bridge at 00:01.3 */ tmp_addr.function =3D 3; - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0, 0) = < 0) return -1; } =20 @@ -1826,7 +1876,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr= def, return -1; } } else { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags= , 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags= , 0, 0) < 0) return -1; primaryVideo->info.addr.pci =3D tmp_addr; primaryVideo->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE= _PCI; @@ -1849,7 +1899,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr= def, VIR_DEBUG("PCI address 0:0:2.0 in use, future addition of a vi= deo" " device will not be possible without manual" " intervention"); - } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags,= 0) < 0) { + } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags,= 0, 0) < 0) { return -1; } } @@ -1919,7 +1969,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr d= ef, assign =3D true; } if (assign) { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, f= lags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, f= lags, 0, 0) < 0) return -1; =20 cont->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; @@ -1942,7 +1992,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr d= ef, memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot =3D 0x1E; if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, f= lags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, f= lags, 0, 0) < 0) return -1; =20 cont->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; @@ -1966,12 +2016,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr= def, tmp_addr.slot =3D 0x1F; tmp_addr.function =3D 0; tmp_addr.multi =3D VIR_TRISTATE_SWITCH_ON; - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0, 0) = < 0) return -1; =20 tmp_addr.function =3D 3; tmp_addr.multi =3D VIR_TRISTATE_SWITCH_ABSENT; - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0, 0) = < 0) return -1; } =20 @@ -2008,7 +2058,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr d= ef, return -1; } } else { - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags= , 0) < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags= , 0, 0) < 0) return -1; primaryVideo->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE= _PCI; primaryVideo->info.addr.pci =3D tmp_addr; @@ -2034,7 +2084,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr d= ef, " device will not be possible without manual" " intervention"); virResetLastError(); - } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags,= 0) < 0) { + } else if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags,= 0, 0) < 0) { return -1; } } @@ -2055,7 +2105,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr d= ef, !virDeviceInfoPCIAddressIsWanted(&sound->info)) { continue; } - if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0)= < 0) + if (virDomainPCIAddressReserveAddr(addrs, &tmp_addr, flags, 0,= 0) < 0) return -1; =20 sound->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; @@ -2257,7 +2307,8 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, /* Reserve this function on the slot we found */ if (virDomainPCIAddressReserveAddr(addrs, &addr, cont->info.pciConnectFl= ags, - cont->info.isolationGro= up) < 0) { + cont->info.isolationGro= up, + cont->info.aggregateSlo= tIdx) < 0) { return -1; } =20 @@ -2631,6 +2682,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (qemuDomainSetupIsolationGroups(def) < 0) goto cleanup; =20 + if (qemuDomainSetupSlotAggregation(def) < 0) + goto cleanup; + if (nbuses > 0) { /* 1st pass to figure out how many PCI bridges we need */ if (!(addrs =3D qemuDomainPCIAddressSetCreate(def, qemuCaps, nbuse= s, true))) @@ -2751,6 +2805,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, dev.data.controller =3D def->controllers[contIndex]; /* set connect flags so it will be properly addressed */ qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps, drive= r); + qemuDomainSetDeviceSlotAggregateIdx(def, &dev); =20 /* Reserve an address for the controller. pci-root and pcie-ro= ot * controllers don't plug into any other PCI controller, hence @@ -3224,6 +3279,7 @@ qemuDomainEnsurePCIAddress(virDomainObjPtr obj, return 0; =20 qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps, dri= ver); + qemuDomainSetDeviceSlotAggregateIdx(obj->def, dev); =20 qemuDomainFillDevicePCIExtensionFlags(dev, info, priv->qemuCaps); =20 diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h index bf04e6bfdb..d7f06dd430 100644 --- a/src/qemu/qemu_domain_address.h +++ b/src/qemu/qemu_domain_address.h @@ -53,6 +53,15 @@ int qemuDomainFillDeviceIsolationGroup(virDomainDefPtr d= ef, virDomainDeviceDefPtr dev) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 +void +qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr def, + virDomainDeviceDefPtr dev); + +int +qemuDomainDefDeviceFindSlotAggregateIdx(virDomainDefPtr def, + virDomainDeviceDefPtr dev); + + void qemuDomainReleaseDeviceAddress(virDomainObjPtr vm, virDomainDeviceInfoPtr info); =20 --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402732218225.26932108676522; Thu, 30 Jan 2020 08:45:32 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-228-w_-voK7JM4-hcIqn4GhM1w-1; Thu, 30 Jan 2020 11:45:28 -0500 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 461631005513; Thu, 30 Jan 2020 16:45:22 +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 222C777954; Thu, 30 Jan 2020 16:45: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 9BA541809567; Thu, 30 Jan 2020 16:45:20 +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 00UGiu5s031887 for ; Thu, 30 Jan 2020 11:44:56 -0500 Received: by smtp.corp.redhat.com (Postfix) id 497C6F89EC; Thu, 30 Jan 2020 16:44:56 +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 44994F8A0C for ; Thu, 30 Jan 2020 16:44:54 +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 DA3DA811D0C for ; Thu, 30 Jan 2020 16:44:54 +0000 (UTC) Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-153-FKCJhJ_0M2mFY89UT4yS_Q-1; Thu, 30 Jan 2020 11:44:52 -0500 Received: by mail-qt1-f194.google.com with SMTP id h12so3011502qtu.1 for ; Thu, 30 Jan 2020 08:44:51 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402730; 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=I88lSI/pXcqYhPQkMWLUjBLkZ90ihoU1+onDAGxwvIM=; b=epitDxreg2Op3Nf484EnBYFYiaBbVUWitK4QDEesjZLSyeOO2mb2P7zmIxL7JD469oikuE +YEwVOOMaJWIMMmImAenRXPlhhhnRrZVMeM/BiYG1hBiHanGfWoaolLJr1jGJBbsviCJGP 0DULJbPcjAf65/9fxwDvu/9UJmSjZ6I= 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=j3A9LMk6UnIGjPbKSac/ChURDuZf0M/s1R7OyZzFCs4=; b=WTRnYTIS+hKRMPVx4bm7P38ty7lQFMVFynFTIFoS+X5rYqmto7+EU/n7+ci6JIdGRm c2S/P58D0vif+3DHHDfAitHh+KOP5/wotv6rom5RzoAWHAAeKEi6J56ZOkbfgAf/qUAl Y/S3/4jCenMrubmojd6xPjgDTaxwCNQNsBYDzaW5zwwBjJB+C8pq+THfBaOLmH6CQvta D5GlMm6FSE7U8TjosQ8iuiEDdj3jEMQJfjPcwwrCBe47B2+biuUsZVfOiQxRmYxhsD/m 9N12wW/FeAVi4xxnU0P/FQk9YD6VEla8JDez3ba1/cBGXUcUyLVRmrr9gdpbg1OxyIKW 1U4Q== X-Gm-Message-State: APjAAAW/6VuJosVkyjiRbQb1eMqE90urnZGFsGKHLLsVoM7Vz6XvJAHk buYdtvZC8ISsyQSivMmgRXNtyncH2vY= X-Google-Smtp-Source: APXvYqxQMBNAIODtHOpFgMaxA1NkbGfxxBUQY2HeV4v5QMKn8Oq9RdqTe182itVKAzEWCZ14j8JNAg== X-Received: by 2002:ac8:78c:: with SMTP id l12mr5826526qth.187.1580402691084; Thu, 30 Jan 2020 08:44:51 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 02/21] utils: PCI multifunction detection helpers Date: Thu, 30 Jan 2020 13:44:14 -0300 Message-Id: <20200130164433.2694119-3-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: FKCJhJ_0M2mFY89UT4yS_Q-1 X-MC-Unique: w_-voK7JM4-hcIqn4GhM1w-1 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 00UGiu5s031887 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" This patch introduces two helpers that will be used in the next patches. One is virpci.c:virPCIDeviceIsMultifunction(), and the other is virhostdev.c:virHostdevIsPCIMultifunctionDevice(). Signed-off-by: Daniel Henrique Barboza --- src/libvirt_private.syms | 2 ++ src/util/virhostdev.c | 25 +++++++++++++++++++++++++ src/util/virhostdev.h | 3 +++ src/util/virpci.c | 17 +++++++++++++++++ src/util/virpci.h | 2 ++ 5 files changed, 49 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ebf830791e..962963a3ff 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2162,6 +2162,7 @@ virHostCPUStatsAssign; # util/virhostdev.h virHostdevFindUSBDevice; virHostdevIsMdevDevice; +virHostdevIsPCIMultifunctionDevice; virHostdevIsSCSIDevice; virHostdevIsVFIODevice; virHostdevManagerGetDefault; @@ -2768,6 +2769,7 @@ virPCIDeviceGetUnbindFromStub; virPCIDeviceGetUsedBy; virPCIDeviceHasPCIExpressLink; virPCIDeviceIsAssignable; +virPCIDeviceIsMultifunction; virPCIDeviceIsPCIExpress; virPCIDeviceListAdd; virPCIDeviceListAddCopy; diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index f8f7989206..f0526d97d0 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -2564,3 +2564,28 @@ virHostdevUpdateActiveNVMeDevices(virHostdevManagerP= tr hostdev_mgr, } goto cleanup; } + + +bool +virHostdevIsPCIMultifunctionDevice(virDomainHostdevDefPtr hostdev) +{ + g_autoptr(virPCIDevice) pciDev =3D NULL; + virDomainHostdevSubsysPCIPtr pcisrc =3D &hostdev->source.subsys.u.pci; + + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || + hostdev->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PC= I) + return false; + + /* Libvirt should be able to perform all the operations in + * virPCIDeviceNew() even if it's running unprivileged, so if this + * fails, the device apparently doesn't currently exist on the host. + * Since we can't speculate, assume this device is not multifunction. + */ + pciDev =3D virPCIDeviceNew(pcisrc->addr.domain, pcisrc->addr.bus, + pcisrc->addr.slot, pcisrc->addr.function); + + if (!pciDev) + return false; + + return virPCIDeviceIsMultifunction(pciDev); +} diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h index ae84ed3d20..80aea577ed 100644 --- a/src/util/virhostdev.h +++ b/src/util/virhostdev.h @@ -198,6 +198,9 @@ bool virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); bool +virHostdevIsPCIMultifunctionDevice(virDomainHostdevDefPtr hostdev) + ATTRIBUTE_NONNULL(1); +bool virHostdevIsVFIODevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); =20 diff --git a/src/util/virpci.c b/src/util/virpci.c index 0b1222373e..f564d7b9fd 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -2842,6 +2842,23 @@ int virPCIGetHeaderType(virPCIDevicePtr dev, int *hd= rType) } =20 =20 +bool +virPCIDeviceIsMultifunction(virPCIDevicePtr dev) +{ + int fd; + uint8_t type; + + if ((fd =3D virPCIDeviceConfigOpen(dev)) < 0) + return -1; + + type =3D virPCIDeviceRead8(dev, fd, PCI_HEADER_TYPE); + + virPCIDeviceConfigClose(dev, fd); + + return type & PCI_HEADER_TYPE_MULTI; +} + + void virPCIEDeviceInfoFree(virPCIEDeviceInfoPtr dev) { diff --git a/src/util/virpci.h b/src/util/virpci.h index f6796fc422..9d8dcfec05 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -271,6 +271,8 @@ int virPCIDeviceGetLinkCapSta(virPCIDevicePtr dev, =20 int virPCIGetHeaderType(virPCIDevicePtr dev, int *hdrType); =20 +bool virPCIDeviceIsMultifunction(virPCIDevicePtr dev); + void virPCIEDeviceInfoFree(virPCIEDeviceInfoPtr dev); =20 ssize_t virPCIGetMdevTypes(const char *sysfspath, --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402743769946.5071981575079; Thu, 30 Jan 2020 08:45:43 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-206-BIH6kctQM225sXPySaGxqQ-1; Thu, 30 Jan 2020 11:45:36 -0500 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 A2162800D5E; Thu, 30 Jan 2020 16:45:29 +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 7B23F8882D; Thu, 30 Jan 2020 16:45:29 +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 3341518089D6; Thu, 30 Jan 2020 16:45:29 +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 00UGiwap031900 for ; Thu, 30 Jan 2020 11:44:59 -0500 Received: by smtp.corp.redhat.com (Postfix) id D4FFF2166B29; Thu, 30 Jan 2020 16:44:58 +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 D09722166B27 for ; Thu, 30 Jan 2020 16:44:56 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.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 C2AF180328A for ; Thu, 30 Jan 2020 16:44:56 +0000 (UTC) Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-340-Modpt7J1P-Ga1g9umC4p3A-1; Thu, 30 Jan 2020 11:44:54 -0500 Received: by mail-qk1-f195.google.com with SMTP id x1so3497985qkl.12 for ; Thu, 30 Jan 2020 08:44:53 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402742; 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=k6XD3rhl51XIjv8WC23Ek5ON4BpV8Wtx4xFf2fRMFNM=; b=UdXGwvshL8DI3lJKh1NXIgHKwQHnoB85JXXm45ataNLkBP5pgTbypmW4NRDFT01bTwftsq 9Fodu8bqpzZplm4qXaiYHWz1SoqAmGWaNPLw+qreKsaIzhFCEyXo5D1bDk9TNyAGEL/7tG xH1fkWJy+EWqKCWkM9bm4TERrqfLFVY= 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=uJjdvMT3CvRvRCR86exl1no8jb0BtQPlfxc61hP8Fmc=; b=ojFJgQNMYpXgAxaCVI1T/f9+8ef4pBmmJ1hANe3MbsUdUp/vpDuiA9q57TRBHHIWxz sbgafz1b8dJK+uKBIesplKiXHZIAmTb8ZX8l9NorxtBeTv/Bu9Gz04SCXbbcrDstrR1h yqAN/MkE6YcsQqe848eRyvR7sNw36pJuiUCnpd2kiDmUo0D5eQ+a57+q7TgARPmM74Hy 4JfOXYyjxtfYkW7gzrtflxAcvS9w8GP2IDGUhRnFTv/0G6llxPHBVULVDkuYzPW1TF6m wH/Wt0fe7Ddk4H1sgVr+dtWF55PT7Bay/1loYJJu5Sxcdlc63dMv71tH+2+V7eCLpaIi RLTA== X-Gm-Message-State: APjAAAUWVc1X66ISAKCeJ+dheVScHl2Gq5fKb0C5voNtBcurJ3nowtHH xvji44WyvjoWMe+VV09eyzbFkOLoOIQ= X-Google-Smtp-Source: APXvYqwGu+usJmw8/RlqyphjjY3Wh3cFb0y8efwty8NlwYSxq8qAnJ+Uk/cksC0g8NO0dyuIoKP92Q== X-Received: by 2002:a05:620a:80e:: with SMTP id s14mr5898158qks.136.1580402693375; Thu, 30 Jan 2020 08:44:53 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 03/21] virhostdev: Introduce virHostdevPCIDevicesBelongToSameSlot Date: Thu, 30 Jan 2020 13:44:15 -0300 Message-Id: <20200130164433.2694119-4-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: Modpt7J1P-Ga1g9umC4p3A-1 X-MC-Unique: BIH6kctQM225sXPySaGxqQ-1 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 00UGiwap031900 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/libvirt_private.syms | 1 + src/util/virhostdev.c | 29 +++++++++++++++++++++++++++++ src/util/virhostdev.h | 2 ++ 3 files changed, 32 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 962963a3ff..702cd958b1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2166,6 +2166,7 @@ virHostdevIsPCIMultifunctionDevice; virHostdevIsSCSIDevice; virHostdevIsVFIODevice; virHostdevManagerGetDefault; +virHostdevPCIDevicesBelongToSameSlot; virHostdevPCINodeDeviceDetach; virHostdevPCINodeDeviceReAttach; virHostdevPCINodeDeviceReset; diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index f0526d97d0..d870ca6c49 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -312,6 +312,35 @@ virHostdevIsVirtualFunction(virDomainHostdevDefPtr hos= tdev) } =20 =20 +bool +virHostdevPCIDevicesBelongToSameSlot(virDomainHostdevDefPtr dev1, + virDomainHostdevDefPtr dev2) +{ + virPCIDeviceAddressPtr devAddr1 =3D NULL, devAddr2 =3D NULL; + + if (!dev1 || !dev2) + return false; + + devAddr1 =3D &dev1->source.subsys.u.pci.addr; + devAddr2 =3D &dev2->source.subsys.u.pci.addr; + if ((devAddr1->domain !=3D devAddr2->domain) || + (devAddr1->bus !=3D devAddr2->bus) || + (devAddr1->slot !=3D devAddr2->slot) || + (virPCIDeviceAddressEqual(devAddr1, devAddr2))) { + return false; + } + + /* The Virtual Functions have multifunction false even though they hav= e same + * domain:bus:slot as the Physical function. They are to be treated + * like non-multifunction devices + */ + if (virHostdevIsVirtualFunction(dev1) || virHostdevIsVirtualFunction(d= ev2)) + return false; + + return true; +} + + static int virHostdevNetDevice(virDomainHostdevDefPtr hostdev, int pfNetDevIdx, diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h index 80aea577ed..d6dfb0b388 100644 --- a/src/util/virhostdev.h +++ b/src/util/virhostdev.h @@ -214,6 +214,8 @@ int virHostdevPCINodeDeviceReAttach(virHostdevManagerPt= r mgr, int virHostdevPCINodeDeviceReset(virHostdevManagerPtr mgr, virPCIDevicePtr pci) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +bool virHostdevPCIDevicesBelongToSameSlot(virDomainHostdevDefPtr dev1, + virDomainHostdevDefPtr dev2); =20 int virHostdevPrepareOneNVMeDevice(virHostdevManagerPtr hostdev_mgr, --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402754995363.6668475619076; Thu, 30 Jan 2020 08:45:54 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-82-vSN8KUuEMi-w8B6MWrOqwA-1; Thu, 30 Jan 2020 11:45:50 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 39E321034B21; Thu, 30 Jan 2020 16:45:43 +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 0D791CFE0; Thu, 30 Jan 2020 16:45:43 +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 B453C87A9E; Thu, 30 Jan 2020 16:45:42 +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 00UGjELB031992 for ; Thu, 30 Jan 2020 11:45:14 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0726F2166B29; Thu, 30 Jan 2020 16:45:14 +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 027392166B27 for ; Thu, 30 Jan 2020 16:45:13 +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 C73458047C4 for ; Thu, 30 Jan 2020 16:45:13 +0000 (UTC) Received: from mail-qv1-f68.google.com (mail-qv1-f68.google.com [209.85.219.68]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-57-jHEjQAdROiu6goP6UK5oOg-1; Thu, 30 Jan 2020 11:45:06 -0500 Received: by mail-qv1-f68.google.com with SMTP id u10so1813441qvi.2 for ; Thu, 30 Jan 2020 08:44:56 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402753; 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=Us6DVtGaAaD9e0ndZaAL8o//DSCquJwXpGTjovb6qN4=; b=BX7md3NUXiZ67ljdJ8vX8sP5zW8at057kEXWa4Lv8CFOA4QO79u9P/b9f7XhkH6UGdBD+V YIgMHsNHf86mUHgJY/wLD3GhSnowqmSLGt+qxSVzkhhoqgmtt9pBNNpySKVIlwekCD7JRq maZBKsDE1EDmTuwtv165kJr9lcRXoGc= 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=D4P3SI2kxVJkL90+eM+IrEk7Ja3wgBe2OKFppA8wTdQ=; b=csy8NhZFZgIAebzgxP27QYQLm41h9ttrYSvmRx58tM6ILdcyzF6uwb2KCtgBw+L7dF RmyjIAT4LFEz1Sfm4l4R7dI4rZZxv78Q/31tQAgsb2Rpbc3Hlz7Q0cpVla2X8l6v4bbq msHM+W2Joj+/SIuxHg+oRG6qJRQw48Sc486cAGAtJH4sa0bz6mp6YJq1zWyi94rvr5eC P2chP0OhKu8rvfknwdMdQzuibuUrPk2NENln8MQWlcIhEiD9uAJIO7iy1FfPVigkrEQI Ns0VuRO++DSDVO9fh8bkXPPoh1KlLe2+QKBKojp/MJh68PMURP9wv1L/5FNY5qjONgXk jU0A== X-Gm-Message-State: APjAAAXpJW7hd8s+LH1rC/ffkgg/Hi7whRiRO2n1dbZxyGBRHP2ESQdA yaz70hZ61ZPj8AaKHTLspUkC5tl4t6c= X-Google-Smtp-Source: APXvYqw5oF6h4YojZzU6hIYv/amUbqdDEB73esNEk2bAuMdSfXb3H9AQbXdYxejIqHdVliJmlMH2oQ== X-Received: by 2002:ad4:4f90:: with SMTP id em16mr1849178qvb.38.1580402695392; Thu, 30 Jan 2020 08:44:55 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 04/21] qemu: address: Enable auto addressing multifunction cards Date: Thu, 30 Jan 2020 13:44:16 -0300 Message-Id: <20200130164433.2694119-5-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: jHEjQAdROiu6goP6UK5oOg-1 X-MC-Unique: vSN8KUuEMi-w8B6MWrOqwA-1 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 00UGjELB031992 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Shivaprasad G Bhat For existing domains using the primary function alone of a multifunction card, the card is still treated as a multifunction card. This is done to prevent hotplug of other functions when the primary function is already hotplugged. If the secondary functions are part of the xml without the primary function being part of the xml, this has never been supported. So, Libvirt doesn't consider this either as a multifunction card. Since we're now checking PCI headers via virHostdevIsPCIMultifunctionDevice(), changes in virpcitestdata files were required to allow the test suit to recognize the 0005:90:01.N test device as multifunction. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.h | 11 ++ src/qemu/qemu_domain_address.c | 148 +++++++++++++++++- tests/qemuhotplugtest.c | 1 + .../hostdev-pci-address-unassigned.args | 9 +- .../hostdev-pci-multifunction.args | 18 ++- .../hostdev-pci-multifunction.xml | 8 +- .../qemuxml2argvdata/pseries-hostdevs-1.args | 5 +- .../qemuxml2argvdata/pseries-hostdevs-3.args | 5 +- tests/qemuxml2argvtest.c | 6 +- .../hostdev-pci-address-unassigned.xml | 8 +- .../hostdev-pci-multifunction.xml | 24 +-- .../qemuxml2xmloutdata/pseries-hostdevs-1.xml | 4 +- .../qemuxml2xmloutdata/pseries-hostdevs-3.xml | 4 +- tests/virpcitestdata/0005-90-01.1.config | Bin 256 -> 256 bytes tests/virpcitestdata/0005-90-01.2.config | Bin 256 -> 256 bytes tests/virpcitestdata/0005-90-01.3.config | Bin 0 -> 256 bytes 16 files changed, 204 insertions(+), 47 deletions(-) create mode 100644 tests/virpcitestdata/0005-90-01.3.config diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index c581b3a162..c54af16fa5 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -612,6 +612,17 @@ struct _qemuDomainSaveCookie { =20 G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuDomainSaveCookie, virObjectUnref); =20 +typedef struct _qemuDomainPCIHostdevdata qemuDomainPCIHostdevdata; +typedef qemuDomainPCIHostdevdata *qemuDomainPCIHostdevDataPtr; +struct _qemuDomainPCIHostdevdata { + const virDomainDef *def; + virDomainPCIAddressSetPtr addrs; + virDomainHostdevDefPtr device; +}; + +typedef int (*virDomainPCIHostdevCallback)(qemuDomainPCIHostdevDataPtr dat= a, + virDomainHostdevDefPtr hostdev); + typedef struct _qemuDomainXmlNsDef qemuDomainXmlNsDef; typedef qemuDomainXmlNsDef *qemuDomainXmlNsDefPtr; struct _qemuDomainXmlNsDef { diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index bff81082ef..3fed22d720 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1409,11 +1409,134 @@ qemuDomainSetupIsolationGroups(virDomainDefPtr def) } =20 =20 +#define PCI_MAX_BRIDGE_NUMBER 0xff +#define PCI_MAX_DEVICES 32 + + +/** + * qemuDomainPCIHostDevicesIter: + * @data - The data->device is the one which is called-back with for + * each hostdev + * cb() - callback to be called for each hostdev + * Return : + * If the callback for any of the hostdev fails, the Iter returns + * with the return value for that callback. + * Zero on success. + */ +static +int qemuDomainPCIHostDevicesIter(qemuDomainPCIHostdevDataPtr data, + virDomainPCIHostdevCallback cb) +{ + size_t i; + int ret =3D -1; + + /* Iterate through the PCI Hostdevices, the Mdev source is of type + * UUID, so skip that. */ + for (i =3D 0; i < data->def->nhostdevs; i++) { + virDomainHostdevSubsysPtr subsys =3D &data->def->hostdevs[i]->sour= ce.subsys; + virDomainHostdevDefPtr hostdev =3D data->def->hostdevs[i]; + if (data->device =3D=3D hostdev) + continue; + if (data->def->hostdevs[i]->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBS= YS) + continue; + if (subsys->type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && + subsys->type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST && + (subsys->type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV && + subsys->u.mdev.model =3D=3D VIR_MDEV_MODEL_TYPE_VFIO_PCI)) { + continue; + } + + if ((ret =3D cb(data, hostdev)) !=3D 0) + return ret; + } + + return 0; +} + + + +static int +qemuDomainFindNextAggregationSlotIdxIter(virDomainDefPtr def G_GNUC_UNUSED, + virDomainDeviceDefPtr dev G_GNUC_= UNUSED, + virDomainDeviceInfoPtr info, + void *opaque) +{ + int *aggregationSlotIdx =3D opaque; + + if (info && info->aggregateSlotIdx =3D=3D *aggregationSlotIdx) + return -1; + + return 0; +} + + +static unsigned int +qemuDomainFindNextSlotAggregationIdx(virDomainDefPtr def) +{ + int aggregateSlotIdx =3D 2; + + while (aggregateSlotIdx < PCI_MAX_BRIDGE_NUMBER * PCI_MAX_DEVICES && + virDomainDeviceInfoIterate(def, + qemuDomainFindNextAggregationSlotIdx= Iter, + &aggregateSlotIdx) < 0) { + aggregateSlotIdx++; + } + + return aggregateSlotIdx; +} + + +static int +qemuDomainDefHostdevGetSlotAggregateIdx(qemuDomainPCIHostdevDataPtr data, + virDomainHostdevDefPtr hostdev) +{ + if (data->device && + virHostdevPCIDevicesBelongToSameSlot(data->device, hostdev)) { + if (hostdev->info->aggregateSlotIdx > 0) + return hostdev->info->aggregateSlotIdx; + } + + return 0; +} + +/** + * qemuDomainDefDeviceFindSlotAggregateIdx: + * @def : domain def + * @dev : Find the slot aggregate for the device if other + * functions are already part of the def and have + * a slot aggreate idx assigned. + * Return: + * -1: if not assigned. + * 0: If the device is not a hostdev or not a + * multifunction device. + * >0: If assinged a value; + **/ +int +qemuDomainDefDeviceFindSlotAggregateIdx(virDomainDefPtr def, + virDomainDeviceDefPtr dev) +{ + int aggregateSlotIdx =3D 0; + virDomainHostdevDefPtr hostdev =3D dev->data.hostdev; + qemuDomainPCIHostdevdata temp =3D {def, NULL, hostdev}; + + /* Only PCI host devices are subject to isolation */ + if (!virHostdevIsPCIMultifunctionDevice(hostdev)) + return 0; + + aggregateSlotIdx =3D qemuDomainPCIHostDevicesIter(&temp, qemuDomainDef= HostdevGetSlotAggregateIdx); + if (aggregateSlotIdx > 0) + return aggregateSlotIdx; + + return -1; +} + + void -qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr def G_GNUC_UNUSED, +qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr def, virDomainDeviceDefPtr dev) { virDomainDeviceInfoPtr info =3D virDomainDeviceGetInfo(dev); + int aggregateSlotIdx =3D 0; =20 if (!info) return; @@ -1426,6 +1549,12 @@ qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr = def G_GNUC_UNUSED, cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT)= { info->aggregateSlotIdx =3D 1; } + } else if (dev->type =3D=3D VIR_DOMAIN_DEVICE_HOSTDEV) { + aggregateSlotIdx =3D qemuDomainDefDeviceFindSlotAggregateIdx(def, = dev); + if (aggregateSlotIdx > 0) + info->aggregateSlotIdx =3D aggregateSlotIdx; + else if (aggregateSlotIdx < 0) + info->aggregateSlotIdx =3D qemuDomainFindNextSlotAggregationId= x(def); } =20 return; @@ -2364,10 +2493,12 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, =20 /* Host PCI devices */ for (i =3D 0; i < def->nhostdevs; i++) { - virDomainHostdevSubsysPtr subsys =3D &def->hostdevs[i]->source.sub= sys; - if (!virDeviceInfoPCIAddressIsWanted(def->hostdevs[i]->info)) + int function =3D 0; + virDomainHostdevDefPtr hostdev =3D def->hostdevs[i]; + virDomainHostdevSubsysPtr subsys =3D &hostdev->source.subsys; + if (!virDeviceInfoPCIAddressIsWanted(hostdev->info)) continue; - if (def->hostdevs[i]->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; if (subsys->type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && subsys->type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST && @@ -2381,9 +2512,14 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED) continue; =20 - if (qemuDomainPCIAddressReserveNextAddr(addrs, - def->hostdevs[i]->info) < = 0) + if (hostdev->info->aggregateSlotIdx > 1) + function =3D hostdev->source.subsys.u.pci.addr.function; + + if (virDomainPCIAddressReserveNextAddr(addrs, hostdev->info, + hostdev->info->pciConnectFl= ags, + function) < 0) { return -1; + } } =20 /* memballoon. the qemu driver only accepts virtio memballoon devices = */ diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 6a3e61c54b..48284fdb3e 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -87,6 +87,7 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_VNC); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE); + virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY); =20 if (qemuTestCapsCacheInsert(driver.qemuCapsCache, priv->qemuCaps) < 0) return -1; diff --git a/tests/qemuxml2argvdata/hostdev-pci-address-unassigned.args b/t= ests/qemuxml2argvdata/hostdev-pci-address-unassigned.args index 42fae17444..8e031c0f1f 100644 --- a/tests/qemuxml2argvdata/hostdev-pci-address-unassigned.args +++ b/tests/qemuxml2argvdata/hostdev-pci-address-unassigned.args @@ -25,7 +25,8 @@ server,nowait \ -no-shutdown \ -no-acpi \ -usb \ --device vfio-pci,host=3D0005:90:01.0,id=3Dhostdev0,bus=3Dpci.0,addr=3D0x3 \ --device vfio-pci,host=3D0005:90:01.2,id=3Dhostdev2,bus=3Dpci.0,addr=3D0x4 \ --device vfio-pci,host=3D0005:90:01.3,id=3Dhostdev3,bus=3Dpci.0,addr=3D0x5 \ --device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x6 +-device vfio-pci,host=3D0005:90:01.0,id=3Dhostdev0,bus=3Dpci.0,multifuncti= on=3Don,\ +addr=3D0x3 \ +-device vfio-pci,host=3D0005:90:01.2,id=3Dhostdev2,bus=3Dpci.0,addr=3D0x3.= 0x2 \ +-device vfio-pci,host=3D0005:90:01.3,id=3Dhostdev3,bus=3Dpci.0,addr=3D0x3.= 0x3 \ +-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x4 diff --git a/tests/qemuxml2argvdata/hostdev-pci-multifunction.args b/tests/= qemuxml2argvdata/hostdev-pci-multifunction.args index d8690c010b..3bf3629d48 100644 --- a/tests/qemuxml2argvdata/hostdev-pci-multifunction.args +++ b/tests/qemuxml2argvdata/hostdev-pci-multifunction.args @@ -25,11 +25,13 @@ server,nowait \ -no-shutdown \ -no-acpi \ -usb \ --device vfio-pci,host=3D0005:90:01.0,id=3Dhostdev0,bus=3Dpci.0,addr=3D0x3 \ --device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev1,bus=3Dpci.0,addr=3D0x4 \ --device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev2,bus=3Dpci.0,addr=3D0x5 \ --device vfio-pci,host=3D0005:90:01.2,id=3Dhostdev3,bus=3Dpci.0,addr=3D0x6 \ --device vfio-pci,host=3D0005:90:01.3,id=3Dhostdev4,bus=3Dpci.0,addr=3D0x7 \ --device vfio-pci,host=3D0000:06:12.1,id=3Dhostdev5,bus=3Dpci.0,addr=3D0x8 \ --device vfio-pci,host=3D0000:06:12.2,id=3Dhostdev6,bus=3Dpci.0,addr=3D0x9 \ --device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0xa +-device vfio-pci,host=3D0005:90:01.0,id=3Dhostdev0,bus=3Dpci.0,multifuncti= on=3Don,\ +addr=3D0x3 \ +-device vfio-pci,host=3D0005:90:01.2,id=3Dhostdev1,bus=3Dpci.0,addr=3D0x3.= 0x2 \ +-device vfio-pci,host=3D0005:90:01.3,id=3Dhostdev2,bus=3Dpci.0,addr=3D0x3.= 0x3 \ +-device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev3,bus=3Dpci.0,addr=3D0x4.= 0x1 \ +-device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev4,bus=3Dpci.0,multifuncti= on=3Don,\ +addr=3D0x4 \ +-device vfio-pci,host=3D0000:06:12.1,id=3Dhostdev5,bus=3Dpci.0,addr=3D0x5 \ +-device vfio-pci,host=3D0000:06:12.2,id=3Dhostdev6,bus=3Dpci.0,addr=3D0x6 \ +-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x7 diff --git a/tests/qemuxml2argvdata/hostdev-pci-multifunction.xml b/tests/q= emuxml2argvdata/hostdev-pci-multifunction.xml index 06c889c64d..a0af6c5a90 100644 --- a/tests/qemuxml2argvdata/hostdev-pci-multifunction.xml +++ b/tests/qemuxml2argvdata/hostdev-pci-multifunction.xml @@ -22,25 +22,25 @@ -
+
-
+
-
+
-
+
diff --git a/tests/qemuxml2argvdata/pseries-hostdevs-1.args b/tests/qemuxml= 2argvdata/pseries-hostdevs-1.args index 51ec025dce..d745f5bae6 100644 --- a/tests/qemuxml2argvdata/pseries-hostdevs-1.args +++ b/tests/qemuxml2argvdata/pseries-hostdevs-1.args @@ -26,5 +26,6 @@ server,nowait \ -device spapr-pci-host-bridge,index=3D1,id=3Dpci.1 \ -device spapr-pci-host-bridge,index=3D2,id=3Dpci.2 \ -device vfio-pci,host=3D0005:90:01.0,id=3Dhostdev0,bus=3Dpci.1.0,addr=3D0x= 1 \ --device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev1,bus=3Dpci.2.0,addr=3D0x= 1 \ --device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev2,bus=3Dpci.2.0,addr=3D0x2 +-device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev1,bus=3Dpci.2.0,multifunc= tion=3Don,\ +addr=3D0x1 \ +-device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev2,bus=3Dpci.2.0,addr=3D0x= 1.0x1 diff --git a/tests/qemuxml2argvdata/pseries-hostdevs-3.args b/tests/qemuxml= 2argvdata/pseries-hostdevs-3.args index 5820140065..d29b01f4d8 100644 --- a/tests/qemuxml2argvdata/pseries-hostdevs-3.args +++ b/tests/qemuxml2argvdata/pseries-hostdevs-3.args @@ -25,5 +25,6 @@ server,nowait \ -no-shutdown \ -device spapr-pci-host-bridge,index=3D1,id=3Dpci.1 \ -device spapr-pci-host-bridge,index=3D2,id=3Dpci.2 \ --device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev0,bus=3Dpci.2.0,addr=3D0x= 1 \ --device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev1,bus=3Dpci.2.0,addr=3D0x2 +-device vfio-pci,host=3D0001:01:00.0,id=3Dhostdev0,bus=3Dpci.2.0,multifunc= tion=3Don,\ +addr=3D0x1 \ +-device vfio-pci,host=3D0001:01:00.1,id=3Dhostdev1,bus=3Dpci.2.0,addr=3D0x= 1.0x1 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index a36183bf34..dad03f1dec 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1334,7 +1334,8 @@ mymain(void) =20 DO_TEST("hostdev-pci-multifunction", QEMU_CAPS_KVM, - QEMU_CAPS_DEVICE_VFIO_PCI); + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY); =20 DO_TEST("hostdev-pci-address-unassigned", QEMU_CAPS_KVM, @@ -1927,14 +1928,17 @@ mymain(void) QEMU_CAPS_VIRTIO_SCSI); DO_TEST("pseries-hostdevs-1", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, + X_QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST("pseries-hostdevs-2", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, + X_QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST("pseries-hostdevs-3", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, + X_QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DEVICE_VFIO_PCI); =20 diff --git a/tests/qemuxml2xmloutdata/hostdev-pci-address-unassigned.xml b/= tests/qemuxml2xmloutdata/hostdev-pci-address-unassigned.xml index 2341e8432b..d6c26c3252 100644 --- a/tests/qemuxml2xmloutdata/hostdev-pci-address-unassigned.xml +++ b/tests/qemuxml2xmloutdata/hostdev-pci-address-unassigned.xml @@ -28,7 +28,7 @@
-
+
@@ -42,17 +42,17 @@
-
+
-
+
-
+
diff --git a/tests/qemuxml2xmloutdata/hostdev-pci-multifunction.xml b/tests= /qemuxml2xmloutdata/hostdev-pci-multifunction.xml index 52ed86e305..c40b2130df 100644 --- a/tests/qemuxml2xmloutdata/hostdev-pci-multifunction.xml +++ b/tests/qemuxml2xmloutdata/hostdev-pci-multifunction.xml @@ -28,52 +28,52 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/tests/qemuxml2xmloutdata/pseries-hostdevs-1.xml b/tests/qemuxm= l2xmloutdata/pseries-hostdevs-1.xml index e77a060a38..c09588de9d 100644 --- a/tests/qemuxml2xmloutdata/pseries-hostdevs-1.xml +++ b/tests/qemuxml2xmloutdata/pseries-hostdevs-1.xml @@ -40,14 +40,14 @@
-
+
-
+
diff --git a/tests/qemuxml2xmloutdata/pseries-hostdevs-3.xml b/tests/qemuxm= l2xmloutdata/pseries-hostdevs-3.xml index f91959b805..f01adf6d25 100644 --- a/tests/qemuxml2xmloutdata/pseries-hostdevs-3.xml +++ b/tests/qemuxml2xmloutdata/pseries-hostdevs-3.xml @@ -32,14 +32,14 @@
-
+
-
+
diff --git a/tests/virpcitestdata/0005-90-01.1.config b/tests/virpcitestdat= a/0005-90-01.1.config index beee76534041a7020c08ae9ac03d9a349c6ea12e..a60599bd342d3ebcdc7b8367ca3= 6ad337f602fde 100644 GIT binary patch delta 44 ycmZo*YG4vE7BFRCV-R3+7GUOK;Amg~f~JXq5)*X<85t+qEn;Cc-jFjfPzC^<7YL>R delta 39 ucmZo*YG4vE7BFRCV-R3+7GUOK;9y{25MXGU7$`AON05CJ=3D!Q7z5RUfCHEW5{!&mj0{Y5Fz#TaS&cX3;ByxM DCDjDB literal 256 zcmXpOc)-BMAi%_;z|6zo!oa|wz|aIFu>xbDS`csmlR$!5K#7rosSd`)Mk^@TV-u#E T7_0Gy9FS#<5E~CbCCJ=3D!Q7z5RUfCHEW5{!&mj0{Y5Fz#TaS&cX3;ByxM DCDjDB literal 0 HcmV?d00001 --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402739392849.1403487772377; Thu, 30 Jan 2020 08:45:39 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-186-sp-_GdLTPqaQCBxuHPf6_A-1; Thu, 30 Jan 2020 11:45:34 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4FB581005F63; Thu, 30 Jan 2020 16:45:27 +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 2AB83CFDA; Thu, 30 Jan 2020 16:45:27 +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 A310018089D6; Thu, 30 Jan 2020 16:45:26 +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 00UGj3rq031925 for ; Thu, 30 Jan 2020 11:45:03 -0500 Received: by smtp.corp.redhat.com (Postfix) id 2CC9B10551AE; Thu, 30 Jan 2020 16:45:03 +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 279A110551AC for ; Thu, 30 Jan 2020 16:45:01 +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 0DB32803B5C for ; Thu, 30 Jan 2020 16:45:01 +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-331-in_dyxo1NL-vYcGfisUPjw-1; Thu, 30 Jan 2020 11:44:58 -0500 Received: by mail-qk1-f194.google.com with SMTP id k6so3549804qki.5 for ; Thu, 30 Jan 2020 08:44:58 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402738; 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=tAXdERVI3QpIk9otbCa3YhCOVXiLGuWGkq77Vqjqp1c=; b=BsdXwQo5CpKXoi8Tnc82XYYp1yfxHSuTK9wXfMNKlABTvmH7bRw+QS5bXnTaYFPVkLwmFD UZfS975ZSiv1eDCwJtsGTR9E70WrVUT1KzFgjhE0QUN/NiX1qTfodZlFGCRGhzDD0COBhj 6r+QLyN/1fy5Tn/a50DBVZuO4A1lUBE= 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=yvjxrmemBhyyihq95bV9wQRN1QZyfJMGV1Rn/S04ZDU=; b=Plw6mcbSTvc89YOqaqE7TJJANELX3TPoNJns3AHgXYpvv2aQ/KrAXUqfSemNmJGhWC 6apetbmBrHnj633DGm6/VHfvvuk3TlrhZXVN62L2zh4wHvcIooM1TaMPmWpSouT0SZy0 Y2/tWYLpXjVMrMa/4rsTRLSw+ECcyZJ7zoMdyecwJbQzE5E2O8ND6oLBpKzK9QrF1QP7 zWJ7T1EUEyqNm5hfAYUL8mTUZXW6ZYknQb05/bm+YpIbURTCxrBdpXbMCeVNsY3E66Yi gTXZzr0g3WDV+K0qopVPtD+hrrPk15UplHCX9rMBahJy7f8yRODRVQm0nmUzUg0VPjjj m9JQ== X-Gm-Message-State: APjAAAVCBqIvM+bgt1hr+319QkLDmMwShg8bW29NpLxlCXKBFL7vMW/S Qjnws0tj4q7pKuDuML/gRahnyviLx28= X-Google-Smtp-Source: APXvYqwifOpW+fzbHOoGfIkPGUsg096F4takzG28NDbY5UNoX0V3nnDVfsALHFuRLvKSSZ+6nb+iQQ== X-Received: by 2002:a05:620a:342:: with SMTP id t2mr5903371qkm.383.1580402697408; Thu, 30 Jan 2020 08:44:57 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 05/21] conf: qemu: validate multifunction hostdevice domain configs Date: Thu, 30 Jan 2020 13:44:17 -0300 Message-Id: <20200130164433.2694119-6-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: in_dyxo1NL-vYcGfisUPjw-1 X-MC-Unique: sp-_GdLTPqaQCBxuHPf6_A-1 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 00UGj3rq031925 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Shivaprasad G Bhat It is invalid to have secondary functions without the primary functions part of the domain. Prevents new domain define, but existing ones would not vanish. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.c | 3 ++ src/qemu/qemu_domain_address.c | 54 +++++++++++++++++++ src/qemu/qemu_domain_address.h | 2 + .../hostdev-pci-no-primary-function.xml | 23 ++++++++ .../hostdev-pci-validate.args | 30 +++++++++++ .../qemuxml2argvdata/hostdev-pci-validate.xml | 29 ++++++++++ tests/qemuxml2argvtest.c | 8 +++ 7 files changed, 149 insertions(+) create mode 100644 tests/qemuxml2argvdata/hostdev-pci-no-primary-function.= xml create mode 100644 tests/qemuxml2argvdata/hostdev-pci-validate.args create mode 100644 tests/qemuxml2argvdata/hostdev-pci-validate.xml diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 05a8d3de38..2de7343882 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5888,6 +5888,9 @@ qemuDomainDefValidate(const virDomainDef *def, if (qemuDomainDefValidateFeatures(def, qemuCaps) < 0) goto cleanup; =20 + if (qemuDomainDefValidatePCIHostdevs(def) < 0) + goto cleanup; + if (qemuDomainDefValidateMemory(def, qemuCaps) < 0) goto cleanup; =20 diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 3fed22d720..d9e36867bd 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -2266,6 +2266,60 @@ qemuDomainValidateDevicePCISlotsChipsets(virDomainDe= fPtr def, } =20 =20 +static int +qemuDomainDefPCIHostdevIsPrimaryFunction(qemuDomainPCIHostdevDataPtr data, + virDomainHostdevDefPtr hostdev) +{ + if (!data->device || !hostdev) + return 0; + + if ((hostdev->source.subsys.u.pci.addr.function =3D=3D 0) && + (virHostdevPCIDevicesBelongToSameSlot(data->device, hostdev))) + return 1; + + return 0; +} + + +static int qemuDomainDefValidatePCIMultifunctionHostdev(qemuDomainPCIHostd= evDataPtr data, + virDomainHostdevDe= fPtr hostdev) +{ + int ret =3D 0; + qemuDomainPCIHostdevdata hostdevIterData =3D {data->def, NULL, hostdev= }; + + if (!virHostdevIsPCIMultifunctionDevice(hostdev) || + hostdev->source.subsys.u.pci.addr.function =3D=3D 0) + goto skip; + + /* If the device is non-zero function but its Primary function is not + * part of the domain, then error out. + */ + if (!qemuDomainPCIHostDevicesIter(&hostdevIterData, + qemuDomainDefPCIHostdevIsPrimaryFunc= tion)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Secondary functions of a PCI multifunction card " + "cannot be assigned to a domain without the " + "Primary function.")); + ret =3D -1; + } + + skip: + return ret; +} + +int qemuDomainDefValidatePCIHostdevs(const virDomainDef *def) +{ + qemuDomainPCIHostdevdata hostdevdata =3D {def, NULL, NULL}; + + if (qemuDomainPCIHostDevicesIter(&hostdevdata, + qemuDomainDefValidatePCIMultifunction= Hostdev)) { + return -1; + } + + return 0; +} + + /* * This assigns static PCI slots to all configured devices. * The ordering here is chosen to match the ordering used diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h index d7f06dd430..a17245dbde 100644 --- a/src/qemu/qemu_domain_address.h +++ b/src/qemu/qemu_domain_address.h @@ -57,6 +57,8 @@ void qemuDomainSetDeviceSlotAggregateIdx(virDomainDefPtr def, virDomainDeviceDefPtr dev); =20 +int qemuDomainDefValidatePCIHostdevs(const virDomainDef *def); + int qemuDomainDefDeviceFindSlotAggregateIdx(virDomainDefPtr def, virDomainDeviceDefPtr dev); diff --git a/tests/qemuxml2argvdata/hostdev-pci-no-primary-function.xml b/t= ests/qemuxml2argvdata/hostdev-pci-no-primary-function.xml new file mode 100644 index 0000000000..9cd844bbe7 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-pci-no-primary-function.xml @@ -0,0 +1,23 @@ + + delete + 583a8e8e-f0ce-4f53-89ab-092862148b25 + 262144 + 4 + + hvm + + + /usr/bin/qemu-system-x86_64 + + + + + + + + +
+ + + + diff --git a/tests/qemuxml2argvdata/hostdev-pci-validate.args b/tests/qemux= ml2argvdata/hostdev-pci-validate.args new file mode 100644 index 0000000000..2a8508991e --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-pci-validate.args @@ -0,0 +1,30 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/tmp/lib/domain--1-delete \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/tmp/lib/domain--1-delete/.local/share \ +XDG_CACHE_HOME=3D/tmp/lib/domain--1-delete/.cache \ +XDG_CONFIG_HOME=3D/tmp/lib/domain--1-delete/.config \ +QEMU_AUDIO_DRV=3Dnone \ +/usr/bin/qemu-system-x86_64 \ +-name delete \ +-S \ +-machine pc,accel=3Dkvm,usb=3Doff,dump-guest-core=3Doff \ +-m 256 \ +-realtime mlock=3Doff \ +-smp 4,sockets=3D4,cores=3D1,threads=3D1 \ +-uuid 583a8e8e-f0ce-4f53-89ab-092862148b25 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-delete/monitor.= sock,\ +server,nowait \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-no-acpi \ +-usb \ +-device vfio-pci,host=3D0000:06:12.1,id=3Dhostdev0,bus=3Dpci.0,addr=3D0x3 \ +-device vfio-pci,host=3D0000:06:12.2,id=3Dhostdev1,bus=3Dpci.0,addr=3D0x4 \ +-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x5 diff --git a/tests/qemuxml2argvdata/hostdev-pci-validate.xml b/tests/qemuxm= l2argvdata/hostdev-pci-validate.xml new file mode 100644 index 0000000000..54797c2dda --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-pci-validate.xml @@ -0,0 +1,29 @@ + + delete + 583a8e8e-f0ce-4f53-89ab-092862148b25 + 262144 + 4 + + hvm + + + /usr/bin/qemu-system-x86_64 + + + + + + + + +
+ + + + + +
+ + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index dad03f1dec..02375b2611 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1606,6 +1606,14 @@ mymain(void) QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST("hostdev-vfio-multidomain", QEMU_CAPS_DEVICE_VFIO_PCI); + DO_TEST("hostdev-pci-validate", + QEMU_CAPS_KVM, + X_QEMU_CAPS_NODEFCONFIG, X_QEMU_CAPS_HOST_PCI_MULTIDOMAIN, + QEMU_CAPS_DEVICE_VFIO_PCI); + DO_TEST_PARSE_ERROR("hostdev-pci-no-primary-function", + QEMU_CAPS_KVM, + X_QEMU_CAPS_NODEFCONFIG, X_QEMU_CAPS_HOST_PCI_MULTIDOMAIN, + QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST("hostdev-mdev-precreated", QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST_PARSE_ERROR("hostdev-mdev-src-address-invalid", --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1580402750843567.2770474659357; Thu, 30 Jan 2020 08:45:50 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-297-aJGXyrwgPm2Fyt66y9Oxlw-1; Thu, 30 Jan 2020 11:45:46 -0500 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 DFC03802563; Thu, 30 Jan 2020 16:45:34 +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 A3BC61001925; Thu, 30 Jan 2020 16:45:34 +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 5433887A97; Thu, 30 Jan 2020 16:45:34 +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 00UGj2VL031920 for ; Thu, 30 Jan 2020 11:45:02 -0500 Received: by smtp.corp.redhat.com (Postfix) id 866952166B29; Thu, 30 Jan 2020 16:45:02 +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 822CA2166B27 for ; Thu, 30 Jan 2020 16:45:02 +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 66A7980328A for ; Thu, 30 Jan 2020 16:45:02 +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-223-4xBK8BTeMXCm_J9Qly6mxw-1; Thu, 30 Jan 2020 11:45:00 -0500 Received: by mail-qk1-f178.google.com with SMTP id k6so3549900qki.5 for ; Thu, 30 Jan 2020 08:44:59 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:44:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402749; 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=FrppMEVeUDo+Yi3Qd7iU+cjU0rw516tq/P2bpyuzAfc=; b=hAdmHiVJGttg7YH09VPdWrYBDhXJmXLZjx4RUXMPXMf/lyAgXLzpvLuPCTMvOdTohRRNLO OpozRihD8MZv7yx7R0Paz4sxn1dZVAWU8mxk6BBpevz5ktBCoSuc2M5Gtooun2K9ttBufn u7/vLghRmTJj+rGyZEUvx1cJakhju1g= 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=Q2kiqjeb56ZeZ0QdbD0z2U7bO+857+WHHR1TGm+TMYc=; b=VriUprNFdMIBsRVhkUWL27yqB5lGNzouJsADa/akvFKyEijtf2276oCxSnmmLLKRuF FsE1HwQxkTjf/xQYnzHJ7Z+Bsu4xOEQM1bJZ7NEsZhLNpxFEnYsiekgCCAUEynlqIvaG ZfzJ2977jV5tfElAen95srWTNeiiTSq6wQD5qw/1K3YJLtjD/u2laZij2uhRKjrDx7Vf ZDYlRCi3KrzmsvisOz9XVIKY17hWsyS75nmoyPuqV6yRBU4EPpOGSdolSSQ4NwtKCVh1 TpbvNwKOyNRoY/vGlqcT+H8TraQpVvKi5l+7EUaIZpDE/dJtlQd+3yabYG6XA4zepMni VoXg== X-Gm-Message-State: APjAAAVkbC5XQjsNmXg9uSxAXkdsCMWP2dkA3vlI+N+/kY/cC2Rnc0Q5 D8fJ4lsWQInVsiAL1WZoMkYI8JX0btw= X-Google-Smtp-Source: APXvYqzTOmk9Yd47KzETOK+JbdeqmEU8N+RN6SMSVjxU8h/mvGCya8ccK38Z4rFN7czbogQlcCdeaQ== X-Received: by 2002:ae9:e007:: with SMTP id m7mr6198525qkk.215.1580402699274; Thu, 30 Jan 2020 08:44:59 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 06/21] conf: Add helper to get active functions of a slot of domain Date: Thu, 30 Jan 2020 13:44:18 -0300 Message-Id: <20200130164433.2694119-7-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: 4xBK8BTeMXCm_J9Qly6mxw-1 X-MC-Unique: aJGXyrwgPm2Fyt66y9Oxlw-1 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 00UGj2VL031920 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat In some cases it may be better to have a bitmap representing the state of individual functions rather than iterating the definition. The new helper creates a bitmap representing the state from the domain definition. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/conf/domain_conf.c | 27 +++++++++++++++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + 3 files changed, 31 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9b60db7ecd..5b918cc737 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16947,6 +16947,33 @@ virDomainHostdevFind(virDomainDefPtr def, return *found ? i : -1; } =20 +#define PCI_MAX_SLOT_FUNCTIONS 8 +/** + * virDomainDefHostdevGetPCIOnlineFunctionMap: + * @def: domain definition + * @aggrSlotIdx: slot aggregation index + * Returns a bitmap representing state of individual functions of a slot. + */ +virBitmapPtr +virDomainDefHostdevGetPCIOnlineFunctionMap(virDomainDefPtr def, + int aggrSlotIdx) +{ + size_t i; + virBitmapPtr ret =3D NULL; + + if (!(ret =3D virBitmapNew(PCI_MAX_SLOT_FUNCTIONS))) + return NULL; + + for (i =3D 0; i < def->nhostdevs; i++) { + size_t function =3D def->hostdevs[i]->source.subsys.u.pci.addr.fun= ction; + + if (def->hostdevs[i]->info->aggregateSlotIdx =3D=3D aggrSlotIdx) + ignore_value(virBitmapSetBit(ret, function)); + } + + return ret; +} + static bool virDomainDiskControllerMatch(int controller_type, int disk_bus) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e144f3aad3..77a01fbec0 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3212,6 +3212,9 @@ virDomainHostdevDefPtr virDomainHostdevRemove(virDomainDefPtr def, size_t i); int virDomainHostdevFind(virDomainDefPtr def, virDomainHostdevDefPtr match, virDomainHostdevDefPtr *found); +virBitmapPtr virDomainDefHostdevGetPCIOnlineFunctionMap(virDomainDefPtr de= f, + int aggrSlotIdx); + =20 virDomainGraphicsListenDefPtr virDomainGraphicsGetListen(virDomainGraphicsDefPtr def, size_t i); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 702cd958b1..5b247ded4b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -321,6 +321,7 @@ virDomainDefHasOldStyleUEFI; virDomainDefHasUSB; virDomainDefHasVcpusOffline; virDomainDefHasVFIOHostdev; +virDomainDefHostdevGetPCIOnlineFunctionMap; virDomainDefLifecycleActionAllowed; virDomainDefMaybeAddController; virDomainDefMaybeAddInput; --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402741974205.8896699416814; Thu, 30 Jan 2020 08:45:41 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-6-0guoWSjfN96lWuXG3fB7IQ-1; Thu, 30 Jan 2020 11:45:37 -0500 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 7C19F1034AFF; Thu, 30 Jan 2020 16:45:30 +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 4D5581001B32; Thu, 30 Jan 2020 16:45:30 +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 CC6BF18089D8; Thu, 30 Jan 2020 16:45:29 +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 00UGj4Nw031933 for ; Thu, 30 Jan 2020 11:45:04 -0500 Received: by smtp.corp.redhat.com (Postfix) id 9700B2166B29; Thu, 30 Jan 2020 16:45:04 +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 9307A2166B27 for ; Thu, 30 Jan 2020 16:45:04 +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 77B4F8EC75A for ; Thu, 30 Jan 2020 16:45:04 +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-395-oS6I-2ZYOX2jkUWJylKKGQ-1; Thu, 30 Jan 2020 11:45:01 -0500 Received: by mail-qk1-f196.google.com with SMTP id g195so3485188qke.13 for ; Thu, 30 Jan 2020 08:45:01 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402740; 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=y2ScHjcn8XktkBY6GfxqSp7SuBSebRq1xpBqQu01MfE=; b=RInRmS3UO+n9NMCTtcZWjLrpoujrF0tM8tMbbM8eyIplAguk46YXSurT2Ldrge52XPkrXY IlL2dF4j2ujbWIY+62XaNTeah8rbkbJV9uGAPtPEQjRAH2mbFsmvT3AMFP3X55dupvkWwP fzaDYdD0ckVFGov8UJ2Wvoc7V7kh6oU= 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=4vPuRHKXe3zPFcs7Wk+Ic4Z4c5tDIML0O7w//9+dUrc=; b=CnSCbg3rPTFhfdQaV+TjmvYEO4FCLTvYgoVD97suftUlespUfqvwZt/IHU3MtjH4lL odbxdTXCGGePDR4ZcI7TpeixmOYCUt4aeMZSScGMlLTgJWjVtd7pmD965oGuOsWAqwRR jtQOA7tpSzUD/s6JiNkEnFZeOtwHmAYeBHklYX3qjCQ+xICXgOw0Sfy5ooXVVrBZ1+OW fVkO8W267ni64MrL/LuWOo6soBKEwHdrZQPMxg5liDAk7yTm+bXkGgvoek7Ny57wJfM9 RGg272qClbvgF/0cDZlTpY3DdGgxcThIUdaxIaTUIms2jBtpeKBcH3Em576VS+R+yEhR PDNQ== X-Gm-Message-State: APjAAAVcYXbf1dT2oeMns+M8i04MAlQCoe6hSGowG8ciwaG+oy6Dwt6R axxnLf++6icThwvmyby4KVt9R2qwYcM= X-Google-Smtp-Source: APXvYqxWR/HPei8ojyQVHuT9VVvjNOjPzltfIYiIarbO4PtZ8XbI5nZ8IavhWLSam+Qrl7Mp8k+4Gw== X-Received: by 2002:ae9:f30e:: with SMTP id p14mr6176642qkg.186.1580402700785; Thu, 30 Jan 2020 08:45:00 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 07/21] qemu: hostdev: Move the hostdev preparation to a separate function Date: Thu, 30 Jan 2020 13:44:19 -0300 Message-Id: <20200130164433.2694119-8-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: oS6I-2ZYOX2jkUWJylKKGQ-1 X-MC-Unique: 0guoWSjfN96lWuXG3fB7IQ-1 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 00UGj4Nw031933 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat No functional change. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_hotplug.c | 80 ++++++++++++++++++++++++++--------------- src/qemu/qemu_hotplug.h | 5 +++ 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c23def7da7..8e5625fb8d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -997,6 +997,55 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr = driver, } =20 =20 +int qemuDomainAttachPCIHostDevicePrepare(virQEMUDriverPtr driver, + virDomainDefPtr def, + virDomainHostdevDefPtr hostdev, + virQEMUCapsPtr qemuCaps) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + unsigned int flags =3D 0; + int backend; + + if (!cfg->relaxedACS) + flags |=3D VIR_HOSTDEV_STRICT_ACS_CHECK; + if (qemuHostdevPreparePCIDevices(driver, def->name, def->uuid, + &hostdev, 1, qemuCaps, flags) < 0) + return -1; + + /* this could have been changed by qemuHostdevPreparePCIDevices */ + backend =3D hostdev->source.subsys.u.pci.backend; + + switch ((virDomainHostdevSubsysPCIBackendType) backend) { + case 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")); + goto error; + } + break; + + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: + break; + + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("QEMU does not support device assignment mode '%s= '"), + virDomainHostdevSubsysPCIBackendTypeToString(backen= d)); + goto error; + break; + } + + return 0; + + error: + qemuHostdevReAttachPCIDevices(driver, def->name, &hostdev, 1); + return -1; +} + + static int qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -1540,44 +1589,17 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driv= er, bool teardowndevice =3D false; bool teardownmemlock =3D false; int backend; - g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - unsigned int flags =3D 0; =20 if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0) return -1; =20 - if (!cfg->relaxedACS) - flags |=3D VIR_HOSTDEV_STRICT_ACS_CHECK; - if (qemuHostdevPreparePCIDevices(driver, vm->def->name, vm->def->uuid, - &hostdev, 1, priv->qemuCaps, flags) <= 0) + if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, + hostdev, priv->qemuCaps) < 0) return -1; =20 /* this could have been changed by qemuHostdevPreparePCIDevices */ backend =3D hostdev->source.subsys.u.pci.backend; =20 - switch ((virDomainHostdevSubsysPCIBackendType)backend) { - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO: - if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("VFIO PCI device assignment is not " - "supported by this version of qemu")); - goto error; - } - break; - - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: - break; - - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("QEMU does not support device assignment mode '%s= '"), - virDomainHostdevSubsysPCIBackendTypeToString(backen= d)); - goto error; - break; - } - if (qemuDomainAdjustMaxMemLockHostdev(vm, hostdev) < 0) goto error; teardownmemlock =3D true; diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 1dfc601110..2874db43ee 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -122,6 +122,11 @@ void qemuDomainRemoveVcpuAlias(virQEMUDriverPtr driver, virDomainObjPtr vm, const char *alias); =20 +int qemuDomainAttachPCIHostDevicePrepare(virQEMUDriverPtr driver, + virDomainDefPtr def, + virDomainHostdevDefPtr dev, + virQEMUCapsPtr qemuCaps); + int qemuDomainChrInsert(virDomainDefPtr vmdef, virDomainChrDefPtr chr); --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402750148750.353672572568; Thu, 30 Jan 2020 08:45:50 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-424-retZHaOdOL6A7aYrcJxoLw-1; Thu, 30 Jan 2020 11:45:40 -0500 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 13A448010EA; Thu, 30 Jan 2020 16:45:31 +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 DEAA35C296; Thu, 30 Jan 2020 16:45:30 +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 8AF3B87A92; Thu, 30 Jan 2020 16:45:30 +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 00UGj7YI031946 for ; Thu, 30 Jan 2020 11:45:07 -0500 Received: by smtp.corp.redhat.com (Postfix) id 46657F8A0C; Thu, 30 Jan 2020 16:45:07 +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 425E5F8A0B for ; Thu, 30 Jan 2020 16:45: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 DD97F8EB445 for ; Thu, 30 Jan 2020 16:45:06 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-20-hf5qRXxSMga1PndpePaopA-1; Thu, 30 Jan 2020 11:45:03 -0500 Received: by mail-qt1-f195.google.com with SMTP id l19so2968122qtq.8 for ; Thu, 30 Jan 2020 08:45:03 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402749; 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=q5fV4qJJd7w09/HfvNaFfmICerhmJC4hcR0vOYo/1Pk=; b=YGZZ0J5E2C+oAeEHaVQb8xysZ3xCPbeeCszxsKXmzumxQttOGsPOM5oLfXOAM2zOymXfm4 ESE6fSRwTlVaQSNhDd9DlIDcbb7mXZgKEwr23+JSh3+LimJSnajtQrAdzfhvSfh4gS2DKD QnjqHGkMlQ5hgGfcsN5e3ZDofzwuFLc= 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=tMrE8KeJtgBob97U9OoONlCvd2WzDcrrxkMhR+lzHDo=; b=VyzPS1Gs0ni2DlLRZYULGTsZI6ezq3BUtr3mmQ8zcosqaV5lIA07m7yfTKhN8J2d1c pdcwFMq26dQgUUeQk4hx1KB93sJSGkFtt1L89PsBfH22OZUEbPMWHsj2Gl1S5m8LnAcP lw+phdaZMNJLIrIwRChXmz5FVj1IHiwhLFXNR/Bc5XKqtcjmtDF6Vqow2AbGsUhadZVc EfKGSNY9LuMVMGA34ql51utjez+QcbbhdFh5svGyhaUQ4DV6dDPduG3aH4vy3aelddNK Zh1JDr8rXVtcKgH2+pHi8Da+QASyADNM+TlKb9Vph1Lvo1tgGHFGbxkhj7j32lu/5okE KSyA== X-Gm-Message-State: APjAAAW2izoYtv16QuziEF0AwP9TdKAr8S8sM6Wak2vB/jjzn0JlEBUT y/d+UmdrIn8fl+fAeGbsEolUiy++s+o= X-Google-Smtp-Source: APXvYqyplPZLuePhAwgEsLH54v54F1Ws69VCEG75GFZrQmRkw4gpWLfAUM4A+tR4HTRUiaP0lih+Uw== X-Received: by 2002:ac8:86b:: with SMTP id x40mr5855032qth.366.1580402702484; Thu, 30 Jan 2020 08:45:02 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 08/21] qemu: hotplug: Move the detach of PCI device to the beginning of live hotplug Date: Thu, 30 Jan 2020 13:44:20 -0300 Message-Id: <20200130164433.2694119-9-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: hf5qRXxSMga1PndpePaopA-1 X-MC-Unique: retZHaOdOL6A7aYrcJxoLw-1 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 00UGj7YI031946 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat The hostdevices are the only devices which have dependencies outside of themselves such that, other functions of the PCI card should also have been detached from host driver before attempting the hotplug. This patch moves the detach to the beginning of the hotplug so that the following patch can detach all functions first before attempting to hotplug any. We don't need to move the detach for net devices using SRIOV as all SRIOV devices are single function devices and can be independently detached as usual. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_hotplug.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8e5625fb8d..688171c7b2 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1205,6 +1205,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, g_autofree char *netdev_name =3D NULL; g_autoptr(virConnect) conn =3D NULL; virErrorPtr save_err =3D NULL; + virDomainHostdevDefPtr hostdev =3D NULL; =20 /* preallocate new slot for device */ if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0) @@ -1235,9 +1236,18 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, * as a hostdev (the hostdev code will reach over into the * netdev-specific code as appropriate), then also added to * the nets list (see cleanup:) if successful. + * + * qemuDomainAttachHostDevice uses a connection to resolve + * a SCSI hostdev secret, which is not this case, so pass NULL. */ - ret =3D qemuDomainAttachHostDevice(driver, vm, - virDomainNetGetActualHostdev(net)= ); + hostdev =3D virDomainNetGetActualHostdev(net); + if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, + hostdev, priv->qemuCaps) = < 0) + goto cleanup; + + if ((ret =3D qemuDomainAttachHostDevice(driver, vm, hostdev)) < 0) + qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev,= 1); + goto cleanup; } =20 @@ -1593,10 +1603,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr drive= r, if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0) return -1; =20 - if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, - hostdev, priv->qemuCaps) < 0) - return -1; - /* this could have been changed by qemuHostdevPreparePCIDevices */ backend =3D hostdev->source.subsys.u.pci.backend; =20 @@ -1674,8 +1680,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver, if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, info); =20 - qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev, 1); - return -1; } =20 @@ -2905,6 +2909,8 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("hotplug is not supported for hostdev mode '%s'"), @@ -2914,9 +2920,15 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver, =20 switch (hostdev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: - if (qemuDomainAttachHostPCIDevice(driver, vm, - hostdev) < 0) + if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, + hostdev, priv->qemuCaps) = < 0) return -1; + + if (qemuDomainAttachHostPCIDevice(driver, vm, hostdev) < 0) { + qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev,= 1); + return -1; + } + break; =20 case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 15804027455911022.898295461365; Thu, 30 Jan 2020 08:45:45 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-174-B3CD9_2oNAKR1gFRGKCP7w-1; Thu, 30 Jan 2020 11:45:40 -0500 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 65E34801E78; Thu, 30 Jan 2020 16:45:35 +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 3F8265C54A; Thu, 30 Jan 2020 16:45:35 +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 EB81A87A97; Thu, 30 Jan 2020 16:45:34 +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 00UGj8EY031954 for ; Thu, 30 Jan 2020 11:45:08 -0500 Received: by smtp.corp.redhat.com (Postfix) id 2835D2093CCD; Thu, 30 Jan 2020 16:45:08 +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 23BDA2033978 for ; Thu, 30 Jan 2020 16:45:08 +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 050B28E3899 for ; Thu, 30 Jan 2020 16:45:08 +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-333-C6xQqF19Neuy0KtYHQT1Zg-1; Thu, 30 Jan 2020 11:45:04 -0500 Received: by mail-qt1-f193.google.com with SMTP id d9so2948501qte.12 for ; Thu, 30 Jan 2020 08:45:04 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402744; 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=BdcOFppSnqnJlicAWEyQWjUlLlrdVY3zVGreDWLysAU=; b=aes4WmfmEHgGL0Uxk1JhzeZNJopFdCwTPKAD69+PSVFuhP91omVVpo1/SHcEE6B2XCPR9P 7FCmeGJylddtQj/EuYkZ9HV9J/pXENytY19fQt6AQLjtvdfMHvzdsb5FuUk1EpB+8N6b89 J+TIFwgQOS4o3fsvhGNRQgqcZaVeENE= 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=4+3i9CEKVUhs6uLUmf/Ck6OOH4x8fzdZG+2eKZ1nJro=; b=eJTMpJD5+XSSjkHu0GqvuvDUoQY4VGqCDXbcl7Q+T5K3p2h7AKgPw1s/p0P+FCgkR1 Hd3ex04biVnaJ5LZ3wnlEBYM1V6lv3rgivHtWD0/5qtPPMKv0wDMCdr4fXgZLExqCIy0 zOLtCK446+s6V9Ivs9x6aDkt6XlsNpv8/9Ge3doP+GS9+jFkteVFQXNv9KcOU6O+YNaM 4GOx/oToVR6ep28fIfp9pSKRI+4mpYV1ja2uvm2SNt+OWioifoNaIVeKjTovz3xzC+VY Sx5Z+j6zAg8ivxh4ypLdJUKsbzQVh69NfeyjZCXBW9XDjLMqD43fK3Ru2FJhJt5tszu7 lJHg== X-Gm-Message-State: APjAAAVH4ovkgYFbX+nBnvOner3+iSjIMFFAlAJ95UMWExKk1tRP3vd9 xFCRgq9heHVS12N3X8N/MqDvBYIsZWI= X-Google-Smtp-Source: APXvYqyJedzoF7k656fE0ruBYtC800hixXpyEQT9IXW0N3nxcwIiL09WRRlcQxEhlFAUq+8xMtk/WA== X-Received: by 2002:ac8:33f2:: with SMTP id d47mr6024471qtb.24.1580402704206; Thu, 30 Jan 2020 08:45:04 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 09/21] qemu: hotplug: move assignment outside qemuDomainAttachHostPCIDevice Date: Thu, 30 Jan 2020 13:44:21 -0300 Message-Id: <20200130164433.2694119-10-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: C6xQqF19Neuy0KtYHQT1Zg-1 X-MC-Unique: B3CD9_2oNAKR1gFRGKCP7w-1 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 00UGj8EY031954 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat No functional change. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_hotplug.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 688171c7b2..18daa7aeac 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1588,12 +1588,9 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr drive= r, virDomainHostdevDefPtr hostdev) { qemuDomainObjPrivatePtr priv =3D vm->privateData; - virDomainDeviceDef dev =3D { VIR_DOMAIN_DEVICE_HOSTDEV, - { .hostdev =3D hostdev } }; virDomainDeviceInfoPtr info =3D hostdev->info; int ret; g_autofree char *devstr =3D NULL; - bool releaseaddr =3D false; bool teardowncgroup =3D false; bool teardownlabel =3D false; bool teardowndevice =3D false; @@ -1626,16 +1623,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr drive= r, if (qemuAssignDeviceHostdevAlias(vm->def, &info->alias, -1) < 0) goto error; =20 - if (qemuDomainIsPSeries(vm->def)) { - /* Isolation groups are only relevant for pSeries guests */ - if (qemuDomainFillDeviceIsolationGroup(vm->def, &dev) < 0) - goto error; - } - - if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0) - goto error; - releaseaddr =3D true; - if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("guest unexpectedly quit during hotplug")); @@ -1677,9 +1664,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver, if (teardownmemlock && qemuDomainAdjustMaxMemLock(vm, false) < 0) VIR_WARN("Unable to reset maximum locked memory on hotplug fail"); =20 - if (releaseaddr) - qemuDomainReleaseDeviceAddress(vm, info); - return -1; } =20 @@ -2910,6 +2894,8 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + virDomainDeviceDef dev =3D { VIR_DOMAIN_DEVICE_HOSTDEV, + { .hostdev =3D hostdev } }; =20 if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -2924,7 +2910,17 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver, hostdev, priv->qemuCaps) = < 0) return -1; =20 + if (qemuDomainIsPSeries(vm->def)) { + /* Isolation groups are only relevant for pSeries guests */ + if (qemuDomainFillDeviceIsolationGroup(vm->def, &dev) < 0) + return -1; + } + + if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0) + return -1; + if (qemuDomainAttachHostPCIDevice(driver, vm, hostdev) < 0) { + qemuDomainReleaseDeviceAddress(vm, hostdev->info); qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev,= 1); return -1; } --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1580402765502317.28433995126875; Thu, 30 Jan 2020 08:46:05 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-269-SJB2OsvAPZiwqqH0QBbmsw-1; Thu, 30 Jan 2020 11:45:46 -0500 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 63DCA107ACCC; Thu, 30 Jan 2020 16:45: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 33F7484D8F; Thu, 30 Jan 2020 16:45: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 DA9D987A95; Thu, 30 Jan 2020 16:45:39 +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 00UGjCrN031971 for ; Thu, 30 Jan 2020 11:45:12 -0500 Received: by smtp.corp.redhat.com (Postfix) id 1726310551B0; Thu, 30 Jan 2020 16:45:12 +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 123A010551AC for ; Thu, 30 Jan 2020 16:45: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 DE28A1800F2C for ; Thu, 30 Jan 2020 16:45:11 +0000 (UTC) Received: from mail-qt1-f181.google.com (mail-qt1-f181.google.com [209.85.160.181]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-121-h54tAHg2NVmKFgMK9iEVcA-1; Thu, 30 Jan 2020 11:45:06 -0500 Received: by mail-qt1-f181.google.com with SMTP id n17so1826658qtv.2 for ; Thu, 30 Jan 2020 08:45:06 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402763; 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=+aglnldtfG3Wou5oz8qo3IRv0ldHChGasO7DMP+/Shs=; b=E35Fs8PWpw4hozgRR4548lKA8qxTImQWC1A9L+X4UOqIRJjBqg5hrzhhmkkxU1TyDHyKWZ io57txBxS/115pf2iILmUureM61XZMR+VQ1GBF0XcNLtrOlSzVaqdmlrho0idvY7i2sDdj cNe3eB0cS/jAv0Nb0juNfk1R2Jg/7vo= 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=7x4b0S02y4YjVoo1jYBOzp3/5SiMR5vGsxqv4QAQoBg=; b=YX8k0xYItlYBF2T05NVASUvZPKA3oRaWSsBJLaKTVGQrGSrQ4m44pr7O4cW8I+nS07 GgB9JV/eomYRWPv+PTB7HS/NzuzLxusVjx5hfq3gfLeZDNGUgBB3ECRalb+VnqTIa2Tn 7U5uF3lGch6Y6jFvSOYHOhk1U9z2dUDR/sdNHTIxqwVr907Lu+wEKnRzt862Wn3W1Xg5 gFhiM83x3fpVLlFUtFJ5O4KwCbk0wfEqiFt7Sa7dc/jtYpqfejb3CO9HzxXv/D1Br4XB 4hP2or67udPPADzvne0l43qa9dLv3kIOmn2K0/l3nCxTsuAl1l4irsU4gcGkCIvo3Hvx RcdQ== X-Gm-Message-State: APjAAAWxA6bS/1OqcoRRG2SX7qjlZTCmF+WrH3RMP9RNL4XoeIDzSMP5 0DfFNicayRVou1Qm0tYNPgN0A60qsZQ= X-Google-Smtp-Source: APXvYqyitQsYrOvg2BmFpzvqXQPu4SpTovNAmS8DN4SN3fVTk+TQCF8rCoEPMKBhc6/KId1DPCZlxQ== X-Received: by 2002:ac8:47cc:: with SMTP id d12mr5918576qtr.246.1580402705968; Thu, 30 Jan 2020 08:45:05 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 10/21] Introduce virDomainDeviceDefParseXMLMany Date: Thu, 30 Jan 2020 13:44:22 -0300 Message-Id: <20200130164433.2694119-11-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: h54tAHg2NVmKFgMK9iEVcA-1 X-MC-Unique: SJB2OsvAPZiwqqH0QBbmsw-1 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 00UGjCrN031971 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat virDomainDeviceDefParseXMLMany will be used to parse '' XML elements that will be used to supply multiple hostdevs for hotplug/unplug. The idea is to parse each dev individually, by calling the same code that already handles it today. The result is returned in a new virDomainDeviceDefListPtr pointer type, which is an array of device definitions. This idea of calling existing functions to handles a single device definition in a loop is the central idea of how PCI multifunction hotplug and hotunplug is implemented in the next patches. Roughly speaking, we'll use virDomainDeviceDefListPtr lists to call (almost) the same hotplug/unplug mechanics we have today for each hostdev in the list. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/conf/domain_conf.c | 171 +++++++++++++++++++++++++++++++++++---- src/conf/domain_conf.h | 32 ++++++++ src/libvirt_private.syms | 5 ++ 3 files changed, 194 insertions(+), 14 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5b918cc737..887f7a2633 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1287,6 +1287,90 @@ virDomainXMLOptionDispose(void *obj) (xmlopt->config.privFree)(xmlopt->config.priv); } =20 +/* virDomainDeviceDefListAddCopy - add a *copy* of the device to this list= */ +static int +virDomainDeviceDefListAddCopy(virDomainDeviceDefListPtr list, + virDomainDeviceDefPtr dev, + virDomainDeviceDefListDataPtr data, + void *parseOpaque) +{ + virDomainDeviceDefPtr copy =3D virDomainDeviceDefCopy(dev, + data->def, + data->xmlopt, + parseOpaque); + + if (!copy) + return -1; + + if (VIR_APPEND_ELEMENT(list->devs, list->count, copy) < 0) { + virDomainDeviceDefFree(copy); + return -1; + } + + return 0; +} + +void virDomainDeviceDefListFree(virDomainDeviceDefListPtr list) +{ + size_t i; + + if (!list) + return; + for (i =3D 0; i < list->count; i++) + virDomainDeviceDefFree(list->devs[i]); + VIR_FREE(list->devs); +} + +void virDomainDeviceDefListFreeShallow(virDomainDeviceDefListPtr list) +{ + size_t i; + + if (!list) + return; + for (i =3D 0; i < list->count; i++) + VIR_FREE(list->devs[i]); +} + + +/* virDomainDeviceDefListIter - Iterate through the list with the callback= */ +int +virDomainDeviceDefListIterate(virDomainDeviceDefListPtr list, + virDomainDeviceDefListIterCallback cb, + void *data) +{ + size_t i; + + for (i =3D 0; i < list->count; i++) + if (cb(list->devs[i], data)) + return -1; + + return 0; +} + +virDomainDeviceDefListPtr +virDomainDeviceDefListCopy(virDomainDeviceDefListPtr list, + virDomainDeviceDefListDataPtr data, + void *parseOpaque) +{ + size_t i; + virDomainDeviceDefListPtr devlist =3D NULL; + + if (list && (VIR_ALLOC(devlist) < 0)) + goto cleanup; + + for (i =3D 0; i < list->count; i++) { + if (virDomainDeviceDefListAddCopy(devlist, list->devs[i], + data, parseOpaque) < 0) + goto cleanup; + } + + return devlist; + cleanup: + virDomainDeviceDefListFree(devlist); + return NULL; +} + + /** * virDomainKeyWrapCipherDefParseXML: * @@ -16506,23 +16590,16 @@ virDomainVsockDefParseXML(virDomainXMLOptionPtr x= mlopt, return g_steal_pointer(&vsock); } =20 -virDomainDeviceDefPtr -virDomainDeviceDefParse(const char *xmlStr, - const virDomainDef *def, - virDomainXMLOptionPtr xmlopt, - void *parseOpaque, - unsigned int flags) +static virDomainDeviceDefPtr +virDomainDeviceDefParseXML(xmlNodePtr node, + const virDomainDef *def, + virDomainXMLOptionPtr xmlopt, + xmlXPathContextPtr ctxt, + void *parseOpaque, + unsigned int flags) { - g_autoptr(xmlDoc) xml =3D NULL; - xmlNodePtr node; - g_autoptr(xmlXPathContext) ctxt =3D NULL; g_autofree virDomainDeviceDefPtr dev =3D NULL; =20 - if (!(xml =3D virXMLParseStringCtxt(xmlStr, _("(device_definition)"), = &ctxt))) - return NULL; - - node =3D ctxt->node; - if (VIR_ALLOC(dev) < 0) return NULL; =20 @@ -16678,6 +16755,32 @@ virDomainDeviceDefParse(const char *xmlStr, } =20 =20 +virDomainDeviceDefPtr +virDomainDeviceDefParse(const char *xmlStr, + const virDomainDef *def, + virDomainXMLOptionPtr xmlopt, + void *parseOpaque, + unsigned int flags) +{ + xmlDocPtr xml; + xmlNodePtr node; + xmlXPathContextPtr ctxt =3D NULL; + virDomainDeviceDefPtr dev =3D NULL; + + if (!(xml =3D virXMLParseStringCtxt(xmlStr, _("(device_definition)"), = &ctxt))) + return NULL; + + node =3D ctxt->node; + + dev =3D virDomainDeviceDefParseXML(node, def, xmlopt, ctxt, parseOpaqu= e, flags); + + xmlFreeDoc(xml); + xmlXPathFreeContext(ctxt); + + return dev; + } + + virDomainDiskDefPtr virDomainDiskDefParse(const char *xmlStr, virDomainXMLOptionPtr xmlopt, @@ -31617,6 +31720,46 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefP= tr def) return 0; } =20 +virDomainDeviceDefListPtr +virDomainDeviceDefParseXMLMany(const char *xml, + const virDomainDef *def, + virDomainXMLOptionPtr xmlopt, + void *parseOpaque, + unsigned int flags) +{ + xmlXPathContextPtr ctxt =3D NULL; + xmlDocPtr xmlPtr; + xmlNodePtr node, root; + virDomainDeviceDefPtr dev =3D NULL; + virDomainDeviceDefListPtr devlist; + + if (!(xmlPtr =3D virXMLParseStringCtxt(xml, _("(device_definition)"), = &ctxt))) + return NULL; + + if (VIR_ALLOC(devlist) < 0) + goto exit; + + root =3D xmlDocGetRootElement(xmlPtr); + node =3D root->children; + while (node) { + if (node->type =3D=3D XML_ELEMENT_NODE) { + dev =3D virDomainDeviceDefParseXML(node, def, xmlopt, ctxt, + parseOpaque, flags); + if (VIR_APPEND_ELEMENT(devlist->devs, devlist->count, dev) < 0= ) { + virDomainDeviceDefFree(dev); + virDomainDeviceDefListFree(devlist); + goto exit; + } + dev =3D NULL; + } + node =3D node->next; + } + + exit: + xmlFreeDoc(xmlPtr); + xmlXPathFreeContext(ctxt); + return devlist; +} =20 /** * virDomainDiskGetDetectZeroesMode: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 77a01fbec0..26d9ca6ba9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2648,6 +2648,33 @@ typedef enum { typedef int (*virDomainDefPostParseBasicCallback)(virDomainDefPtr def, void *opaque); =20 +typedef struct _virDomainDeviceDefListData virDomainDeviceDefListData; +typedef virDomainDeviceDefListData *virDomainDeviceDefListDataPtr; +struct _virDomainDeviceDefListData { + const virDomainDef *def; + virDomainXMLOptionPtr xmlopt; +}; + +struct virDomainDeviceDefList { + virDomainDeviceDefPtr *devs; + size_t count; +}; +typedef struct virDomainDeviceDefList *virDomainDeviceDefListPtr; + +typedef int (*virDomainDeviceDefListIterCallback)(virDomainDeviceDefPtr de= v, + void *opaque); +int virDomainDeviceDefListIterate(virDomainDeviceDefListPtr devlist, + virDomainDeviceDefListIterCallback cb, + void *data); +virDomainDeviceDefListPtr +virDomainDeviceDefListCopy(virDomainDeviceDefListPtr list, + virDomainDeviceDefListDataPtr data, + void *parseOpaque); + +void virDomainDeviceDefListFree(virDomainDeviceDefListPtr list); +void virDomainDeviceDefListFreeShallow(virDomainDeviceDefListPtr list); + + /* Called once after everything else has been parsed, for adjusting * overall domain defaults. * @parseOpaque is opaque data passed by virDomainDefParse* caller, @@ -3053,6 +3080,11 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(const = char *xmlStr, virDomainXMLOptionPtr xmlopt, void *parseOpaque, unsigned int flags); +virDomainDeviceDefListPtr virDomainDeviceDefParseXMLMany(const char *xmlSt= r, + const virDomainDe= f *def, + virDomainXMLOptio= nPtr xmlopt, + void *parseOpaque, + unsigned int flag= s); virDomainDiskDefPtr virDomainDiskDefParse(const char *xmlStr, virDomainXMLOptionPtr xmlopt, unsigned int flags); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5b247ded4b..eda759c219 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -341,7 +341,12 @@ virDomainDeleteConfig; virDomainDeviceAliasIsUserAlias; virDomainDeviceDefCopy; virDomainDeviceDefFree; +virDomainDeviceDefListCopy; +virDomainDeviceDefListFree; +virDomainDeviceDefListFreeShallow; +virDomainDeviceDefListIterate; virDomainDeviceDefParse; +virDomainDeviceDefParseXMLMany; virDomainDeviceFindSCSIController; virDomainDeviceGetInfo; virDomainDeviceInfoIterate; --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1580402759785107.4641256540757; Thu, 30 Jan 2020 08:45:59 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-200-XBTqvsONMMCcdxskJ7dktA-1; Thu, 30 Jan 2020 11:45:54 -0500 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 51D41190B2B0; Thu, 30 Jan 2020 16:45:47 +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 254417795A; Thu, 30 Jan 2020 16:45:47 +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 5116E180CB3B; Thu, 30 Jan 2020 16:45:45 +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 00UGjDrE031978 for ; Thu, 30 Jan 2020 11:45:13 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0C89910551AE; Thu, 30 Jan 2020 16:45:13 +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 0774F10551AC for ; Thu, 30 Jan 2020 16:45:13 +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 84BDA1800F2E for ; Thu, 30 Jan 2020 16:45:10 +0000 (UTC) Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-352-c8LQhwvSPQ6Pzu2q1KTJqQ-1; Thu, 30 Jan 2020 11:45:08 -0500 Received: by mail-qv1-f52.google.com with SMTP id db9so1810309qvb.3 for ; Thu, 30 Jan 2020 08:45:08 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402758; 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=HHq6GJdVkdRMya30aBMy4d/9KKeEkKKHqc1uI9r2DoA=; b=G9woVdXbxFw+HlGtbhZcyTaVHdbzYdNKDRIiXTNHBa6+1M42nSip2DcmcCqDzqDGQEW0ZK nClTG64FsetsYTBdUu4zLf4jogHhSiCq2lgsB54/fo4obIa2JItigyfsJTBNIDy1F2UYcZ CAEZKSOUDf6Fpe0a5smgRtwhqSKdc5A= 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=2qnO0A/7k3Rbox0fZAstklZ900pRPrqT6wXnoYSG+Ew=; b=puLcyyYpHaRBN9vwmH+V7vdca/oWIfyAiPhaPCYqbr7rGf8v4RT4RBK+vfpIizH4u2 YU577u22NmOROUF3osZHMiRp5uQlR+ZYe24g+ZahcAvSoGOWGRpKDcenD9esC9/DrbZ5 JSuADbUpYIIsCLHzROvkdiD5WbA7LmiDSlhkXO/9kYvsf8t/V3QC1GL/B47F47+cJT2H QMAgu4I1Q1MDcKzhJBH8TVva1Pl8C90xTKF7sXLl5F0h7Y0sh4XpXOJ5GCbd2ixPSxbQ mn0gxmB2d1WidmhlwvyreglOGoZk5tfw1Zm9GQh8K+XCQ+fuzLI+OQKeAiSnTKI9YqHx gSoQ== X-Gm-Message-State: APjAAAUlce56e+Q5OWRkrEp5fpOXEv0fywMQuj6p6xaGTKVnS3LV52KH wd6tVtDLSN0hq32Nb7QMa/WvFT5/xhs= X-Google-Smtp-Source: APXvYqyMG2iIuGhZvpBr3zZkZHzDoqoVtOmeGNDErHs8T8g1pNe5bo5IMZO7dMeHFhGn45pBLE7FTQ== X-Received: by 2002:a05:6214:190e:: with SMTP id er14mr5674339qvb.28.1580402707593; Thu, 30 Jan 2020 08:45:07 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 11/21] Introduce qemuDomainDeviceParseXMLMany Date: Thu, 30 Jan 2020 13:44:23 -0300 Message-Id: <20200130164433.2694119-12-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: c8LQhwvSPQ6Pzu2q1KTJqQ-1 X-MC-Unique: XBTqvsONMMCcdxskJ7dktA-1 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 00UGjDrE031978 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.c | 70 ++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 7 +++++ 2 files changed, 77 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2de7343882..3ed2552227 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -16534,6 +16534,76 @@ qemuProcessEventFree(struct qemuProcessEvent *even= t) } =20 =20 +static bool isPCIMultifunctionDeviceXML(const char *xml) +{ + xmlDocPtr xmlptr; + + if (!(xmlptr =3D virXMLParse(NULL, xml, _("(device_definition)")))) { + /* We report error anyway later */ + return false; + } + + return STREQ((const char *)(xmlDocGetRootElement(xmlptr))->name, "devic= es"); +} + +static +int qemuDomainValidateMultifunctionDeviceList(virDomainDeviceDefListPtr de= vlist) +{ + size_t i; + virDomainHostdevDefPtr hostdev =3D NULL; + virDomainDeviceInfoPtr info; + + for (i =3D 0; i < devlist->count; i++) { + info =3D virDomainDeviceGetInfo(devlist->devs[i]); + if (devlist->devs[i]->type =3D=3D VIR_DOMAIN_DEVICE_HOSTDEV) + hostdev =3D devlist->devs[i]->data.hostdev; + + if (hostdev->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE= _PCI) + return -1; + + if (info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + return -1; + } + } + return 0; +} + + +virDomainDeviceDefListPtr +qemuDomainDeviceParseXMLMany(const char *xml, + virDomainDeviceDefListDataPtr data, + void *parseOpaque, + unsigned int parse_flags) +{ + virDomainDeviceDefListPtr devlist =3D NULL; + + if (isPCIMultifunctionDeviceXML(xml)) { + if (!(devlist =3D virDomainDeviceDefParseXMLMany(xml, data->def, + data->xmlopt, + parseOpaque, + parse_flags))) + goto cleanup; + + if (qemuDomainValidateMultifunctionDeviceList(devlist) < 0) + goto cleanup; + } else { + virDomainDeviceDefPtr dev =3D virDomainDeviceDefParse(xml, data->d= ef, + data->xmlopt, + parseOpaque, + parse_flags); + if (!dev || VIR_ALLOC(devlist) < 0) + goto cleanup; + + if (VIR_APPEND_ELEMENT(devlist->devs, devlist->count, dev) < 0) + goto cleanup; + } + + cleanup: + return devlist; +} + + char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv) { diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index c54af16fa5..8d13cc0e56 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1260,6 +1260,13 @@ qemuDomainNVRAMPathGenerate(virQEMUDriverConfigPtr c= fg, virDomainEventSuspendedDetailType qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason); =20 + +virDomainDeviceDefListPtr +qemuDomainDeviceParseXMLMany(const char *xml, + virDomainDeviceDefListDataPtr data, + void *parseOpaque, + unsigned int parse_flags); + int qemuDomainValidateActualNetDef(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps); --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1580402748601588.9654726109195; Thu, 30 Jan 2020 08:45:48 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-169-yBCxK86BNWm4jHkFaBGNAQ-1; Thu, 30 Jan 2020 11:45:43 -0500 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 CD6CB190B2A5; Thu, 30 Jan 2020 16:45:35 +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 9D7EB87EE6; Thu, 30 Jan 2020 16:45:35 +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 538E118095FF; Thu, 30 Jan 2020 16:45: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 00UGjDaE031986 for ; Thu, 30 Jan 2020 11:45:13 -0500 Received: by smtp.corp.redhat.com (Postfix) id 7BBB22166B29; Thu, 30 Jan 2020 16:45:13 +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 773152166B27 for ; Thu, 30 Jan 2020 16:45:13 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.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 5C524803AE7 for ; Thu, 30 Jan 2020 16:45:13 +0000 (UTC) Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.54]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-228-RHfrMoqSOi-VccRM5hUfZA-1; Thu, 30 Jan 2020 11:45:09 -0500 Received: by mail-qv1-f54.google.com with SMTP id u10so1813801qvi.2 for ; Thu, 30 Jan 2020 08:45:09 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402747; 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=JDHsp+pRDznq4hzESDI6P08jcZCc/8EJINKBo1GzAxQ=; b=NTl7T42tM/ioMcjjb6TKENbbsRAsewEhs/U+vwYbZhBXX8a4uIp6jLNliwhLk/8favVZ7y BCxEqXjwf4izoZpwAwzHla1STUov1vrCE91dvISCgIuJ6WZ6+wg3GFFxHQj8R9MHbzRkhv 9gT8HOsdN5m06GvFoAPlu1f+spUHMB8= 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=Mo2uHx54D5yWktvNqCytT0UB/Yu2ZRFPNymnLoClpos=; b=hKUxK1SofB6LWAPRs16fRZd0RCWMRUjFVvMbx/U+RQ5XRPL1bqkwCALlgSM8s3kkCd 31NAOpgomfdh9HHVWSjr1MInQAIKDsjNTMJ55CGVzH9j7P2avgZ3gsgyeEj2VIXUZylB dyGtgu438bD1g/wmfWsQSjgMoCKJZDn+6FHlbgnqVV5FwPIceB97Du7v4FJJ2Y8Rz0FY uMW4Noc4nmaf7LT8mt2sQ9eUAZwRphEDxLMD0G06rsw7NS8c/b2WwD3x9FPRQbWTJRMe EjuyT/EsMilk8wGFur/Vff2sUAamUjm2eKgNVoNhZiYMGiE+jrHDbgtFPcSMfz9FZO8G 9FWQ== X-Gm-Message-State: APjAAAWvUwxl3Afi8e9nfycll75xsIgbwHzfYy081i2Vq9ke/EcZZtpL 9v0esYdjzsxrg3qy6QZ/+IX3122tTMQ= X-Google-Smtp-Source: APXvYqwlhRD3GpIBf/72M8wXW+QYp8zDSXMuuhjJpM+gEAFemCTjB4S5CH1ebXV9lZzGtnsHNGFIIQ== X-Received: by 2002:ad4:57c7:: with SMTP id y7mr2688786qvx.174.1580402709168; Thu, 30 Jan 2020 08:45:09 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 12/21] qemu: refactor qemuDomain[Attach|Detach]DeviceConfig Date: Thu, 30 Jan 2020 13:44:24 -0300 Message-Id: <20200130164433.2694119-13-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: RHfrMoqSOi-VccRM5hUfZA-1 X-MC-Unique: yBCxK86BNWm4jHkFaBGNAQ-1 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 00UGjDaE031986 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat This helps calling the routines with a list of devices. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_driver.c | 45 +++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8bb845298b..2e91a2b694 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8109,11 +8109,8 @@ qemuCheckDiskConfigAgainstDomain(const virDomainDef = *def, =20 =20 static int -qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, - virDomainDeviceDefPtr dev, - virQEMUCapsPtr qemuCaps, - unsigned int parse_flags, - virDomainXMLOptionPtr xmlopt) +qemuDomainAttachDeviceConfigInternal(virDomainDefPtr vmdef, + virDomainDeviceDefPtr dev) { virDomainDiskDefPtr disk; virDomainNetDefPtr net; @@ -8310,19 +8307,35 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, return -1; } =20 - if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, qemuCaps) < 0) - return -1; - return 0; } =20 =20 static int -qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, +qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev, virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) +{ + if (virDomainDefCompatibleDevice(vmdef, dev, NULL, + VIR_DOMAIN_DEVICE_ACTION_ATTACH, + false) < 0) + return -1; + + if (qemuDomainAttachDeviceConfigInternal(vmdef, dev)) + return -1; + + if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, qemuCaps) < 0) + return -1; + + return 0; +} + + +static int +qemuDomainDetachDeviceConfigInternal(virDomainDefPtr vmdef, + virDomainDeviceDefPtr dev) { virDomainDiskDefPtr disk, det_disk; virDomainNetDefPtr net; @@ -8512,6 +8525,20 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, return -1; } =20 + return 0; +} + + +static int +qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, + virDomainDeviceDefPtr dev, + virQEMUCapsPtr qemuCaps, + unsigned int parse_flags, + virDomainXMLOptionPtr xmlopt) +{ + if (qemuDomainDetachDeviceConfigInternal(vmdef, dev)) + return -1; + if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, qemuCaps) < 0) return -1; =20 --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 15804027659841003.9487545554956; Thu, 30 Jan 2020 08:46:05 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-424-zn1lvxTXNdKPZD_vCUy16A-1; Thu, 30 Jan 2020 11:45:59 -0500 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 C0F65190B2B8; Thu, 30 Jan 2020 16:45:51 +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 8F0B57795D; Thu, 30 Jan 2020 16:45:51 +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 210ED1803C43; Thu, 30 Jan 2020 16:45:51 +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 00UGjG66032005 for ; Thu, 30 Jan 2020 11:45:16 -0500 Received: by smtp.corp.redhat.com (Postfix) id 82BDC2166B29; Thu, 30 Jan 2020 16:45:16 +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 7EA2F2166B27 for ; Thu, 30 Jan 2020 16:45:14 +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 666821800F25 for ; Thu, 30 Jan 2020 16:45:14 +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-244-kakaQ-ISOuavbxuKKtN6FQ-1; Thu, 30 Jan 2020 11:45:11 -0500 Received: by mail-qv1-f45.google.com with SMTP id g6so1806388qvy.5 for ; Thu, 30 Jan 2020 08:45:11 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402764; 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=le0XiYIX3QskwmB3/tdbnbHtgS8fJP2MvdeiW2jRfOM=; b=dcNtHwnXihBzXZvtQFHCX6MAEAvL+5oP93F3MJhcgtdqr9d/I+P6YuYAtb0TWkCTXz4BJS vWDCxcz7BoY8AybtCtMtdQKS0TmfBHroT8IxjWFAg9Z+/QIv2ZOuJmFpp2W7rhAAeRJt9b kB8mO9YiKO228OsAokA3N798QKv7BAI= 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=way/xqjY9T/DKXdWkECzOprw0WKFyW5gIz0zmoK5M8U=; b=o0yRmi7jVmt2rNEacwNfuSVDjnHUQ2E9UXLQCLvk7DGze9Lql07twl8imDpxDuuS+R aICkutqV0QfBbF+tcLQTbcUfsjxpicoZ1c2IiixINrQlwAxfdum5IsFBqINDFgIu0Z9/ QG26hDUcEb7mornxUHlDpf08BRXHeMnQoTD+amPQA/QbI1fzPIaxHJswSF86r6/ebL7m wlpdjyeRYCROz+p+JHb6h6XieKwOp6RxunI5hIm/r/9w6MDsneYxfyS68x57rEmVZnHr NkYOBDaj4wSajpT4X5rYUsDZpHwfMGw2/4D6TCQW2KkKqFynnVEpcIhu6sLELvWyvLoD wiuw== X-Gm-Message-State: APjAAAWQgNeHxNehmgtF9P5R0/4BMCYJYlWIgIEMAE0ADkA2BoTC2FkI ejZsspw0j/2Tp/ReQjV/6ZWUPZMpan8= X-Google-Smtp-Source: APXvYqxCdPmAJnqZ4KFj6N38lbuR8E9ld+2N15ToSmJ/0zcWADqQy6PvvBG2esyeXbFnoVuWDPU7lA== X-Received: by 2002:a0c:e014:: with SMTP id j20mr5684947qvk.165.1580402710942; Thu, 30 Jan 2020 08:45:10 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 13/21] qemu: refactor qemuDomain[Attach|Detach]DeviceLive Date: Thu, 30 Jan 2020 13:44:25 -0300 Message-Id: <20200130164433.2694119-14-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: kakaQ-ISOuavbxuKKtN6FQ-1 X-MC-Unique: zn1lvxTXNdKPZD_vCUy16A-1 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 00UGjG66032005 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat Helps calling multiple time per device. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_driver.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2e91a2b694..fb53dc79df 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7816,9 +7816,9 @@ qemuDomainUndefine(virDomainPtr dom) } =20 static int -qemuDomainAttachDeviceLive(virDomainObjPtr vm, - virDomainDeviceDefPtr dev, - virQEMUDriverPtr driver) +qemuDomainAttachDeviceLiveInternal(virDomainObjPtr vm, + virDomainDeviceDefPtr dev, + virQEMUDriverPtr driver) { int ret =3D -1; const char *alias =3D NULL; @@ -7964,13 +7964,28 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, virObjectEventStateQueue(driver->domainEventState, event); } =20 + return ret; +} + +static int +qemuDomainAttachDeviceLive(virDomainObjPtr vm, + virDomainDeviceDefPtr dev, + virQEMUDriverPtr driver) +{ + int ret =3D -1; + + if (virDomainDefCompatibleDevice(vm->def, dev, NULL, + VIR_DOMAIN_DEVICE_ACTION_ATTACH, + false) < 0) + return -1; + + ret =3D qemuDomainAttachDeviceLiveInternal(vm, dev, driver); if (ret =3D=3D 0) ret =3D qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE= ); =20 return ret; } =20 - static int qemuDomainChangeDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev, --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1580402751857168.5644315377018; Thu, 30 Jan 2020 08:45:51 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-269-2H6b_egTOLeWOSQWgakQ5w-1; Thu, 30 Jan 2020 11:45:46 -0500 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 24C7FDB6E; Thu, 30 Jan 2020 16:45: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 F0DDF87B14; Thu, 30 Jan 2020 16:45:39 +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 ACB9387A96; Thu, 30 Jan 2020 16:45:39 +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 00UGjIjF032020 for ; Thu, 30 Jan 2020 11:45:18 -0500 Received: by smtp.corp.redhat.com (Postfix) id A31A1F84D6; Thu, 30 Jan 2020 16:45:18 +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 9E3CDF8A0E for ; Thu, 30 Jan 2020 16:45:16 +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 4BB48811D05 for ; Thu, 30 Jan 2020 16:45:16 +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-133-uV4oEw8mM3W5BjDPMd1szA-1; Thu, 30 Jan 2020 11:45:13 -0500 Received: by mail-qk1-f194.google.com with SMTP id w25so3568530qki.3 for ; Thu, 30 Jan 2020 08:45:13 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402750; 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=B9lQCmbwsarjzk7U8SUFsIUEc+3OpBOx7Ny1sR92bQU=; b=NlE0to2ZeXDlYkJeL9MwJ3ktBHyLrFnYYF5tOo90Z9PkZd3phrp2q6SmLkv7hkpdyv/S3U hCiAKRkCDWiXhiYvgs3SIogZPG1zRy7+BxtoTcSXCM01iwgKhPlNvdgzzepCxx4VOz+EJp A6MZ6uB8o9557YqiotyHjfH+76BdLMo= 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=5BZPEYMWzsGzvlTuXB58ODZbhsfs0wwODR6ou/4+a0c=; b=EVXjLb8YFp9JvN1xQfRnBxgIPLFo1iFkYe0WJp7CdvLIpYbumuQGGhZbQAfQTClHic AM8U2bFzFJ9WHSCggqIf5Hwm/myUfZ3Hm1cfUXvN8cMp99PgOZeC/bori6/yBEzDHfNJ GrM0O5puRPhg0XDyBdr2tJ2Rw1B4A+K3/tW5JMF3qq3ne6cjEEU00qi6Sw+a4yBBvs5H GBVfUXPO3i8Q+wOg8ZCc1vw7teC2ogRrOITgav1HabGBXAFUq0vl0ZfjxXkWMTHC/qHT XlumFoqNaPhG3Ijy3VWMwV8AlL/wpP1gKOPL0QCsW+XtQh3x7VLDQ7CCdoBm1MKKvemP kskQ== X-Gm-Message-State: APjAAAVvlAPzBYDhqB5PO8jkLbLxwby5orKOsFBtFy5/0jked1Ax84Gj t+COUIpqR5/LOaop18amQbAix95oy70= X-Google-Smtp-Source: APXvYqxLw4tiGcvJydphNsJ6s4fak2/Q7YivDijeVEQvp8UzskJWsVQPlekbLsIzFLbxfFikSHDuSQ== X-Received: by 2002:a05:620a:80e:: with SMTP id s14mr5899823qks.136.1580402712589; Thu, 30 Jan 2020 08:45:12 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 14/21] qemu: hotplug: Queue and wait for multiple devices Date: Thu, 30 Jan 2020 13:44:26 -0300 Message-Id: <20200130164433.2694119-15-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: uV4oEw8mM3W5BjDPMd1szA-1 X-MC-Unique: 2H6b_egTOLeWOSQWgakQ5w-1 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 00UGjIjF032020 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat With multifunction devices, multiple delete requests are sent to qemu and all the requests should be queued up. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.h | 3 ++- src/qemu/qemu_hotplug.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 8d13cc0e56..07d828d71a 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -232,7 +232,8 @@ typedef enum { typedef struct _qemuDomainUnpluggingDevice qemuDomainUnpluggingDevice; typedef qemuDomainUnpluggingDevice *qemuDomainUnpluggingDevicePtr; struct _qemuDomainUnpluggingDevice { - const char *alias; + const char **aliases; + size_t naliases; qemuDomainUnpluggingDeviceStatus status; bool eventSeen; /* True if DEVICE_DELETED event arrived. */ }; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 18daa7aeac..2269fd5c10 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -5074,13 +5074,19 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver, =20 static void qemuDomainMarkDeviceAliasForRemoval(virDomainObjPtr vm, - const char *alias) + const char *alias, + bool fresh) { qemuDomainObjPrivatePtr priv =3D vm->privateData; =20 - memset(&priv->unplug, 0, sizeof(priv->unplug)); + if (fresh) + memset(&priv->unplug, 0, sizeof(priv->unplug)); + + if (VIR_REALLOC_N(priv->unplug.aliases, priv->unplug.naliases + 1) < 0) + return; + + priv->unplug.aliases[priv->unplug.naliases++] =3D alias; =20 - priv->unplug.alias =3D alias; } =20 =20 @@ -5089,7 +5095,7 @@ qemuDomainMarkDeviceForRemoval(virDomainObjPtr vm, virDomainDeviceInfoPtr info) =20 { - qemuDomainMarkDeviceAliasForRemoval(vm, info->alias); + qemuDomainMarkDeviceAliasForRemoval(vm, info->alias, true); } =20 =20 @@ -5097,7 +5103,9 @@ static void qemuDomainResetDeviceRemoval(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv =3D vm->privateData; - priv->unplug.alias =3D NULL; + priv->unplug.aliases =3D NULL; + VIR_FREE(priv->unplug.aliases); + priv->unplug.naliases =3D 0; priv->unplug.eventSeen =3D false; } =20 @@ -5132,13 +5140,14 @@ qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm) return 1; until +=3D qemuDomainGetUnplugTimeout(vm); =20 - while (priv->unplug.alias) { + /* All devices should get released around same time*/ + while (priv->unplug.naliases) { if ((rc =3D virDomainObjWaitUntil(vm, until)) =3D=3D 1) return 0; =20 if (rc < 0) { VIR_WARN("Failed to wait on unplug condition for domain '%s' " - "device '%s'", vm->def->name, priv->unplug.alias); + "device '%s'", vm->def->name, priv->unplug.aliases[0]= ); return 1; } } @@ -5164,14 +5173,16 @@ qemuDomainSignalDeviceRemoval(virDomainObjPtr vm, qemuDomainUnpluggingDeviceStatus status) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + size_t i; =20 - if (STREQ_NULLABLE(priv->unplug.alias, devAlias)) { - VIR_DEBUG("Removal of device '%s' continues in waiting thread", de= vAlias); - qemuDomainResetDeviceRemoval(vm); - priv->unplug.status =3D status; - priv->unplug.eventSeen =3D true; - virDomainObjBroadcast(vm); - return true; + for (i =3D 0; i < priv->unplug.naliases; i++) { + if (STREQ_NULLABLE(priv->unplug.aliases[i], devAlias)) { + VIR_DEBUG("Removal of device '%s' continues in waiting thread"= , devAlias); + VIR_DELETE_ELEMENT(priv->unplug.aliases, i, priv->unplug.nalia= ses); + priv->unplug.status =3D status; + virDomainObjBroadcast(vm); + return true; + } } return false; } @@ -5984,7 +5995,7 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceAliasForRemoval(vm, vcpupriv->alias); + qemuDomainMarkDeviceAliasForRemoval(vm, vcpupriv->alias, true); =20 if (qemuDomainDeleteDevice(vm, vcpupriv->alias) < 0) { if (virDomainObjIsActive(vm)) --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 158040282550574.17951312700552; Thu, 30 Jan 2020 08:47:05 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-213-b3SvykkFOVSoO8psTy23fw-1; Thu, 30 Jan 2020 11:45:59 -0500 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 26CD81005F85; Thu, 30 Jan 2020 16:45:52 +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 E8A0360C84; Thu, 30 Jan 2020 16:45:51 +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 8AD671803B48; Thu, 30 Jan 2020 16:45:51 +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 00UGjMeE032042 for ; Thu, 30 Jan 2020 11:45:23 -0500 Received: by smtp.corp.redhat.com (Postfix) id BE289F84D6; Thu, 30 Jan 2020 16:45:22 +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 B9E08F8A0B for ; Thu, 30 Jan 2020 16:45:22 +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 A1602803AD0 for ; Thu, 30 Jan 2020 16:45:22 +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-294-gr_bf2jSMfKPnAgawslIXA-1; Thu, 30 Jan 2020 11:45:15 -0500 Received: by mail-qk1-f193.google.com with SMTP id x1so3499287qkl.12 for ; Thu, 30 Jan 2020 08:45:14 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402823; 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=f8x+lem0fwEmn6M6dExQYwNmNg2FxRIUJYv8/Eu3wOc=; b=PNtM22PDFBJFVlLlOaLrjWjUm5pv0AsVk/g8gSjQt6fwC4CfRr0DJwkrXxGSCpzif2zDzu T70oJatYJ3/k1KlkQXoNw3S1P0tqSZ3os9WFyxF71UopPcindUNHC/vx6KN+iEO1WRuu51 Qsm8G/wD1eBKDvZLTdYo581AVykcoC8= 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=c8DbpjVRAg+ngv9uO7stdF2tBbqlxhTS8+IMmP4mdOY=; b=h8h61m6v8Sx84MTOP2Ou08LvBPKexLxDs1JTmpQ+hA5x/cUbysN/gkmGvTaLvANWLd T2qCklDwU3HTvx72EmtY25hfgcPbO758E3K+u7mEOrCMo3FVv7b3q6D+HSwbKKlB2PwP 0mR/+a3peV/oGUDELfWYFT3LkAozhpmGB+QtD9c6lQDGefTuu1c28Mwn+8DpOpde14Ul XBTpsGSKzaXwhSgJP4d8U3S6tE056hVWg19nXaXB9UAWB/ZiDGjyA+M+qZXNE+s1yflI YqE3r1zipRaYxtVkfXcgj4bbmky14yZWLXWrV45rg0JilJovOsNmapFfWdYS7Hu7s9ZZ GEkQ== X-Gm-Message-State: APjAAAXUYYCOCMgItlvyASG/BDfUr5kBc3C9l4r4KE5oNTKpbHp9RYxq JKAViMBr+F4j+Ym8dMq0aDh/FxBFUIE= X-Google-Smtp-Source: APXvYqxkGc5NuHPvGkHf/1ElibHbutwzXYK9mEqOpnbGjgdO9Mi7aaG7eZNXIEhmly1EI2AB/Bmy7g== X-Received: by 2002:a05:620a:634:: with SMTP id 20mr6081766qkv.269.1580402714458; Thu, 30 Jan 2020 08:45:14 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 15/21] domain: addr: Introduce virDomainPCIAddressEnsureMultifunctionAddress Date: Thu, 30 Jan 2020 13:44:27 -0300 Message-Id: <20200130164433.2694119-16-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: gr_bf2jSMfKPnAgawslIXA-1 X-MC-Unique: b3SvykkFOVSoO8psTy23fw-1 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 00UGjMeE032042 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/conf/device_conf.h | 6 +++ src/conf/domain_addr.c | 84 +++++++++++++++++++++++++++++++++++++++- src/conf/domain_addr.h | 5 +++ src/libvirt_private.syms | 1 + src/util/virpci.h | 2 + 5 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index d8649daa6d..8c5811a4f6 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -183,6 +183,12 @@ struct _virDomainDeviceInfo { bool isolationGroupLocked; }; =20 +typedef struct _virDomainPCIMultifunctionAddressInfo virDomainPCIMultifunc= tionAddressInfo; +typedef virDomainPCIMultifunctionAddressInfo *virDomainPCIMultifunctionAdd= ressInfoPtr; +struct _virDomainPCIMultifunctionAddressInfo { + virDomainDeviceInfoPtr infos[VIR_PCI_MAX_FUNCTIONS]; +}; + void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info); void virDomainDeviceInfoFree(virDomainDeviceInfoPtr info); =20 diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 8e4817689e..9abbdc9d54 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -21,11 +21,12 @@ =20 #include =20 +#include "device_conf.h" +#include "domain_addr.h" #include "viralloc.h" +#include "virhashcode.h" #include "virlog.h" #include "virstring.h" -#include "domain_addr.h" -#include "virhashcode.h" =20 #define VIR_FROM_THIS VIR_FROM_DOMAIN =20 @@ -977,6 +978,85 @@ virDomainPCIAddressExtensionReleaseAddr(virDomainPCIAd= dressSetPtr addrs, } =20 =20 +int +virDomainPCIAddressEnsureMultifunctionAddress(virDomainPCIAddressSetPtr ad= drs, + virDomainPCIMultifunctionAdd= ressInfoPtr pcicard) +{ + size_t i; + int ret =3D 0; + virPCIDeviceAddressPtr addr1 =3D NULL, addr2 =3D NULL; + virDomainDeviceInfoPtr dev =3D NULL; + + if (!pcicard->infos[0]) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Function-Zero missing on the slot")); + return -1; + } + + /* If the address is given by the user, make sure they belong + * to same slot */ + for (i =3D 0; i < VIR_PCI_MAX_FUNCTIONS; i++) { + g_autofree char *addrStr =3D NULL; + dev =3D pcicard->infos[i]; + + if (dev && !dev->pciConnectFlags) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Not a PCI Multifunction device.")); + return -1; + } + if (dev && virDeviceInfoPCIAddressIsPresent(dev)) { + /* Pick one and compare against rest of the user given */ + addr1 =3D addr1 ? addr1 : &dev->addr.pci; + addr2 =3D &dev->addr.pci; + + if (!(addrStr =3D virPCIDeviceAddressAsString(addr2))) + return -1; + + if (!virDomainPCIAddressValidate(addrs, addr2, addrStr, + dev->pciConnectFlags, true)) + return -1; + + if (!(addr1->domain =3D=3D addr2->domain && addr1->bus =3D=3D = addr2->bus && + addr1->slot =3D=3D addr2->slot)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Addresses belong to different PCI slots= ")); + return -1; + } + } + } + + /* Reserve all the user given addresses. */ + for (i =3D 0; i < VIR_PCI_MAX_FUNCTIONS; i++) { + dev =3D pcicard->infos[i]; + if (dev && virDeviceInfoPCIAddressIsPresent(dev)) { + ret =3D virDomainPCIAddressReserveAddrInternal(addrs, &dev->ad= dr.pci, + dev->pciConnectFl= ags, + dev->isolationGro= up, + dev->aggregateSlo= tIdx, + true); + if (ret < 0) + return ret; + } + } + + /* If the user has not given addresses, start with function zero */ + for (i =3D 0; i < VIR_PCI_MAX_FUNCTIONS; i++) { + dev =3D pcicard->infos[i]; + if (dev && !virDeviceInfoPCIAddressIsPresent(dev)) { + ret =3D virDomainPCIAddressReserveNextAddr(addrs, dev, + dev->pciConnectFlags,= i); + if (ret < 0) + return ret; + } + } + + /* Set multi on overriding what user has set. */ + pcicard->infos[0]->addr.pci.multi =3D VIR_TRISTATE_SWITCH_ON; + + return 0; +} + + void virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 65dbdb3286..50006a8e9b 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -178,6 +178,11 @@ int virDomainPCIAddressEnsureAddr(virDomainPCIAddressS= etPtr addrs, virDomainPCIConnectFlags flags) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 +int +virDomainPCIAddressEnsureMultifunctionAddress(virDomainPCIAddressSetPtr ad= drs, + virDomainPCIMultifunctionAdd= ressInfoPtr pcicard) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + void virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index eda759c219..0b5a34e450 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -148,6 +148,7 @@ virDomainCCWAddressSetFree; virDomainPCIAddressBusIsFullyReserved; virDomainPCIAddressBusSetModel; virDomainPCIAddressEnsureAddr; +virDomainPCIAddressEnsureMultifunctionAddress; virDomainPCIAddressExtensionReleaseAddr; virDomainPCIAddressExtensionReserveAddr; virDomainPCIAddressExtensionReserveNextAddr; diff --git a/src/util/virpci.h b/src/util/virpci.h index 9d8dcfec05..4d0994b195 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -26,6 +26,8 @@ #include "virutil.h" #include "virenum.h" =20 +#define VIR_PCI_MAX_FUNCTIONS 8 + typedef struct _virPCIDevice virPCIDevice; typedef virPCIDevice *virPCIDevicePtr; typedef struct _virPCIDeviceAddress virPCIDeviceAddress; --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1580402755556127.47434028453756; Thu, 30 Jan 2020 08:45:55 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-359-ArcTQQ26MCK80ncRF3mP5Q-1; Thu, 30 Jan 2020 11:45:51 -0500 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 7CE768010EC; Thu, 30 Jan 2020 16:45:45 +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 53EFF60C84; Thu, 30 Jan 2020 16:45:45 +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 0868B180612F; Thu, 30 Jan 2020 16:45:45 +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 00UGjKGH032029 for ; Thu, 30 Jan 2020 11:45:20 -0500 Received: by smtp.corp.redhat.com (Postfix) id 890BB2166B29; Thu, 30 Jan 2020 16:45:20 +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 8463E2166B27 for ; Thu, 30 Jan 2020 16:45:20 +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 53A6B8047D7 for ; Thu, 30 Jan 2020 16:45:20 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-247-MKcCNovpOi-O46DH_f-gpA-1; Thu, 30 Jan 2020 11:45:17 -0500 Received: by mail-qt1-f195.google.com with SMTP id c5so2979607qtj.6 for ; Thu, 30 Jan 2020 08:45:17 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402754; 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=+chMp+q1wbfnOqYvg0P0DfQ8BXbZ6PT2Pb12oPeaiIA=; b=RodjiNTPPt2DGFPhWvXSqgAwoF2NEx7ZUEgGCtq5Ra03MjtAhYdL98tTstIKdVeMeMuBAd PeYy9e8ST01rPdlLXAmsPzGRkR+H8fx5VIizj3Ph7mXwCWtnjMCpzyvFGLDWZfHz540ORO CpxGnz7O+LrcPVxaeQUihV/jbbq+tCY= 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=ybb8UjcXYe7bJjCJAixTxyZoqteumO22k+WRL5sd950=; b=tD9gpCxEJrPNrCCFkqJ9m9iHsIs6Fn6ihPyQVVPJ9bEJooHftV+Ncl1CvxsMtr6ZlU o7j4L0pnGN0i3ZijXa5YP4KGgHowPSCrEjyp+REmcuoKC5BN1dKeDDeyI2vidzLeULn7 jkIDrAqDSLr3Ul+6e2RateEXHbPkxj36ISYyJtnbYJxlV3rYrUd4BzSHNEVcY++IQKR9 FHtV2FIqB7JUP+lSVVXqCCx2Y99y8TXKoea32YkvkP9B/gaFRdcA56TkJFp5ucoHrCOZ G+xkfuU5kKtLotIkBcP8qGfOTmt9RNcRhmK4ueYHcGk9LwEf6IjfDfo5zAUh4iKG8sZ8 ovpA== X-Gm-Message-State: APjAAAWWeyUscCtBQftXgXXO/0GPiSK886iikUiwGEXZ1FB0EM0wB2/A oXm3xYf9fWHJGD6d4Cch5cCbnolYPjM= X-Google-Smtp-Source: APXvYqxNDONP0D3uicy0btPWTGLGhW97LqySO83LZocRN0X8/3hWQv+cOxbezPnlTH47qp33jfcyyA== X-Received: by 2002:ac8:7299:: with SMTP id v25mr5949732qto.128.1580402716341; Thu, 30 Jan 2020 08:45:16 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 16/21] qemu: hotplug: Implement multifunction device hotplug Date: Thu, 30 Jan 2020 13:44:28 -0300 Message-Id: <20200130164433.2694119-17-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: MKcCNovpOi-O46DH_f-gpA-1 X-MC-Unique: ArcTQQ26MCK80ncRF3mP5Q-1 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 00UGjKGH032029 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat The support to allow multifunction device hotplug consists of using virDomainDeviceDefListPtr lists instead of single virDomainDeviceDefPtr device definitions in both qemuDomainAttachDeviceConfig() and qemuDomainAttachDeviceLive(). In AttachDeviceConfig() the same existing single device code is ran for all devs in the list. AttachDeviceLive() will verify if the list has size =3D 1 (meaning it is a single device attach) and redirect the code to the regular single dev attach procedure. If list size > 1, we'll execute a new specialized function called qemuDomainAttachMultifunctionDevice(), which is prepared to handle the nuances of this type of hotplug. The changes in both AttachDeviceLive() and AttachDeviceConfig() implied in changes to be made in qemuDomainAttachDeviceLiveAndConfig(), which is now handling a device list instead of a single device. All other added functions, most notably qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(), are used inside qemuDomainAttachMultifunctionDevice(). No changes in regular device hotplug mechanics were made. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain_address.c | 76 +++++++++++ src/qemu/qemu_domain_address.h | 5 + src/qemu/qemu_driver.c | 119 +++++++++++------- src/qemu/qemu_hotplug.c | 86 +++++++++++++ src/qemu/qemu_hotplug.h | 4 + tests/qemuhotplugtest.c | 40 ++++-- ...emuhotplug-multifunction-hostdev-pci-2.xml | 14 +++ .../qemuhotplug-multifunction-hostdev-pci.xml | 26 ++++ ...ug-base-live+multifunction-hostdev-pci.xml | 82 ++++++++++++ ...-base-live+multifunction-hostdev-pci-2.xml | 59 +++++++++ ...es-base-live+multifunction-hostdev-pci.xml | 69 ++++++++++ 11 files changed, 528 insertions(+), 52 deletions(-) create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-multifunction-= hostdev-pci-2.xml create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-multifunction-= hostdev-pci.xml create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-base-live+mult= ifunction-hostdev-pci.xml create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-l= ive+multifunction-hostdev-pci-2.xml create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-l= ive+multifunction-hostdev-pci.xml diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index d9e36867bd..395f054b8d 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -23,6 +23,7 @@ =20 #include "qemu_domain_address.h" #include "qemu_domain.h" +#include "domain_conf.h" #include "viralloc.h" #include "virhostdev.h" #include "virerror.h" @@ -3477,6 +3478,81 @@ qemuDomainEnsurePCIAddress(virDomainObjPtr obj, info->pciConnectFlags); } =20 + +int +qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(virDomainObjPtr vm, + virDomainDeviceDefList= Ptr devlist, + virQEMUDriverPtr drive= r) +{ + int ret =3D -1, aggrslotidx =3D 0; + virBitmapPtr slotmap =3D NULL; + size_t i; + qemuDomainObjPrivatePtr priv =3D vm->privateData; + virDomainPCIMultifunctionAddressInfoPtr devinfos =3D NULL; + + if (devlist->count > VIR_PCI_MAX_FUNCTIONS) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("More devices per slot found")); + return -1; + } + + for (i =3D 0; i < devlist->count; i++) + qemuDomainFillDevicePCIConnectFlags(vm->def, devlist->devs[i], + priv->qemuCaps, driver); + + if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + devlist->cou= nt) < 0) + return -1; + + /* Temporarily add the devices to the domain def to get the + * next aggregateIdx */ + for (i =3D 0; i < devlist->count; i++) + vm->def->hostdevs[vm->def->nhostdevs++] =3D devlist->devs[i]->data= .hostdev; + + for (i =3D 0; i < devlist->count; i++) { + virDomainHostdevDefPtr hostdev =3D devlist->devs[i]->data.hostdev; + + if (qemuDomainIsPSeries(vm->def)) { + /* Isolation groups are only relevant for pSeries guests */ + if (qemuDomainFillDeviceIsolationGroup(vm->def, devlist->devs[= i]) < 0) + return -1; + } + + qemuDomainSetDeviceSlotAggregateIdx(vm->def, devlist->devs[i]); + aggrslotidx =3D aggrslotidx ? aggrslotidx : hostdev->info->aggrega= teSlotIdx; + + if (aggrslotidx !=3D hostdev->info->aggregateSlotIdx) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Devices belong to different PCI slots")); + return -1; + } + } + + for (i =3D 0; i < devlist->count; i++) + vm->def->hostdevs[--(vm->def->nhostdevs)] =3D NULL; + + slotmap =3D virDomainDefHostdevGetPCIOnlineFunctionMap(vm->def, aggrsl= otidx); + if (!virBitmapIsAllClear(slotmap)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("Device already assigned to guest")); + return -1; + } + + if (VIR_ALLOC(devinfos) < 0) + return -1; + + for (i =3D 0; i < devlist->count; i++) { + virDomainHostdevDefPtr hostdev =3D devlist->devs[i]->data.hostdev; + virPCIDeviceAddress addr =3D hostdev->source.subsys.u.pci.addr; + + devinfos->infos[addr.function] =3D hostdev->info; + } + + ret =3D virDomainPCIAddressEnsureMultifunctionAddress(priv->pciaddrs, = devinfos); + VIR_FREE(devinfos); + return ret; +} + + void qemuDomainReleaseDeviceAddress(virDomainObjPtr vm, virDomainDeviceInfoPtr info) diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h index a17245dbde..035b40a5a7 100644 --- a/src/qemu/qemu_domain_address.h +++ b/src/qemu/qemu_domain_address.h @@ -49,6 +49,11 @@ int qemuDomainEnsurePCIAddress(virDomainObjPtr obj, virQEMUDriverPtr driver) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); =20 +int +qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(virDomainObjPtr obj, + virDomainDeviceDefList= Ptr devlist, + virQEMUDriverPtr drive= r); + int qemuDomainFillDeviceIsolationGroup(virDomainDefPtr def, virDomainDeviceDefPtr dev) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fb53dc79df..95ad4c5e69 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7969,17 +7969,28 @@ qemuDomainAttachDeviceLiveInternal(virDomainObjPtr = vm, =20 static int qemuDomainAttachDeviceLive(virDomainObjPtr vm, - virDomainDeviceDefPtr dev, + virDomainDeviceDefListPtr devlist, virQEMUDriverPtr driver) { int ret =3D -1; + size_t i; =20 - if (virDomainDefCompatibleDevice(vm->def, dev, NULL, - VIR_DOMAIN_DEVICE_ACTION_ATTACH, - false) < 0) - return -1; + for (i =3D 0; i < devlist->count; i++) + if (virDomainDefCompatibleDevice(vm->def, devlist->devs[i], NULL, + VIR_DOMAIN_DEVICE_ACTION_ATTACH, + false) < 0) + return ret; + + if (devlist->count > 1) { + ret =3D qemuDomainAttachMultifunctionDevice(vm, devlist, driver); + if (ret =3D=3D 0) { + for (i =3D 0; i < devlist->count; i++) + devlist->devs[i]->data.hostdev =3D NULL; + } + } else if (devlist->count =3D=3D 1) { + ret =3D qemuDomainAttachDeviceLiveInternal(vm, devlist->devs[0], d= river); + } =20 - ret =3D qemuDomainAttachDeviceLiveInternal(vm, dev, driver); if (ret =3D=3D 0) ret =3D qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE= ); =20 @@ -8328,18 +8339,24 @@ qemuDomainAttachDeviceConfigInternal(virDomainDefPt= r vmdef, =20 static int qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, - virDomainDeviceDefPtr dev, + virDomainDeviceDefListPtr devlist, virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) { - if (virDomainDefCompatibleDevice(vmdef, dev, NULL, - VIR_DOMAIN_DEVICE_ACTION_ATTACH, - false) < 0) - return -1; + size_t i; =20 - if (qemuDomainAttachDeviceConfigInternal(vmdef, dev)) - return -1; + for (i =3D 0; i < devlist->count; i++) { + if (virDomainDefCompatibleDevice(vmdef, devlist->devs[i], NULL, + VIR_DOMAIN_DEVICE_ACTION_ATTACH, + false) < 0) + return -1; + } + + for (i =3D 0; i < devlist->count; i++) { + if (qemuDomainAttachDeviceConfigInternal(vmdef, devlist->devs[i])) + return -1; + } =20 if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, qemuCaps) < 0) return -1; @@ -8705,9 +8722,14 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr = vm, qemuDomainObjPrivatePtr priv =3D vm->privateData; virDomainDefPtr vmdef =3D NULL; g_autoptr(virQEMUDriverConfig) cfg =3D NULL; - virDomainDeviceDefPtr devConf =3D NULL; - virDomainDeviceDef devConfSave =3D { 0 }; + virDomainDeviceDefPtr devConfSave =3D NULL; virDomainDeviceDefPtr devLive =3D NULL; + virDomainDeviceDefListPtr devListConf =3D NULL; + virDomainDeviceDefListPtr devListConfSave =3D NULL; + virDomainDeviceDefListPtr devListLive =3D NULL; + virDomainDeviceDefListData data =3D {.def =3D vm->def, + .xmlopt =3D driver->xmlopt}; + size_t i; int ret =3D -1; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE; @@ -8726,52 +8748,58 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr= vm, if (!vmdef) goto cleanup; =20 - if (!(devConf =3D virDomainDeviceDefParse(xml, vmdef, - driver->xmlopt, priv->qemu= Caps, - parse_flags))) + devListConf =3D qemuDomainDeviceParseXMLMany(xml, &data, priv->qem= uCaps, + parse_flags); + if (!devListConf) goto cleanup; =20 /* - * devConf will be NULLed out by + * devListConf will be NULLed out by * qemuDomainAttachDeviceConfig(), so save it for later use by * qemuDomainAttachDeviceLiveAndConfigHomogenize() */ - devConfSave =3D *devConf; - - if (virDomainDeviceValidateAliasForHotplug(vm, devConf, - VIR_DOMAIN_AFFECT_CONFI= G) < 0) - goto cleanup; + if (flags & VIR_DOMAIN_AFFECT_LIVE) { + devListConfSave =3D virDomainDeviceDefListCopy(devListConf, + &data, + priv->qemuCaps); + if (!devListConfSave) + goto cleanup; + } =20 - if (virDomainDefCompatibleDevice(vmdef, devConf, NULL, - VIR_DOMAIN_DEVICE_ACTION_ATTACH, - false) < 0) - goto cleanup; + for (i =3D 0; i < devListConf->count; i++) { + if (virDomainDeviceValidateAliasForHotplug(vm, + devListConf->devs[i= ], + flags) < 0) + goto cleanup; + } =20 - if (qemuDomainAttachDeviceConfig(vmdef, devConf, priv->qemuCaps, + if (qemuDomainAttachDeviceConfig(vmdef, devListConf, priv->qemuCap= s, parse_flags, driver->xmlopt) < 0) goto cleanup; } =20 if (flags & VIR_DOMAIN_AFFECT_LIVE) { - if (!(devLive =3D virDomainDeviceDefParse(xml, vm->def, - driver->xmlopt, priv->qemu= Caps, - parse_flags))) + devListLive =3D qemuDomainDeviceParseXMLMany(xml, &data, priv->qem= uCaps, + parse_flags); + if (!devListLive) goto cleanup; =20 - if (flags & VIR_DOMAIN_AFFECT_CONFIG) - qemuDomainAttachDeviceLiveAndConfigHomogenize(&devConfSave, de= vLive); + for (i =3D 0; i < devListLive->count; i++) { + devLive =3D devListLive->devs[i]; =20 - if (virDomainDeviceValidateAliasForHotplug(vm, devLive, - VIR_DOMAIN_AFFECT_LIVE)= < 0) - goto cleanup; + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + devConfSave =3D devListConfSave->devs[i]; + qemuDomainAttachDeviceLiveAndConfigHomogenize(devConfSave, + devLive); + } =20 - if (virDomainDefCompatibleDevice(vm->def, devLive, NULL, - VIR_DOMAIN_DEVICE_ACTION_ATTACH, - true) < 0) - goto cleanup; + if (virDomainDeviceValidateAliasForHotplug(vm, devLive, + VIR_DOMAIN_AFFECT_L= IVE) < 0) + goto cleanup; + } =20 - if (qemuDomainAttachDeviceLive(vm, devLive, driver) < 0) + if (qemuDomainAttachDeviceLive(vm, devListLive, driver) < 0) goto cleanup; /* * update domain status forcibly because the domain status may be @@ -8794,8 +8822,11 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr = vm, ret =3D 0; cleanup: virDomainDefFree(vmdef); - virDomainDeviceDefFree(devConf); - virDomainDeviceDefFree(devLive); + devConfSave =3D NULL; + devLive =3D NULL; + virDomainDeviceDefListFree(devListConf); + virDomainDeviceDefListFree(devListConfSave); + virDomainDeviceDefListFree(devListLive); =20 return ret; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 2269fd5c10..495a5c9bdd 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1668,6 +1668,92 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr drive= r, } =20 =20 +static int +qemuiHostdevPCIMultifunctionDevicesListSort(const void *p1, + const void *p2) +{ + virDomainDeviceDefPtr a =3D *(virDomainDeviceDefPtr *) p1; + virDomainDeviceDefPtr b =3D *(virDomainDeviceDefPtr *) p2; + virPCIDeviceAddressPtr addr1 =3D &a->data.hostdev->source.subsys.u.pci= .addr; + virPCIDeviceAddressPtr addr2 =3D &b->data.hostdev->source.subsys.u.pci= .addr; + + return addr1->function - addr2->function; +} + + +int +qemuDomainAttachMultifunctionDevice(virDomainObjPtr vm, + virDomainDeviceDefListPtr devlist, + virQEMUDriverPtr driver) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + size_t i, d, h =3D devlist->count; + int ret =3D -1; + char *alias; + virObjectEventPtr event; + virDomainHostdevDefPtr hostdev; + + qsort(devlist->devs, devlist->count, sizeof(*devlist->devs), + qemuiHostdevPCIMultifunctionDevicesListSort); + + if (qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(vm, devlist, + driver) < 0) + return -1; + + for (d =3D 0; d < devlist->count; d++) { + hostdev =3D devlist->devs[d]->data.hostdev; + + if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, hostdev, + priv->qemuCaps) < 0) + goto cleanup; + } + + /* Hotplug all functions, and Primary at last */ + for (h =3D devlist->count; h > 0; h--) { + /* The functions need not be contiguous, as a card may be sold with + * minimal functionality and then install the additional functions= on + * purchase into any of the daughter-card connectors. + */ + hostdev =3D devlist->devs[h-1]->data.hostdev; + + ret =3D qemuDomainAttachHostPCIDevice(driver, vm, hostdev); + if (ret) + goto release; + + alias =3D hostdev->info->alias; + hostdev =3D NULL; + + event =3D virDomainEventDeviceAddedNewFromObj(vm, alias); + virObjectEventStateQueue(driver->domainEventState, event); + } + + release: + /* Release addresses for the device which are not hotplugged. + */ + for (i =3D 0; i < h; i++) + qemuDomainReleaseDeviceAddress(vm, devlist->devs[i]->data.hostdev-= >info); + + cleanup: + /* If none are actually hotplugged and just detached from the + * host driver reattach the devices to host driver. + * + * If one of the hotplug failed, those which are already hotplugged ca= nnot + * be unplugged as they are released by qemu only on guest reboot even + * if we issue device_del on them. + * So, dont attempt to reattach any of them. + * NB: Let them be in the guest as they are not used anyway without + * function-zero? + */ + if (d > 0 && h =3D=3D devlist->count) { + for (i =3D 0; i < d; i++) + qemuHostdevReAttachPCIDevices(driver, vm->def->name, + &devlist->devs[i]->data.hostdev,= 1); + } + + return ret; +} + + void qemuDomainDelTLSObjects(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 2874db43ee..9fd262a81b 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -126,6 +126,10 @@ int qemuDomainAttachPCIHostDevicePrepare(virQEMUDriver= Ptr driver, virDomainDefPtr def, virDomainHostdevDefPtr dev, virQEMUCapsPtr qemuCaps); +int +qemuDomainAttachMultifunctionDevice(virDomainObjPtr vm, + virDomainDeviceDefListPtr devlist, + virQEMUDriverPtr driver); =20 int qemuDomainChrInsert(virDomainDefPtr vmdef, diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 48284fdb3e..9c84b639a6 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -88,6 +88,7 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY); + virQEMUCapsSet(priv->qemuCaps, X_QEMU_CAPS_PCI_MULTIFUNCTION); =20 if (qemuTestCapsCacheInsert(driver.qemuCapsCache, priv->qemuCaps) < 0) return -1; @@ -116,9 +117,14 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, =20 static int testQemuHotplugAttach(virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefListPtr devlist) { int ret =3D -1; + virDomainDeviceDefPtr dev; + + if (devlist->count > 1) + return qemuDomainAttachMultifunctionDevice(vm, devlist, &driver); + dev =3D devlist->devs[0]; =20 switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: @@ -243,7 +249,9 @@ testQemuHotplug(const void *data) bool keep =3D test->keep; unsigned int device_parse_flags =3D 0; virDomainObjPtr vm =3D NULL; - virDomainDeviceDefPtr dev =3D NULL; + virDomainDeviceDefPtr dev =3D NULL; /* temporary */ + virDomainDeviceDefListPtr devlist =3D NULL; + virDomainDeviceDefListData listdata; virCapsPtr caps =3D NULL; qemuMonitorTestPtr test_mon =3D NULL; qemuDomainObjPrivatePtr priv =3D NULL; @@ -281,11 +289,15 @@ testQemuHotplug(const void *data) if (test->action =3D=3D ATTACH) device_parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 - if (!(dev =3D virDomainDeviceDefParse(device_xml, vm->def, - driver.xmlopt, NULL, - device_parse_flags))) + listdata.def =3D vm->def; + listdata.xmlopt =3D driver.xmlopt; + devlist =3D qemuDomainDeviceParseXMLMany(device_xml, &listdata, NULL, + device_parse_flags); + if (!devlist) goto cleanup; =20 + dev =3D devlist->devs[0]; /* temporary */ + /* Now is the best time to feed the spoofed monitor with predefined * replies. */ if (!(test_mon =3D qemuMonitorTestNew(driver.xmlopt, vm, &driver, @@ -314,11 +326,11 @@ testQemuHotplug(const void *data) =20 switch (test->action) { case ATTACH: - ret =3D testQemuHotplugAttach(vm, dev); + ret =3D testQemuHotplugAttach(vm, devlist); if (ret =3D=3D 0) { /* vm->def stolen dev->data.* so we just need to free the dev * envelope */ - VIR_FREE(dev); + virDomainDeviceDefListFreeShallow(devlist); } if (ret =3D=3D 0 || fail) ret =3D testQemuHotplugCheckResult(vm, result_xml, @@ -352,7 +364,7 @@ testQemuHotplug(const void *data) virObjectUnref(vm); test->vm =3D NULL; } - virDomainDeviceDefFree(dev); + virDomainDeviceDefListFree(devlist); virObjectUnref(caps); qemuMonitorTestFree(test_mon); return ((ret < 0 && fail) || (!ret && !fail)) ? 0 : -1; @@ -817,6 +829,18 @@ mymain(void) "device_add", QMP_OK); DO_TEST_DETACH("pseries-base-live", "hostdev-pci", false, false, "device_del", QMP_DEVICE_DELETED("hostdev0") QMP_OK); + DO_TEST_ATTACH("base-live", "multifunction-hostdev-pci", false, false, + "device_add", QMP_OK, + "device_add", QMP_OK, + "device_add", QMP_OK, + "device_add", QMP_OK); + + qemuTestSetHostArch(&driver, VIR_ARCH_PPC64); + DO_TEST_ATTACH("pseries-base-live", "multifunction-hostdev-pci-2", fal= se, false, + "device_add", QMP_OK, + "device_add", QMP_OK, + "device_add", QMP_OK); + qemuTestSetHostArch(&driver, VIR_ARCH_X86_64); =20 DO_TEST_ATTACH("base-live", "watchdog", false, true, "watchdog-set-action", QMP_OK, diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev= -pci-2.xml b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev= -pci-2.xml new file mode 100644 index 0000000000..02e2236e5d --- /dev/null +++ b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev-pci-2.= xml @@ -0,0 +1,14 @@ + + + + +
+ + + + + +
+ + + diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev= -pci.xml b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev-p= ci.xml new file mode 100644 index 0000000000..bef4be219f --- /dev/null +++ b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev-pci.xml @@ -0,0 +1,26 @@ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+multifuncti= on-hostdev-pci.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+mul= tifunction-hostdev-pci.xml new file mode 100644 index 0000000000..9dd04d3350 --- /dev/null +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+multifunction-host= dev-pci.xml @@ -0,0 +1,82 @@ + + hotplug + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + + + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-live+mul= tifunction-hostdev-pci-2.xml b/tests/qemuhotplugtestdomains/qemuhotplug-pse= ries-base-live+multifunction-hostdev-pci-2.xml new file mode 100644 index 0000000000..f99c1b3741 --- /dev/null +++ b/tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-live+multifunct= ion-hostdev-pci-2.xml @@ -0,0 +1,59 @@ + + hotplug + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-ppc64 + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + + + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-live+mul= tifunction-hostdev-pci.xml b/tests/qemuhotplugtestdomains/qemuhotplug-pseri= es-base-live+multifunction-hostdev-pci.xml new file mode 100644 index 0000000000..9338d42e2e --- /dev/null +++ b/tests/qemuhotplugtestdomains/qemuhotplug-pseries-base-live+multifunct= ion-hostdev-pci.xml @@ -0,0 +1,69 @@ + + hotplug + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-ppc64 + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + + + + + --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1580402769361463.7254585282461; Thu, 30 Jan 2020 08:46:09 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-326-MM0lVcPpNi-k9z8hkHuzSw-1; Thu, 30 Jan 2020 11:46:03 -0500 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 8D1A2100551A; Thu, 30 Jan 2020 16:45:55 +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 67C085DA7E; Thu, 30 Jan 2020 16:45:55 +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 250F485C81; Thu, 30 Jan 2020 16:45:55 +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 00UGjO0s032052 for ; Thu, 30 Jan 2020 11:45:24 -0500 Received: by smtp.corp.redhat.com (Postfix) id 470732033955; Thu, 30 Jan 2020 16:45:24 +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 4234B2093CCD for ; Thu, 30 Jan 2020 16:45:21 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.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 A9B728047D7 for ; Thu, 30 Jan 2020 16:45:21 +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-358-FrjSzHqzNCSV3I_OYHBUKg-1; Thu, 30 Jan 2020 11:45:18 -0500 Received: by mail-qt1-f193.google.com with SMTP id d5so3018825qto.0 for ; Thu, 30 Jan 2020 08:45:18 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402768; 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=04QivCumYk3hWvRy6EFTt6f+/kVb2xG9KcmI9evEhfI=; b=dZmBq0wpAJfI4lxaqhtdwCHNkx/0NdOyxWPBtycpHtsSmqKsjikCSWTsk0Cf21Poow6gtL 46jgaJfwTNlSmNmv886puv8uo8hQZtOGnOUNgUr0vXedh3rXACzKoEub/LFoH0pLz6ZmOM mM3OnRMcRXcG1ueLTSsdPHuPt9UwOa4= 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=DJajDtHgjYL749/Y9MqfyXbTONPcjWZTEXZgzs61bRQ=; b=KnQPEwCSZt1gQlc4ZbOlny0Zm9RNUZW90nK1sHppecJRA7Tx8eLmlgAlCZCFx2bR+s I/T+B9sVH87h+ROcY88/0Ks5H/QiV8A3Zx+BfmqtaghKX3z0Cj06UsH2M/r2OsrTeIRQ C7XhQ0j54cVlKs/ifU5f2NHeV+UjUqwEvaxSlx1DrpiQeG4Bcm8s1YgnUVDfCxXGLib5 K+8xCWMdmeelyPvieLPEPYVmD8/pVq30OKzpfI3MKY0JFN3iHuStHIpUVRXSLvnqz2Bp 2gFgMgIgkSdxnfVQWoNKp/YcA8bn5/bGojvPjaOOdhV8qzUCYz+309kPqs6o0/bVMOJj VKjg== X-Gm-Message-State: APjAAAXUOpPbpA4YFeAdZYjHz48LqKe2xsI15YEq2ch2FmkQIbv4aKkY pdxcLzc/rLa98nkDzr3gKh29bdINTCM= X-Google-Smtp-Source: APXvYqwBLFLslo6yDK2Xm8ifrxeoO/3S43hOeDLVez39yPZB0QTsxwkSzw15am2ruw+K+IUiUNrgDA== X-Received: by 2002:ac8:8d6:: with SMTP id y22mr5558448qth.85.1580402718219; Thu, 30 Jan 2020 08:45:18 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 17/21] qemu: hotplug: Prevent updates to multifunction device Date: Thu, 30 Jan 2020 13:44:29 -0300 Message-Id: <20200130164433.2694119-18-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: FrjSzHqzNCSV3I_OYHBUKg-1 X-MC-Unique: MM0lVcPpNi-k9z8hkHuzSw-1 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 00UGjO0s032052 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat PCI hostdevs once part of the domain can't be changed. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_driver.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 95ad4c5e69..5089050328 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8883,6 +8883,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, virDomainObjPtr vm =3D NULL; qemuDomainObjPrivatePtr priv; virDomainDefPtr vmdef =3D NULL; + virDomainDeviceDefListPtr devlist; + virDomainDeviceDefListData data =3D {.xmlopt =3D driver->xmlopt}; virDomainDeviceDefPtr dev =3D NULL, dev_copy =3D NULL; bool force =3D (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) !=3D 0; int ret =3D -1; @@ -8900,6 +8902,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, if (!(vm =3D qemuDomainObjFromDomain(dom))) goto cleanup; =20 + data.def =3D vm->def; + priv =3D vm->privateData; =20 if (virDomainUpdateDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0) @@ -8915,12 +8919,20 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr= dom, !(flags & VIR_DOMAIN_AFFECT_LIVE)) parse_flags |=3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 - dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - driver->xmlopt, priv->qemuCap= s, - parse_flags); - if (dev =3D=3D NULL) + + devlist =3D qemuDomainDeviceParseXMLMany(xml, &data, priv->qemuCaps, + parse_flags); + if (!devlist) goto endjob; =20 + if (devlist->count > 1) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("Update of multifunction devices is not supported= ")); + goto endjob; + } + + dev =3D dev_copy =3D devlist->devs[0]; + if (flags & VIR_DOMAIN_AFFECT_CONFIG && flags & VIR_DOMAIN_AFFECT_LIVE) { /* If we are affecting both CONFIG and LIVE --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402775006291.6986073460074; Thu, 30 Jan 2020 08:46:15 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-150-mFoYRiobODKBuPpPPYimPA-1; Thu, 30 Jan 2020 11:46:07 -0500 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 718DEDB65; Thu, 30 Jan 2020 16:45:59 +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 2A1C97795E; Thu, 30 Jan 2020 16:45: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 C240818034F9; Thu, 30 Jan 2020 16:45:58 +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 00UGjOmE032054 for ; Thu, 30 Jan 2020 11:45:24 -0500 Received: by smtp.corp.redhat.com (Postfix) id 79AF2F89EC; Thu, 30 Jan 2020 16:45:24 +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 74FE8F84D6 for ; Thu, 30 Jan 2020 16:45:24 +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 5565A8EC756 for ; Thu, 30 Jan 2020 16:45:24 +0000 (UTC) Received: from mail-qv1-f68.google.com (mail-qv1-f68.google.com [209.85.219.68]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-357-1yY4bIgpP3mGSCZ6qTs40A-1; Thu, 30 Jan 2020 11:45:20 -0500 Received: by mail-qv1-f68.google.com with SMTP id g6so1806667qvy.5 for ; Thu, 30 Jan 2020 08:45:20 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402773; 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=JCPAPvaRe6eVTENHBS8B4yjKZJPtt2Gblb7mFISRMxI=; b=L3ow9Ds9DMEIoxLnLTP4HyiPz+4BJJ7ywWgENlUha020pCsZKfcZcaBnXbi2Lz7jNlwdZu qPbBNEa6Ond5fi5HI/2ojNKzGq8zUcf8FXZRRNgn0DLt9N/lhreohuLKt7ofwXeLw63MKF yLl+sS8crG7/T1VGiQ/IUtPumpiaxYM= 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=OvxlgTfFBEnskb7rYvC6h/YbKgz6UJXk5F9oG3Gq7Dc=; b=c3/hvyj2ml9iArQOVrEp0JQOQi9ZugH3318jrOvTrUu2LKAlYaN4GyOo2FMBH7KuMh HJ330xPIPYh3gGWIrIaVRSRRy3TwV6QCF41R/ioc7lJ9lIvp8QdWHbXTK9r657fY44Rh mvJUxVKhLPPnMsJGjzX4d5IyaIk6Q8mOyKosHPVb6zAnM/ScfwDAfkpnHSoTNVwgtuQs Nszw0wP6xEV7254Rr7vaS+TpmdO+BVONy9Vzh9o9pNWfbTG16ZR/REevEmR1lvasU0v/ oQPfPEvyuuvl3EALTZk6GKOqCc3v+WjS41nSvT0afCbse4z6glfl5cVeTnaQPAp8fti0 fJ8A== X-Gm-Message-State: APjAAAWhyYQw48ykrFZqccpHpoTnAOGV8Ob73Dx0iL/RUK2Ozu7FXkPr NlAv71MML0pTMzN60f/KR647bRaFcws= X-Google-Smtp-Source: APXvYqzZhDxL2M5wwZfuGC3Qqv7RPMllem9yXsw/cLN6XNN1DOlk8ufrFG5nNZO+dnA6ljOGIthUIg== X-Received: by 2002:a0c:ef0f:: with SMTP id t15mr5609667qvr.123.1580402719951; Thu, 30 Jan 2020 08:45:19 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 18/21] qemu: hotplug: Implement multifunction device unplug Date: Thu, 30 Jan 2020 13:44:30 -0300 Message-Id: <20200130164433.2694119-19-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: 1yY4bIgpP3mGSCZ6qTs40A-1 X-MC-Unique: mFoYRiobODKBuPpPPYimPA-1 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 00UGjOmE032054 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" From: Shivaprasad G Bhat The same design ideas used in multifunction hotplug were used here as well. qemuDomainDetachDeviceConfig() was changed to accept a list of devices instead of a single device definition. qemuDomainDetachDeviceLiveAndConfig() was changed to handle device lists as well. For VIR_DOMAIN_AFFECT_LIVE, check if we're handling a single device unplug (devlist size =3D 1) and forward it to the regular qemuDomainDetachDeviceLive() function. Otherwise, a new qemuDomainDetachMultifunctionDevice() was added to handle the hot-unplug of multifunction devices. DetachMultifunctionDevice() is not considering the new multifunction unplug mechanics for the Pseries guest, present in QEMU 4.2 (the newest release ATM), to not break compatibility with older QEMU versions. This will be done properly in a later patch. Signed-off-by: Shivaprasad G Bhat Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_driver.c | 65 ++++++++++++++------- src/qemu/qemu_hotplug.c | 121 ++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hotplug.h | 5 ++ tests/qemuhotplugtest.c | 30 +++++++--- 4 files changed, 193 insertions(+), 28 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5089050328..9863a7576b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8563,17 +8563,27 @@ qemuDomainDetachDeviceConfigInternal(virDomainDefPt= r vmdef, =20 static int qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, - virDomainDeviceDefPtr dev, + virDomainDeviceDefListPtr devlist, virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) { - if (qemuDomainDetachDeviceConfigInternal(vmdef, dev)) - return -1; + size_t i; + + for (i =3D 0; i < devlist->count; i++) { + if (qemuDomainDetachDeviceConfigInternal(vmdef, devlist->devs[i])) + return -1; + } =20 if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, qemuCaps) < 0) return -1; =20 + /* Don't allow removing the primary function alone for a + * multifunction device (devlist->count greater than 1) + * leading to guest start failure later. */ + if (devlist->count > 1 && qemuDomainDefValidatePCIHostdevs(vmdef) < 0) + return -1; + return 0; } =20 @@ -9006,7 +9016,9 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, { qemuDomainObjPrivatePtr priv =3D vm->privateData; g_autoptr(virQEMUDriverConfig) cfg =3D NULL; - virDomainDeviceDefPtr dev =3D NULL, dev_copy =3D NULL; + virDomainDeviceDefListPtr devlist =3D NULL, devcopylist =3D NULL; + virDomainDeviceDefListData data =3D {.def =3D vm->def, + .xmlopt =3D driver->xmlopt}; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; virDomainDefPtr vmdef =3D NULL; int ret =3D -1; @@ -9020,11 +9032,11 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPt= r driver, !(flags & VIR_DOMAIN_AFFECT_LIVE)) parse_flags |=3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 - dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - driver->xmlopt, priv->qemuCap= s, - parse_flags); - if (dev =3D=3D NULL) + devlist =3D qemuDomainDeviceParseXMLMany(xml, &data, + priv->qemuCaps, parse_flags); + if (!devlist) goto cleanup; + devcopylist =3D devlist; =20 if (flags & VIR_DOMAIN_AFFECT_CONFIG && flags & VIR_DOMAIN_AFFECT_LIVE) { @@ -9032,9 +9044,9 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, * create a deep copy of device as adding * to CONFIG takes one instance. */ - dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, - driver->xmlopt, priv->qemuCaps); - if (!dev_copy) + devcopylist =3D virDomainDeviceDefListCopy(devlist, &data, + priv->qemuCaps); + if (!devcopylist) goto cleanup; } =20 @@ -9044,7 +9056,7 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, if (!vmdef) goto cleanup; =20 - if (qemuDomainDetachDeviceConfig(vmdef, dev, priv->qemuCaps, + if (qemuDomainDetachDeviceConfig(vmdef, devlist, priv->qemuCaps, parse_flags, driver->xmlopt) < 0) goto cleanup; @@ -9053,7 +9065,13 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr= driver, if (flags & VIR_DOMAIN_AFFECT_LIVE) { int rc; =20 - if ((rc =3D qemuDomainDetachDeviceLive(vm, dev_copy, driver, false= )) < 0) + if (devlist->count > 1) { + if ((rc =3D qemuDomainDetachMultifunctionDevice(vm, devlist, d= river)) < 0) + goto cleanup; + } else if ((rc =3D qemuDomainDetachDeviceLive(vm, + devcopylist->devs[0], + driver, + false)) < 0) goto cleanup; =20 if (rc =3D=3D 0 && qemuDomainUpdateDeviceList(driver, vm, QEMU_ASY= NC_JOB_NONE) < 0) @@ -9080,9 +9098,9 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, ret =3D 0; =20 cleanup: - if (dev !=3D dev_copy) - virDomainDeviceDefFree(dev_copy); - virDomainDeviceDefFree(dev); + if (devlist !=3D devcopylist) + virDomainDeviceDefListFree(devcopylist); + virDomainDeviceDefListFree(devlist); virDomainDefFree(vmdef); return ret; } @@ -9100,6 +9118,7 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDrive= rPtr driver, virDomainDefPtr persistentDef =3D NULL; virDomainDefPtr vmdef =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; + virDomainDeviceDefListPtr devlist =3D NULL; int ret =3D -1; =20 virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -9115,16 +9134,22 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDri= verPtr driver, goto cleanup; =20 if (persistentDef) { - virDomainDeviceDef dev; + virDomainDeviceDefPtr dev; =20 if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, driver->xmlopt, priv->qemuCaps))) goto cleanup; =20 - if (virDomainDefFindDevice(vmdef, alias, &dev, true) < 0) + if (virDomainDefFindDevice(vmdef, alias, dev, true) < 0) + goto cleanup; + + if (VIR_ALLOC(devlist) < 0) goto cleanup; =20 - if (qemuDomainDetachDeviceConfig(vmdef, &dev, priv->qemuCaps, + if (VIR_APPEND_ELEMENT(devlist->devs, devlist->count, dev) < 0) + goto cleanup; + + if (qemuDomainDetachDeviceConfig(vmdef, devlist, priv->qemuCaps, parse_flags, driver->xmlopt) < 0) goto cleanup; } @@ -9153,6 +9178,8 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDrive= rPtr driver, ret =3D 0; cleanup: virDomainDefFree(vmdef); + virDomainDeviceDefListFree(devlist); + return ret; } =20 diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 495a5c9bdd..deeb94fe79 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -5995,6 +5995,127 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, } =20 =20 +int +qemuDomainDetachMultifunctionDevice(virDomainObjPtr vm, + virDomainDeviceDefListPtr devlist, + virQEMUDriverPtr driver) +{ + size_t i; + int ret =3D -1; + virBitmapPtr tbdmap =3D NULL, onlinemap =3D NULL; + int *functions =3D NULL; + virDomainHostdevDefPtr hostdev, detach =3D NULL; + virDomainHostdevSubsysPtr subsys =3D NULL; + int slotaggridx =3D 0; + virDomainHostdevSubsysPCIPtr pcisrc =3D NULL; + qemuDomainObjPrivatePtr priv =3D vm->privateData; + + qsort(devlist->devs, devlist->count, sizeof(*devlist->devs), + qemuiHostdevPCIMultifunctionDevicesListSort); + +#define FOR_EACH_DEV_IN_DEVLIST() \ + for (i =3D 0; i < devlist->count; i++) { \ + hostdev =3D devlist->devs[i]->data.hostdev; \ + subsys =3D &hostdev->source.subsys; \ + pcisrc =3D &subsys->u.pci; \ + virDomainHostdevFind(vm->def, hostdev, &detach); + + FOR_EACH_DEV_IN_DEVLIST() + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hot unplug is not supported for hostdev mode= '%s'"), + virDomainHostdevModeTypeToString(hostdev->mode)= ); + goto cleanup; + } + } + + FOR_EACH_DEV_IN_DEVLIST() + if (!detach) { + virReportError(VIR_ERR_DEVICE_MISSING, + _("host pci device %.4x:%.2x:%.2x.%.1x not foun= d"), + pcisrc->addr.domain, pcisrc->addr.bus, + pcisrc->addr.slot, pcisrc->addr.function); + goto cleanup; + } + } + + /* Check if the devices belong to same guest slot.*/ + FOR_EACH_DEV_IN_DEVLIST() + /* Pick one aggregateSlotIdx and compare against rest of them */ + slotaggridx =3D slotaggridx ? slotaggridx : detach->info->aggregat= eSlotIdx; + if (slotaggridx !=3D detach->info->aggregateSlotIdx) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("host pci device %.4x:%.2x:%.2x.%.1x does " + "not belong to same slot"), + pcisrc->addr.domain, + pcisrc->addr.bus, + pcisrc->addr.slot, + pcisrc->addr.function); + goto cleanup; + } + } + + /* Check if the whole slot is being removed or not */ + onlinemap =3D virDomainDefHostdevGetPCIOnlineFunctionMap(vm->def, slot= aggridx); + FOR_EACH_DEV_IN_DEVLIST() + ignore_value(virBitmapClearBit(onlinemap, pcisrc->addr.function)); + } + + if (!virBitmapIsAllClear(onlinemap)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("hot unplug of partial PCI slot not allowed")); + goto cleanup; + } + + /* Mark all aliases for removal */ + memset(&priv->unplug, 0, sizeof(priv->unplug)); + FOR_EACH_DEV_IN_DEVLIST() + if (qemuAssignDeviceHostdevAlias(vm->def, &detach->info->alias, -1= ) < 0) + goto reset; + + qemuDomainMarkDeviceAliasForRemoval(vm, detach->info->alias, false= ); + } + + qemuDomainObjEnterMonitor(driver, vm); + + /* must plug non-zero first, zero at last */ + for (i =3D devlist->count; i > 0; i--) { + hostdev =3D devlist->devs[i -1]->data.hostdev; + subsys =3D &hostdev->source.subsys; + pcisrc =3D &subsys->u.pci; + virDomainHostdevFind(vm->def, hostdev, &detach); + + if (qemuMonitorDelDevice(priv->mon, detach->info->alias) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + if (virDomainObjIsActive(vm)) + virDomainAuditHostdev(vm, detach, "detach", false); + goto reset; + } + if (ARCH_IS_X86(vm->def->os.arch)) + break; /* deleting any one is enough! */ + } + + if (qemuDomainObjExitMonitor(driver, vm) < 0) + ret =3D -1; + + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) { + FOR_EACH_DEV_IN_DEVLIST() + ret =3D qemuDomainRemoveHostDevice(driver, vm, detach); + } + } + reset: + qemuDomainResetDeviceRemoval(vm); + cleanup: + VIR_FREE(functions); + virBitmapFree(onlinemap); + virBitmapFree(tbdmap); + +#undef FOR_EACH_DEV_IN_DEVLIST + + return ret; +} + + static int qemuDomainRemoveVcpu(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 9fd262a81b..072984ddf8 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -131,6 +131,11 @@ qemuDomainAttachMultifunctionDevice(virDomainObjPtr vm, virDomainDeviceDefListPtr devlist, virQEMUDriverPtr driver); =20 +int +qemuDomainDetachMultifunctionDevice(virDomainObjPtr vm, + virDomainDeviceDefListPtr devlist, + virQEMUDriverPtr driver); + int qemuDomainChrInsert(virDomainDefPtr vmdef, virDomainChrDefPtr chr); diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 9c84b639a6..ffd91b5250 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -156,10 +156,15 @@ testQemuHotplugAttach(virDomainObjPtr vm, =20 static int testQemuHotplugDetach(virDomainObjPtr vm, - virDomainDeviceDefPtr dev, + virDomainDeviceDefListPtr devlist, bool async) { int ret =3D -1; + virDomainDeviceDefPtr dev; + + if (devlist->count > 1) + return qemuDomainDetachMultifunctionDevice(vm, devlist, &driver); + dev =3D devlist->devs[0]; =20 switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: @@ -249,7 +254,6 @@ testQemuHotplug(const void *data) bool keep =3D test->keep; unsigned int device_parse_flags =3D 0; virDomainObjPtr vm =3D NULL; - virDomainDeviceDefPtr dev =3D NULL; /* temporary */ virDomainDeviceDefListPtr devlist =3D NULL; virDomainDeviceDefListData listdata; virCapsPtr caps =3D NULL; @@ -296,8 +300,6 @@ testQemuHotplug(const void *data) if (!devlist) goto cleanup; =20 - dev =3D devlist->devs[0]; /* temporary */ - /* Now is the best time to feed the spoofed monitor with predefined * replies. */ if (!(test_mon =3D qemuMonitorTestNew(driver.xmlopt, vm, &driver, @@ -338,14 +340,15 @@ testQemuHotplug(const void *data) break; =20 case DETACH: - ret =3D testQemuHotplugDetach(vm, dev, false); + ret =3D testQemuHotplugDetach(vm, devlist, false); + if (ret =3D=3D 0 || fail) ret =3D testQemuHotplugCheckResult(vm, domain_xml, domain_filename, fail); break; =20 case UPDATE: - ret =3D testQemuHotplugUpdate(vm, dev); + ret =3D testQemuHotplugUpdate(vm, devlist->devs[0]); } =20 cleanup: @@ -829,17 +832,26 @@ mymain(void) "device_add", QMP_OK); DO_TEST_DETACH("pseries-base-live", "hostdev-pci", false, false, "device_del", QMP_DEVICE_DELETED("hostdev0") QMP_OK); - DO_TEST_ATTACH("base-live", "multifunction-hostdev-pci", false, false, + DO_TEST_ATTACH("base-live", "multifunction-hostdev-pci", false, true, "device_add", QMP_OK, "device_add", QMP_OK, "device_add", QMP_OK, "device_add", QMP_OK); + DO_TEST_DETACH("base-live", "multifunction-hostdev-pci", false, false, + "device_del", QMP_DEVICE_DELETED("hostdev3") + QMP_DEVICE_DELETED("hostdev2") + QMP_DEVICE_DELETED("hostdev1") + QMP_DEVICE_DELETED("hostdev0") QMP_OK); =20 qemuTestSetHostArch(&driver, VIR_ARCH_PPC64); - DO_TEST_ATTACH("pseries-base-live", "multifunction-hostdev-pci-2", fal= se, false, - "device_add", QMP_OK, + DO_TEST_ATTACH("pseries-base-live", "multifunction-hostdev-pci-2", fal= se, true, "device_add", QMP_OK, "device_add", QMP_OK); + DO_TEST_DETACH("pseries-base-live", "multifunction-hostdev-pci-2", fal= se, false, + "device_del", QMP_OK, + "device_del", QMP_DEVICE_DELETED("hostdev1") + QMP_DEVICE_DELETED("hostdev0") QMP_OK); + qemuTestSetHostArch(&driver, VIR_ARCH_X86_64); =20 DO_TEST_ATTACH("base-live", "watchdog", false, true, --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1580402776130603.1996714654354; Thu, 30 Jan 2020 08:46:16 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-159-HHrUQxVkOmCJlI-kihUV6Q-1; Thu, 30 Jan 2020 11:46:01 -0500 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 1D6E0802564; Thu, 30 Jan 2020 16:45: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 DE3001001925; Thu, 30 Jan 2020 16:45:51 +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 88C6887A96; Thu, 30 Jan 2020 16:45:51 +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 00UGjOhR032053 for ; Thu, 30 Jan 2020 11:45:24 -0500 Received: by smtp.corp.redhat.com (Postfix) id 753212033956; Thu, 30 Jan 2020 16:45:24 +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 705E62093CCD for ; Thu, 30 Jan 2020 16:45:24 +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 5416110119FD for ; Thu, 30 Jan 2020 16:45:24 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-9-VPSNxHSkO1633F2RnBZSiA-1; Thu, 30 Jan 2020 11:45:22 -0500 Received: by mail-qt1-f195.google.com with SMTP id c5so2979798qtj.6 for ; Thu, 30 Jan 2020 08:45:21 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402775; 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=6+YCHVzNQkr2NlF9ofheBbacGSC+0mrZ8beVTW5lUh0=; b=Mm/o3HK2OCdFfIACyzTV6KqT+hLj7BpU40voipyut1Y/0Ppx0sWNP6tAmU3SlY2iiQqNyd DhiEi8/m/WLy9KS1d+HzaYI86vWHdpayjVgSRADFUPZARRJZqLDtcp0b2waLDUgkdJoU+n JYS4GSd/c0o9pXX9oXq9I/7Izu1KROA= 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=flA/awNoffDTokyXlX0wEsu1NZ8Rit94uHZQEDIFEBY=; b=QzNyhtgLDXlW9kuwddnOvD1BxZRCDUn0hGVEvkTEmphpOVvp4UGag2JnoXPqJoRN8h KxCf4O2V1DZ0gF3JnqGCKISnGk784ssa6DFfU+J4Wmxx4GDPOw4C/JTMiNQYu+F+ypTc bc4nUwKFjgFPxRLF2T05s5ro5CIPiYBwlUJPZsc8Yo3VtN5iOw8LCU7wXMDfXY/c+5tz ++4or24rzqR7smqhMeuetW1lU4WIt0/NPIalPFd565jBjLCr6KdQHgiconQcco+qpdzA S+/zgZUTcmt/HfCXJQFAzZra/3dSszAQaTk9I0NwAt5BIsmvjiagoyukhUWsCaAZschA SeDA== X-Gm-Message-State: APjAAAVVAezpNiGD86pzAzWTATspTHIzyv6/5IhIFGV3PLndCz9xgube NHd9avDx7IMVBzYxQOiLk9Vt6J5SxLc= X-Google-Smtp-Source: APXvYqzT+y+OQBYaNVyzzfo0n21sRXSUUYaZ1fWK1y8COhV+wUFxj7KT5SoXlXcSpdkCs8m2uG+vqQ== X-Received: by 2002:ac8:7103:: with SMTP id z3mr5874655qto.172.1580402721286; Thu, 30 Jan 2020 08:45:21 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 19/21] qemu_hotplug.c: tune unplugTimeout for multifunction detach Date: Thu, 30 Jan 2020 13:44:31 -0300 Message-Id: <20200130164433.2694119-20-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: VPSNxHSkO1633F2RnBZSiA-1 X-MC-Unique: HHrUQxVkOmCJlI-kihUV6Q-1 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 00UGjOhR032053 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" In a multifunction hot-unplug, QEMU will unplug all the functions in a single detach operation, sequentially, triggered by the detach of function zero for Pseries guests or any function for x86 guests. This impacts the amount of timeout we're supposed to wait - an unplug operation with 4 hostdevs will naturally take longer than a single hostdev unplug. The previous existing timeout wasn't enough to handle this multifunction detach case, timing out the detach operation needlessly. This patch handles it by adding a new qemuDomainWaitForMultipleDeviceRemoval function that considers the number of naliases to be unplugged when calculating unplugTimeout. Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_hotplug.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index deeb94fe79..fe823bb910 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -5216,15 +5216,21 @@ qemuDomainGetUnplugTimeout(virDomainObjPtr vm) * - we failed to reliably wait for the event and thus use fallback b= ehavior */ static int -qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm) +qemuDomainWaitForMultipleDeviceRemoval(virDomainObjPtr vm, + bool isMultiFunctionDevice) { qemuDomainObjPrivatePtr priv =3D vm->privateData; - unsigned long long until; + unsigned long long until, waitTime; int rc; =20 if (virTimeMillisNow(&until) < 0) return 1; - until +=3D qemuDomainGetUnplugTimeout(vm); + + waitTime =3D qemuDomainGetUnplugTimeout(vm); + if (isMultiFunctionDevice) + waitTime *=3D priv->unplug.naliases; + + until +=3D waitTime; =20 /* All devices should get released around same time*/ while (priv->unplug.naliases) { @@ -5247,6 +5253,17 @@ qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm) return 1; } =20 +/* For a single device, call qemuDomainWaitForMultipleDeviceRemoval with + * isMultiFunctionDevice =3D false. + * + * Returns: same values as qemuDomainWaitForMultipleDeviceRemoval. + */ +static int +qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm) +{ + return qemuDomainWaitForMultipleDeviceRemoval(vm, false); +} + /* Returns: * true there was a thread waiting for devAlias to be removed and this * thread will take care of finishing the removal @@ -6098,7 +6115,7 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr v= m, if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -1; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) { + if ((ret =3D qemuDomainWaitForMultipleDeviceRemoval(vm, true)) =3D=3D = 1) { FOR_EACH_DEV_IN_DEVLIST() ret =3D qemuDomainRemoveHostDevice(driver, vm, detach); } --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1580402777325444.5788125025356; Thu, 30 Jan 2020 08:46:17 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-427-NC6d5FRiMTeKL-VYFwOahw-1; Thu, 30 Jan 2020 11:46:13 -0500 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 C10741005F73; Thu, 30 Jan 2020 16:46:03 +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 830FD845A9; Thu, 30 Jan 2020 16:46:03 +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 2A17F18034FB; Thu, 30 Jan 2020 16:46:03 +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 00UGjQvF032071 for ; Thu, 30 Jan 2020 11:45:26 -0500 Received: by smtp.corp.redhat.com (Postfix) id 2D99A2166B2C; Thu, 30 Jan 2020 16:45:26 +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 28D9E2166B2B for ; Thu, 30 Jan 2020 16:45:26 +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 0AAA28013A3 for ; Thu, 30 Jan 2020 16:45:26 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-336-65m3OLW5MuuPnT8CCYOtQw-1; Thu, 30 Jan 2020 11:45:23 -0500 Received: by mail-qt1-f195.google.com with SMTP id v25so2979606qto.7 for ; Thu, 30 Jan 2020 08:45:23 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402776; 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=huDQ9uyWM+tigPfSB5Bo451bvh1zfyprrs+aTAEU7wg=; b=M1UFctkOiF9ddLIjbEJUAe5hp/xrZj0TKZYAiRol7gXZtGGnXJlUMjB2I1huFJUCKUmUp2 +drxHjjt4IsxMNvvWNdpBGEM6rsRB4fYfkdU9pL3jk0Aft9lm+7l5tlERHE3LGyTT/VTn0 dZFuAMqvidRyNHRQHHTpTzN+EUvVjP0= 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=iOaCJpVUx+Jo3G9dTiRlvHHQgpGm7rz0zARU1duscVw=; b=GKq/j4vFG5Pt6zz8quu9QrA/rpjk0lCRbh4yeVSToLgM8TuKFoZtnmNkyxmt0W3VXj q/rfE0YfbvN9rEGfVD3bzcE46V5fPC4JH1ycEjmfaBkkMjKbC+ptTd1JUajV1xFF54/c Pkhyza8J22p0lbJXky61xXw0DM60UecnJtow8KOq/9/uXP4R7xCjJmbuwo3UUnV80S5t /o3XtgceoB255OVxk+MmEqJK7xejfVOnIoqkKZvtkOTcTaaxXGkbGETgfA50HkVLCwny R53iqU/g4GxQgain3QdCPDFUW4fNC9Yx8EjuyQBeHYu7sFxdSKI0DKF+jOd/gJiG4HOd xAFQ== X-Gm-Message-State: APjAAAWusPc4RD5pvFRyr46DokNld7raXNCMcGovsypP9f+JPIe7zF40 bh3RIyuefj9uLp0JG4gjAuiVjqz6azw= X-Google-Smtp-Source: APXvYqxZPyVHy8Ka18B0OY6hALLjzQqFXBNckXS6R+xely9T8gKZB2WwuTvl7NVbqRJfWMkWKXjXxQ== X-Received: by 2002:ac8:1e90:: with SMTP id c16mr5776116qtm.265.1580402722804; Thu, 30 Jan 2020 08:45:22 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 20/21] qemu_hotplug: do not hotplug/hotunplug 'unassigned' hostdevs Date: Thu, 30 Jan 2020 13:44:32 -0300 Message-Id: <20200130164433.2694119-21-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: 65m3OLW5MuuPnT8CCYOtQw-1 X-MC-Unique: NC6d5FRiMTeKL-VYFwOahw-1 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 00UGjQvF032071 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" The new address type 'unassigned' allows for a hostdev to be managed by Libvirt, but not be assigned for guest usage. This can allow us to execute PCI multifunction hotplug, with managed mode, leaving non-zero functions unassigned. For hotplug and unplug , we'll skip unassigned devices when setting or evaluating aggregateSlotIdx and when we're about to execute device_add/device_del in QEMU. For hotplug we'll also skip adress assignment. For unplug we won't mark the device for removal since we won't be executing device_del on it. Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_domain_address.c | 6 ++ src/qemu/qemu_hotplug.c | 16 ++++ tests/qemuhotplugtest.c | 9 ++ ...plug-multifunction-hostdev-pci-partial.xml | 27 ++++++ ...live+multifunction-hostdev-pci-partial.xml | 82 +++++++++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-multifunction-= hostdev-pci-partial.xml create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-base-live+mult= ifunction-hostdev-pci-partial.xml diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 395f054b8d..c8fe6bbd64 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -3511,6 +3511,9 @@ qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(v= irDomainObjPtr vm, for (i =3D 0; i < devlist->count; i++) { virDomainHostdevDefPtr hostdev =3D devlist->devs[i]->data.hostdev; =20 + if (hostdev->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNAS= SIGNED) + continue; + if (qemuDomainIsPSeries(vm->def)) { /* Isolation groups are only relevant for pSeries guests */ if (qemuDomainFillDeviceIsolationGroup(vm->def, devlist->devs[= i]) < 0) @@ -3544,6 +3547,9 @@ qemuDomainPCIMultifunctionHostdevEnsurePCIAddresses(v= irDomainObjPtr vm, virDomainHostdevDefPtr hostdev =3D devlist->devs[i]->data.hostdev; virPCIDeviceAddress addr =3D hostdev->source.subsys.u.pci.addr; =20 + if (hostdev->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNAS= SIGNED) + continue; + devinfos->infos[addr.function] =3D hostdev->info; } =20 diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index fe823bb910..00bd5499fe 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1629,6 +1629,13 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr drive= r, goto error; } =20 + /* For an unassigned hostdev, add it to the domain definition + * and return without hotplugging it to QEMU. */ + if (hostdev->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGN= ED) { + vm->def->hostdevs[vm->def->nhostdevs++] =3D hostdev; + return 0; + } + if (!(devstr =3D qemuBuildPCIHostdevDevStr(vm->def, hostdev, 0, priv->= qemuCaps))) goto error; =20 @@ -6058,6 +6065,9 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr v= m, =20 /* Check if the devices belong to same guest slot.*/ FOR_EACH_DEV_IN_DEVLIST() + if (detach->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASS= IGNED) + continue; + /* Pick one aggregateSlotIdx and compare against rest of them */ slotaggridx =3D slotaggridx ? slotaggridx : detach->info->aggregat= eSlotIdx; if (slotaggridx !=3D detach->info->aggregateSlotIdx) { @@ -6090,6 +6100,9 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr v= m, if (qemuAssignDeviceHostdevAlias(vm->def, &detach->info->alias, -1= ) < 0) goto reset; =20 + if (detach->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASS= IGNED) + continue; + qemuDomainMarkDeviceAliasForRemoval(vm, detach->info->alias, false= ); } =20 @@ -6102,6 +6115,9 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr v= m, pcisrc =3D &subsys->u.pci; virDomainHostdevFind(vm->def, hostdev, &detach); =20 + if (detach->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASS= IGNED) + continue; + if (qemuMonitorDelDevice(priv->mon, detach->info->alias) < 0) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); if (virDomainObjIsActive(vm)) diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index ffd91b5250..50e4bd535b 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -843,6 +843,15 @@ mymain(void) QMP_DEVICE_DELETED("hostdev1") QMP_DEVICE_DELETED("hostdev0") QMP_OK); =20 + DO_TEST_ATTACH("base-live", "multifunction-hostdev-pci-partial", false= , true, + "device_add", QMP_OK, + "device_add", QMP_OK, + "device_add", QMP_OK); + DO_TEST_DETACH("base-live", "multifunction-hostdev-pci-partial", false= , false, + "device_del", QMP_DEVICE_DELETED("hostdev3") + QMP_DEVICE_DELETED("hostdev2") + QMP_DEVICE_DELETED("hostdev0") QMP_OK); + qemuTestSetHostArch(&driver, VIR_ARCH_PPC64); DO_TEST_ATTACH("pseries-base-live", "multifunction-hostdev-pci-2", fal= se, true, "device_add", QMP_OK, diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev= -pci-partial.xml b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-h= ostdev-pci-partial.xml new file mode 100644 index 0000000000..5e01564d2b --- /dev/null +++ b/tests/qemuhotplugtestdevices/qemuhotplug-multifunction-hostdev-pci-pa= rtial.xml @@ -0,0 +1,27 @@ + + + + +
+ + + + + +
+ +
+ + + + +
+ + + + + +
+ + + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+multifuncti= on-hostdev-pci-partial.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-= live+multifunction-hostdev-pci-partial.xml new file mode 100644 index 0000000000..1808a0071e --- /dev/null +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+multifunction-host= dev-pci-partial.xml @@ -0,0 +1,82 @@ + + hotplug + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + + + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + + --=20 2.24.1 From nobody Mon May 6 22:02:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580402771986887.8265302468297; Thu, 30 Jan 2020 08:46:11 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-364-Phd_qdMJP3CHBGoSmhUHWg-1; Thu, 30 Jan 2020 11:46:05 -0500 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 07A98100551B; Thu, 30 Jan 2020 16:45: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 B275188847; Thu, 30 Jan 2020 16:45:55 +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 7221718034ED; Thu, 30 Jan 2020 16:45:55 +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 00UGjR2i032083 for ; Thu, 30 Jan 2020 11:45:27 -0500 Received: by smtp.corp.redhat.com (Postfix) id B18BF2166B2C; Thu, 30 Jan 2020 16:45:27 +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 AD7F42166B27 for ; Thu, 30 Jan 2020 16:45:27 +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 94244803B5C for ; Thu, 30 Jan 2020 16:45:27 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-310-v2k1PT7MMTq86XyJBNlKgg-1; Thu, 30 Jan 2020 11:45:25 -0500 Received: by mail-qt1-f195.google.com with SMTP id w8so2954971qts.11 for ; Thu, 30 Jan 2020 08:45:24 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c7:c177:887c:ce1b:6a44:15ec]) by smtp.gmail.com with ESMTPSA id 135sm3007157qkj.55.2020.01.30.08.45.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2020 08:45:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580402770; 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=Hsp1YljiZ17SvctLcn/Uz+kZddXp8RSMKfpBty+JVkk=; b=AbFe9ZAq+vuj9Z+VEBpJCc6TS0RXLf3TdEUwNI+PHe+ZfuU9nH3z4UJeiVuXHP7P1o5z7D wa35qD1KmJCM9L37DO3QJbZG50yGqadUiyDNuJQw3jvxbvChqMuqo4gyu4kVcU8KXaG97i 0izbdsPG6gUCWT5qPhPHq7IWLo4Ciaw= 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=uchFfOABKq0hRyg1by9mrhtw4DH8xJFVSVAcnH1S+e4=; b=gjUNP7PB3h+zP36ZjHchqnLhCy31aRyNkbkDXke1hhgJ5hsjcIG/NCtgTRpmUvVw3i X9sDcoCU31OggCJ6nUgC/eUBSWbG991N0OShrVQwkKYH5qWJG5pTsTEVoc6NVVMfhTgz F2LH96emnA6D/CS73Ou9BywdAtDqAgVmvg/nLaLZ7BEVRVaFYQaHgzaZNRoBkD+VhaGb Q1tBWCGfxCerJibjN/Sp6mOwNWrqPmvOGjN+RUaRpcpPuSlG803mXXGFwAhFJzhmVyER R9X6B8tbu9A/s2wrMQ8Eu2J5FVzegKk+CuvJ9sniK8uEcNjfxIf3+40uA+bh5wBbWa57 GAIA== X-Gm-Message-State: APjAAAXMSJ/9jmJM+jFCdZ6+KA+c629rkwOp/rTJsuF+lN1FJ1R4wwC6 ILRUzx9sX+c9AQE8uuCs9vsPmx8ugHI= X-Google-Smtp-Source: APXvYqw6UTonm+JU2TxGg47NeDr5mDbI7fkFROBIrtIiMoyfQk594yqTQosGKG7Ph4Twf9TBQBFALA== X-Received: by 2002:aed:2022:: with SMTP id 31mr5530869qta.321.1580402724401; Thu, 30 Jan 2020 08:45:24 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH v2 21/21] qemu_hotplug.c: use enhanced multifunction unplug if available Date: Thu, 30 Jan 2020 13:44:33 -0300 Message-Id: <20200130164433.2694119-22-danielhb413@gmail.com> In-Reply-To: <20200130164433.2694119-1-danielhb413@gmail.com> References: <20200130164433.2694119-1-danielhb413@gmail.com> MIME-Version: 1.0 X-MC-Unique: v2k1PT7MMTq86XyJBNlKgg-1 X-MC-Unique: Phd_qdMJP3CHBGoSmhUHWg-1 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 00UGjR2i032083 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , sbhat@linux.ibm.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" QEMU 4.2.0 introduced an enhanced version of the PCI multifunction hotunplug for the PSeries guest [1] where a single device_del of the function 0 will detach all the functions of the slot. The idea is to make this option similar to the behavior we already have on x86. This means that the unplug code in qemuDomainDetachMultifunctionDevice() can be simplified if the domain is running with QEMU 4.2.0 or newer. [1] https://github.com/qemu/qemu/commit/02a1536eee333123c7735cd36484da53b86= 0fbb7 Signed-off-by: Daniel Henrique Barboza --- src/qemu/qemu_hotplug.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 00bd5499fe..567b9aba03 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -6033,6 +6033,7 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr v= m, int slotaggridx =3D 0; virDomainHostdevSubsysPCIPtr pcisrc =3D NULL; qemuDomainObjPrivatePtr priv =3D vm->privateData; + int pSeriesEnhancedUnplugVersion; =20 qsort(devlist->devs, devlist->count, sizeof(*devlist->devs), qemuiHostdevPCIMultifunctionDevicesListSort); @@ -6108,15 +6109,16 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr= vm, =20 qemuDomainObjEnterMonitor(driver, vm); =20 - /* must plug non-zero first, zero at last */ - for (i =3D devlist->count; i > 0; i--) { - hostdev =3D devlist->devs[i -1]->data.hostdev; - subsys =3D &hostdev->source.subsys; - pcisrc =3D &subsys->u.pci; - virDomainHostdevFind(vm->def, hostdev, &detach); + /* QEMU 4.2.0 introduced a new Pseries hotunplug mechanic, where + * the whole slot can be unplugged by hotunplugging function zero + * (see QEMU commit 02a1536eee for details). This makes it similar + * to what x86 does, as long as we hotunplug function zero first + * in all cases. */ + pSeriesEnhancedUnplugVersion =3D 4 * 1000000 + 2 * 1000; =20 - if (detach->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASS= IGNED) - continue; + if (virQEMUCapsGetVersion(priv->qemuCaps) >=3D pSeriesEnhancedUnplugVe= rsion) { + hostdev =3D devlist->devs[0]->data.hostdev; + virDomainHostdevFind(vm->def, hostdev, &detach); =20 if (qemuMonitorDelDevice(priv->mon, detach->info->alias) < 0) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); @@ -6124,8 +6126,25 @@ qemuDomainDetachMultifunctionDevice(virDomainObjPtr = vm, virDomainAuditHostdev(vm, detach, "detach", false); goto reset; } - if (ARCH_IS_X86(vm->def->os.arch)) - break; /* deleting any one is enough! */ + } else { + /* We're running in an older QEMU, so we must plug non-zero first, + * zero at last. */ + for (i =3D devlist->count; i > 0; i--) { + hostdev =3D devlist->devs[i -1]->data.hostdev; + virDomainHostdevFind(vm->def, hostdev, &detach); + + if (detach->info->type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_U= NASSIGNED) + continue; + + if (qemuMonitorDelDevice(priv->mon, detach->info->alias) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + if (virDomainObjIsActive(vm)) + virDomainAuditHostdev(vm, detach, "detach", false); + goto reset; + } + if (ARCH_IS_X86(vm->def->os.arch)) + break; /* deleting any one is enough! */ + } } =20 if (qemuDomainObjExitMonitor(driver, vm) < 0) --=20 2.24.1