From nobody Sat May 11 05:20:30 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (BodyHash is different from the expected one); dmarc=fail(p=quarantine dis=quarantine) header.from=jaguarmicro.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 171094312436075.19560916580178; Wed, 20 Mar 2024 06:58:44 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DAD341E68; Wed, 20 Mar 2024 09:58:42 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 819A91E67; Wed, 20 Mar 2024 09:56:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 7BE861C3D; Wed, 20 Mar 2024 09:18:30 -0400 (EDT) Received: from HK3PR03CU002.outbound.protection.outlook.com (mail-eastasiaazon11021007.outbound.protection.outlook.com [52.101.128.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id C02561C30 for ; Wed, 20 Mar 2024 09:18:27 -0400 (EDT) Received: from SI2PR06MB4396.apcprd06.prod.outlook.com (2603:1096:4:153::10) by KL1PR06MB5994.apcprd06.prod.outlook.com (2603:1096:820:d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7386.30; Wed, 20 Mar 2024 13:18:19 +0000 Received: from SI2PR06MB4396.apcprd06.prod.outlook.com ([fe80::d509:137b:d4a1:c159]) by SI2PR06MB4396.apcprd06.prod.outlook.com ([fe80::d509:137b:d4a1:c159%7]) with mapi id 15.20.7386.025; Wed, 20 Mar 2024 13:18:18 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=FORGED_SPF_HELO, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BYY/cK2LN4mYwiaQDc5tsr0F0rgm/vWy1VllidCoQzu8s2EGUj8XeY0EqKZpM91Yf4OCXLdFpRpAW+sVeJQO8xbtUVJU/skOnXJXRd/ECjnMoLX/TbvYnu0+0bbEGORnuKXwvHjJvzwvG7+aK9W3zzn25EIOy1/YEd1n03nDlhev4Hh/LEU9Uh2p4jcGeoQUloDs8iHKHMQH6lorMSCdjVfC5jiJCH5mpf8RIj9SVJAWLLWtqKkaMunXzOaoi10tyilNxMlIkgADiwtGgHipJPklZYfPEOHec+wWy4qiUvhFf7WH7ZTHJTw1LKP33evmLTDBVNxr4m5+CgWMnsl8FQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3vphSCLtTcnWlILR+Fbwd9tzXzZGQZIgasbcC6RpZeM=; b=kipVW2F5YrkNjEGenA/bOmmN/rGLWZpLKWL720RNj7Xjy3+Lt31dbhA4FY9C/76iOdc2JM46O4DennK02N5S5nlBwAPw9NL9QJCJ1RmGUgJbu5IXwULx0Kk2DhvVTW5M5BFj+EfOu6FZecqXfqaITiyPkavgYQd8K51/gHCA3OFz20pzk1Sr7ojXeGCure5kJkcthUbP6zvvzbZRbtewKFPA6z//zpN5SugYj525y3ItJB8HX+V/Vneo80OKcwrKrQETn+vhBW0CRrn9lnGsAr2dBKDSsZsBHEUHaRMP00JtZPulHbUKWL3lgpV9rhlL70YcEc/qU4T93hxWZWt2xA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=jaguarmicro.com; dmarc=pass action=none header.from=jaguarmicro.com; dkim=pass header.d=jaguarmicro.com; arc=none From: Yunfeng Qi To: devel@lists.libvirt.org Subject: [PATCH] qemu: Support vhost-vdpa-device. Date: Wed, 20 Mar 2024 21:18:27 +0800 Message-Id: <20240320131827.5801-1-yunfeng.qi@jaguarmicro.com> X-Mailer: git-send-email 2.25.1 X-ClientProxiedBy: SG2PR02CA0037.apcprd02.prod.outlook.com (2603:1096:3:18::25) To SI2PR06MB4396.apcprd06.prod.outlook.com (2603:1096:4:153::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SI2PR06MB4396:EE_|KL1PR06MB5994:EE_ X-MS-Office365-Filtering-Correlation-Id: d1478b5f-5558-42f0-3acf-08dc48e03558 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 81b0OyE0OXpOt4uUFBzz8XR8b6hIFV3dTsGtzoI6uCCM7cFeGVowK/c7tPMClZzDMXWtl0R/Sj8lKqDmdKaQWVPb8CXS6XYJBSbcbwPK6IDTrICM1Wmlwa2K5rC1vwFBRDWbbNXTTgE5fatyXtAp2gCGLyn5RjVUEdgotTJsYFDGTrV5RJlDB1H0Rh0OIV223zAYDMJZPeQcxNCHpXohiuU0YaXsXBk0h7ugvRLSwsspBm73tyd6GbJaiCdTwZzh3/JH22+yaXwQ+bAD/UqTFshgPdHa8I44wOmB6oZ6mlfshYTW+XkH4o8+1TsG0VE5A57lh9c6WwTOI2t0s2nSc1zwxl4nXsPLzrOB6PG3Fu4mdcPy9O45bCbD7kzt20wEZt1Ird9cWvziQbuO22UBMAI8PvsnlSWvd2h9ARNHwb/85TX4najcaRpAlM5z2Jxl4m4jD/TwBgzoKyhays2lcCwF+tAOCqhTt4XLUvGJHmq0jNjG4JhPaEAu5WQxN52kFw/SQ0MnWNQ03Su/cSMR9mYTgOjQUy3sMgOJaEigm9PGIXLulw6VhPvnFuL5EKKaIVl5X349lv9gp0VsWZmii9Ns39SIr4wJRChjSBk/5qDnGKXeHIw6sQaKHleQYUUtBBnmn2X5hQTUhfI+ltbrxNVIuVHE2vfxF9CbbeNin/mqi449Djjl50RdjVlb23f0VHNHQvjkd5HHZic+XVpG+rHcIWEBUsOBI+XRkDVeoGk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SI2PR06MB4396.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376005)(1800799015)(52116005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?M9boikP/jVUje8TjqZnZHfhVZCRfd3PiCYlgm/LE9LqBk92A8hG4eJrkIs3D?= =?us-ascii?Q?B+065DIW5n99ETdRqiiCrW54G464girCG+ArRPCQZMqcgPk/WZlkorawSf0W?= =?us-ascii?Q?QhRkops2lYYaQ9RBS2lPeub7iwcStM8ujH1bm+JIfGuDC+0z9Ar5FF8dt0QE?= =?us-ascii?Q?k52heQj0F5GIt/rikKLlmvO+UMi5e2NSVqqqbG223pwEc/kUuj3oItEBmkZE?= =?us-ascii?Q?ebtuBIT//dcfRyljB6uQeobI4LlsZZiY6qO4vhEF8cAxwHkRCJ6VkLBLYALe?= =?us-ascii?Q?BPrBQh5XNCyo6H+GB8saX4/dZPdk3QKrhFiPnDJ/DJhIVcNkk1pQZjhEG9j6?= =?us-ascii?Q?5l7HsSudx16QWj8Njm22MOxJNFyDSjFW406pO/J4h5iKxLpzH5n1ZmFhS9vy?= =?us-ascii?Q?/voE384kznLMIVlqlPlsQpvLxlgIjKMIbxWCOkOCRpjVZZzbC3COrmov1UWq?= =?us-ascii?Q?cJR7yzCnRyRVjnodXSiUT1HLUvTiluMrE8RjeqQaDSC9hNYgR9SgAP3PETb3?= =?us-ascii?Q?fmhu6cfCc+OIAUlbSoxJ++wLZknPSzI9DQWTfLXVMoGTvWUd9VrHTWgUjfC7?= =?us-ascii?Q?TtG4gppzL4f9YowMbCMkLPp0WZDrv5Xz8CNnnluz399RfwPO+hwjk7EASE0Q?= =?us-ascii?Q?rMBiD4HpouiYsR2bimnXn0opN5abF9lNQzqUfO/tGQozDDIDkMvjxDrUyUKJ?= =?us-ascii?Q?k2Bkhxx+mB9JQssPFQG+j1t+N7GHa+uRVHwLQRsCWeJfMXY0u29Il3mbIP+4?= =?us-ascii?Q?RpJUZoVjHfU85+fgUh2g1BCnXqTvAHz1fsMM0y4Nzm3rW/hJ0QU+ADBMidI+?= =?us-ascii?Q?YZpUcPerT+q5rLmpFwPizDTjbc4EnMxaaKAHpDwbFnrFaH2kPF64+OoNWum4?= =?us-ascii?Q?QdGI+tIm0cW4DTM88Lp5930KEAB14WQye2EjUVZFZtDXlOKuPFsfURu+oEYO?= =?us-ascii?Q?iOV/lg5PPiWwVXfd7UVw7VxFoLtX+L/VWWVOeIG9zWGFt3s9KQKcvc5KOqUu?= =?us-ascii?Q?Tqtt0i6JMWwbHpvXgqanbfL2sJ/6BdlX72mDe5VoLMvpRuubVC3pXESyEtSM?= =?us-ascii?Q?/a/TRTIk9CuB0J1rcLW2zA0l+1kD9ciR3QkTb+Vec2RaNIgsaKYqDklmyilA?= =?us-ascii?Q?g/YCESX2GogGx4CUcrCtckrprqB6LUlbYueucRCZn5MT9Jtpupr/OEPCim/q?= =?us-ascii?Q?rFoMsgW5vIUBoO68uUs70YjOmmwHyLsvdoJKGh5RB340dd2KXtvhqKTnnjxK?= =?us-ascii?Q?TJ8pyErHOIEHouZIMfm+slGWSv6kxBUIUMedSE0iE74Oj0ZxJ0f9y7YuzIfy?= =?us-ascii?Q?smdG7GPUHKvv35djFl8r1Q/Z5t50JbG4ikPKiMOMDmZmBZr/WHPHnq32zrX4?= =?us-ascii?Q?IOvbtsoCOWXfY1Pb/QmFLZHc4cwQelzCtMDQtggIK0OE19Q5oQR+kQkUEhPa?= =?us-ascii?Q?6Ai1g+QVNgvXY42ajCc/IL2zq/5jGm3oHpG8QfgtVfDMTU49Jy56YgEfZobP?= =?us-ascii?Q?McDA93dmO1g33UzPm5CUnqC4oiHfWMhn5iPlH42szW2czw6QSshtr6ZeVwIO?= =?us-ascii?Q?+JUxjK/MvjqtzJrDDiu/nlTpBH9wn5Q51Og/F/5yrSxolaIvtn9WViuMN505?= =?us-ascii?Q?Dg=3D=3D?= X-OriginatorOrg: jaguarmicro.com X-MS-Exchange-CrossTenant-Network-Message-Id: d1478b5f-5558-42f0-3acf-08dc48e03558 X-MS-Exchange-CrossTenant-AuthSource: SI2PR06MB4396.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Mar 2024 13:18:18.8454 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 1e45a5c2-d3e1-46b3-a0e6-c5ebf6d8ba7b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: v5ew5Ep+zbRPz78VWiktrmiReCBFO0CT7NSGyjspMG686YvZYtAfY/L+hFRRORK8TXaRCuKvfscsYa20FuOvdQxLvGlIdjMCdK4Y/kGYze4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR06MB5994 X-MailFrom: yunfeng.qi@jaguarmicro.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 Message-ID-Hash: YW2MJ2I2L5JVWNKEDHJHOS4EXGLSE5JW X-Message-ID-Hash: YW2MJ2I2L5JVWNKEDHJHOS4EXGLSE5JW X-Mailman-Approved-At: Wed, 20 Mar 2024 13:56:03 -0400 CC: Yunfeng Qi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710943125023100001 Since 8.0 version, qemu introduced a new device of 'vhost-vdpa-device-pci' that does not differentiate specific virtio devices, which called generic vDPA device. The generic vDPA solution avoids the need for maintaining a large amoun= t of device emulation code, reducing maintenance costs.. the device configured as follows: Signed-off-by: Yunfeng Qi --- docs/formatdomain.rst | 17 +++ src/ch/ch_domain.c | 1 + src/conf/domain_conf.c | 106 ++++++++++++++++++ src/conf/domain_conf.h | 12 ++ src/conf/domain_postparse.c | 1 + src/conf/domain_validate.c | 11 ++ src/conf/schemas/domaincommon.rng | 23 ++++ src/conf/virconftypes.h | 2 + src/hyperv/hyperv_driver.c | 1 + src/libxl/libxl_driver.c | 6 + src/lxc/lxc_driver.c | 6 + src/qemu/qemu_alias.c | 21 ++++ src/qemu/qemu_cgroup.c | 6 + src/qemu/qemu_command.c | 55 +++++++++ src/qemu/qemu_domain.c | 3 + src/qemu/qemu_domain_address.c | 13 +++ src/qemu/qemu_driver.c | 3 + src/qemu/qemu_hotplug.c | 5 + src/qemu/qemu_validate.c | 12 ++ src/vz/vz_sdk.c | 3 + .../generic-vdpa.x86_64-latest.args | 34 ++++++ .../generic-vdpa.x86_64-latest.xml | 1 + tests/qemuxmlconfdata/generic-vdpa.xml | 43 +++++++ tests/qemuxmlconftest.c | 1 + 24 files changed, 386 insertions(+) create mode 100644 tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.args create mode 120000 tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/generic-vdpa.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 2adc2ff..182987b 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -8622,6 +8622,23 @@ The optional attribute ``backend`` is required if th= e ``type`` is ``qemu``, the ... =20 =20 +GVdpa +~~~~~~ + +A generic vdpa device. +The attribute ``dev`` is required and specifies the path of the generic vd= pa device. + +:: + + ... + + + + + + ... + + Security label -------------- =20 diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index 8e3e205..f9fbad6 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -180,6 +180,7 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Cloud-Hypervisor doesn't support '%1$s' device"), virDomainDeviceTypeToString(dev->type)); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 770b5fb..100d112 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -336,6 +336,7 @@ VIR_ENUM_IMPL(virDomainDevice, "vsock", "audio", "crypto", + "gvdpa" ); =20 VIR_ENUM_IMPL(virDomainDiskDevice, @@ -3627,6 +3628,9 @@ void virDomainDeviceDefFree(virDomainDeviceDef *def) case VIR_DOMAIN_DEVICE_CRYPTO: virDomainCryptoDefFree(def->data.crypto); break; + case VIR_DOMAIN_DEVICE_GVDPA: + virDomainGVdpaDefFree(def->data.gvdpa); + break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -3984,6 +3988,10 @@ void virDomainDefFree(virDomainDef *def) virDomainCryptoDefFree(def->cryptos[i]); g_free(def->cryptos); =20 + for (i =3D 0; i < def->ngvdpas; i++) + virDomainGVdpaDefFree(def->gvdpas[i]); + g_free(def->gvdpas); + virDomainIOMMUDefFree(def->iommu); =20 g_free(def->idmap.uidmap); @@ -4543,6 +4551,8 @@ virDomainDeviceGetInfo(const virDomainDeviceDef *devi= ce) return &device->data.vsock->info; case VIR_DOMAIN_DEVICE_CRYPTO: return &device->data.crypto->info; + case VIR_DOMAIN_DEVICE_GVDPA: + return &device->data.gvdpa->info; =20 /* The following devices do not contain virDomainDeviceInfo */ case VIR_DOMAIN_DEVICE_LEASE: @@ -4648,6 +4658,9 @@ virDomainDeviceSetData(virDomainDeviceDef *device, case VIR_DOMAIN_DEVICE_CRYPTO: device->data.crypto =3D devicedata; break; + case VIR_DOMAIN_DEVICE_GVDPA: + device->data.gvdpa =3D devicedata; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -4866,6 +4879,13 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, return rc; } =20 + device.type =3D VIR_DOMAIN_DEVICE_GVDPA; + for (i =3D 0; i < def->ngvdpas; i++) { + device.data.gvdpa =3D def->gvdpas[i]; + if ((rc =3D cb(def, &device, &def->gvdpas[i]->info, opaque)) !=3D = 0) + return rc; + } + /* If the flag below is set, make sure @cb can handle @info being NULL= */ if (iteratorFlags & DOMAIN_DEVICE_ITERATE_MISSING_INFO) { device.type =3D VIR_DOMAIN_DEVICE_GRAPHICS; @@ -4925,6 +4945,7 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: break; } #endif @@ -13892,6 +13913,41 @@ virDomainCryptoDefParseXML(virDomainXMLOption *xml= opt, return g_steal_pointer(&def); } =20 +static virDomainGVdpaDef * +virDomainGVdpaDefParseXML(virDomainXMLOption *xmlopt, + xmlNodePtr node, + xmlXPathContextPtr ctxt, + unsigned int flags) +{ + g_autoptr(virDomainGVdpaDef) def =3D NULL; + int nsources; + g_autofree xmlNodePtr *sources =3D NULL; + VIR_XPATH_NODE_AUTORESTORE(ctxt) + + def =3D g_new0(virDomainGVdpaDef, 1); + ctxt->node =3D node; + + if ((nsources =3D virXPathNodeSet("./source", ctxt, &sources)) < 0) + return NULL; + + if (nsources !=3D 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("only one gvdpa source is supported")); + return NULL; + } + + if (!(def->dev =3D virXMLPropString(sources[0], "dev"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing dev element")); + return NULL; + } + + if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags = | VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT) < 0) + return NULL; + + return g_steal_pointer(&def); +} + =20 static int virDomainDeviceDefParseType(const char *typestr, @@ -14072,6 +14128,11 @@ virDomainDeviceDefParse(const char *xmlStr, flags))) return NULL; break; + case VIR_DOMAIN_DEVICE_GVDPA: + if (!(dev->data.gvdpa =3D virDomainGVdpaDefParseXML(xmlopt, node, = ctxt, + flags))) + return NULL; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -19230,6 +19291,21 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); =20 + /* Parse the gvdpa devices */ + if ((n =3D virXPathNodeSet("./devices/gvdpa", ctxt, &nodes)) < 0) + return NULL; + if (n) + def->gvdpas =3D g_new0(virDomainGVdpaDef *, n); + for (i =3D 0; i < n; i++) { + virDomainGVdpaDef *gvdpa =3D virDomainGVdpaDefParseXML(xmlopt, nod= es[i], + ctxt, flag= s); + if (!gvdpa) + return NULL; + + def->gvdpas[def->ngvdpas++] =3D gvdpa; + } + VIR_FREE(nodes); + /* Parse the TPM devices */ if ((n =3D virXPathNodeSet("./devices/tpm", ctxt, &nodes)) < 0) return NULL; @@ -21788,6 +21864,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDef *sr= c, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: break; } #endif @@ -25334,6 +25411,22 @@ virDomainCryptoDefFormat(virBuffer *buf, virXMLFormatElement(buf, "crypto", &attrBuf, &childBuf); } =20 +static void +virDomainGVdpaDefFormat(virBuffer *buf, + virDomainGVdpaDef *def, + unsigned int flags) +{ + virBufferAddLit(buf, "\n"); + + virBufferAdjustIndent(buf, 2); + virBufferAsprintf(buf, "\n", def->dev); + virDomainDeviceInfoFormat(buf, &def->info, flags | VIR_DOMAIN_DEF_FORM= AT_ALLOW_BOOT); + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); +} + + void virDomainCryptoDefFree(virDomainCryptoDef *def) { @@ -25345,6 +25438,16 @@ virDomainCryptoDefFree(virDomainCryptoDef *def) g_free(def); } =20 +void +virDomainGVdpaDefFree(virDomainGVdpaDef *def) +{ + if (!def) + return; + + virDomainDeviceInfoClear(&def->info); + g_free(def->dev); + g_free(def); +} =20 static int virDomainMemorySourceDefFormat(virBuffer *buf, @@ -28139,6 +28242,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, for (n =3D 0; n < def->ncryptos; n++) { virDomainCryptoDefFormat(buf, def->cryptos[n], flags); } + for (n =3D 0; n < def->ngvdpas; n++) { + virDomainGVdpaDefFormat(buf, def->gvdpas[n], flags); + } if (def->iommu) virDomainIOMMUDefFormat(buf, def->iommu); =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 7625193..a0c94af 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -87,6 +87,7 @@ typedef enum { VIR_DOMAIN_DEVICE_VSOCK, VIR_DOMAIN_DEVICE_AUDIO, VIR_DOMAIN_DEVICE_CRYPTO, + VIR_DOMAIN_DEVICE_GVDPA, =20 VIR_DOMAIN_DEVICE_LAST } virDomainDeviceType; @@ -120,6 +121,7 @@ struct _virDomainDeviceDef { virDomainVsockDef *vsock; virDomainAudioDef *audio; virDomainCryptoDef *crypto; + virDomainGVdpaDef *gvdpa; } data; }; =20 @@ -2943,6 +2945,11 @@ struct _virDomainCryptoDef { virDomainVirtioOptions *virtio; }; =20 +struct _virDomainGVdpaDef { + char *dev; + virDomainDeviceInfo info; +}; + struct _virDomainVirtioOptions { virTristateSwitch iommu; virTristateSwitch ats; @@ -3112,6 +3119,9 @@ struct _virDomainDef { size_t ncryptos; virDomainCryptoDef **cryptos; =20 + size_t ngvdpas; + virDomainGVdpaDef **gvdpas; + size_t nwatchdogs; virDomainWatchdogDef **watchdogs; =20 @@ -3569,6 +3579,8 @@ void virDomainVsockDefFree(virDomainVsockDef *vsock); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainVsockDef, virDomainVsockDefFree); void virDomainCryptoDefFree(virDomainCryptoDef *def); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCryptoDef, virDomainCryptoDefFree); +void virDomainGVdpaDefFree(virDomainGVdpaDef *def); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainGVdpaDef, virDomainGVdpaDefFree); void virDomainNetTeamingInfoFree(virDomainNetTeamingInfo *teaming); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainNetTeamingInfo, virDomainNetTeaming= InfoFree); void virDomainNetPortForwardFree(virDomainNetPortForward *pf); diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index cafa2d2..5a568e8 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -746,6 +746,7 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDef *d= ev, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: ret =3D 0; break; =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index faa7659..c6729e4 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2576,6 +2576,14 @@ virDomainCryptoDefValidate(const virDomainCryptoDef = *crypto) return 0; } =20 +static int +virDomainGVdpaDefValidate(const virDomainGVdpaDef *gvdpa) +{ + if (!gvdpa->dev) + return -1; + + return 0; +} =20 static int virDomainInputDefValidate(const virDomainInputDef *input, @@ -3058,6 +3066,9 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_CRYPTO: return virDomainCryptoDefValidate(dev->data.crypto); =20 + case VIR_DOMAIN_DEVICE_GVDPA: + return virDomainGVdpaDefValidate(dev->data.gvdpa); + case VIR_DOMAIN_DEVICE_INPUT: return virDomainInputDefValidate(dev->data.input, def); =20 diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index c992956..c7c7314 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6609,6 +6609,7 @@ + @@ -7457,6 +7458,28 @@ =20 =20 + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 0779bc2..924138a 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -256,6 +256,8 @@ typedef struct _virDomainVsockDef virDomainVsockDef; =20 typedef struct _virDomainCryptoDef virDomainCryptoDef; =20 +typedef struct _virDomainGVdpaDef virDomainGVdpaDef; + typedef struct _virDomainWatchdogDef virDomainWatchdogDef; =20 typedef struct _virDomainXMLOption virDomainXMLOption; diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 414274f..c7e5cce 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -3132,6 +3132,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, co= nst char *xml, unsigned int case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_INTERNAL_ERROR, _("Attaching devices of type %1$d is not implemente= d"), dev->type); return -1; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e42a3dc..1664c33 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3505,6 +3505,7 @@ libxlDomainAttachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -3613,6 +3614,7 @@ libxlDomainAttachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported= ")); return -1; @@ -3981,6 +3983,7 @@ libxlDomainDetachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); @@ -4071,6 +4074,7 @@ libxlDomainDetachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported= ")); return -1; @@ -4133,6 +4137,7 @@ libxlDomainUpdateDeviceLive(virDomainObj *vm, virDoma= inDeviceDef *dev) case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be updated"), virDomainDeviceTypeToString(dev->type)); @@ -4195,6 +4200,7 @@ libxlDomainUpdateDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported= ")); return -1; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 39992bd..7d11529 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3054,6 +3054,7 @@ lxcDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported")); break; @@ -3119,6 +3120,7 @@ lxcDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported")); break; @@ -3199,6 +3201,7 @@ lxcDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_AUDIO: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported")); @@ -3301,6 +3304,7 @@ lxcDomainAttachDeviceMknodHelper(pid_t pid G_GNUC_UNU= SED, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected device type %1$d"), data->def->type); @@ -3972,6 +3976,7 @@ lxcDomainAttachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -4396,6 +4401,7 @@ lxcDomainDetachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 872d940..518abd3 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -657,6 +657,24 @@ qemuAssignDeviceCryptoAlias(virDomainDef *def, crypto->info.alias =3D g_strdup_printf("crypto%d", maxidx); } =20 +static void +qemuAssignDeviceGVdpaAlias(virDomainDef *def, + virDomainGVdpaDef *gvdpa) +{ + size_t i; + int maxidx =3D 0; + int idx; + + if (gvdpa->info.alias) + return; + + for (i =3D 0; i < def->ngvdpas; i++) { + if ((idx =3D qemuDomainDeviceAliasIndex(&def->gvdpas[i]->info, "gv= dpa")) >=3D maxidx) + maxidx =3D idx + 1; + } + + gvdpa->info.alias =3D g_strdup_printf("gvdpa%d", maxidx); +} =20 int qemuAssignDeviceAliases(virDomainDef *def) @@ -747,6 +765,9 @@ qemuAssignDeviceAliases(virDomainDef *def) for (i =3D 0; i < def->ncryptos; i++) { qemuAssignDeviceCryptoAlias(def, def->cryptos[i]); } + for (i =3D 0; i < def->ngvdpas; i++) { + qemuAssignDeviceGVdpaAlias(def, def->gvdpas[i]); + } =20 return 0; } diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 5a5ba76..1206359 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -845,6 +845,12 @@ qemuSetupDevicesCgroup(virDomainObj *vm) return -1; } =20 + for (i =3D 0; i < vm->def->ngvdpas; i++) { + if (qemuCgroupAllowDevicePath(vm, vm->def->gvdpas[i]->dev, + VIR_CGROUP_DEVICE_RW, false) < 0) + return -1; + } + if (vm->def->sec && vm->def->sec->sectype =3D=3D VIR_DOMAIN_LAUNCH_SECURITY_SEV && qemuSetupSEVCgroup(vm) < 0) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2bb1b6a..faf96f9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -969,6 +969,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef= *device, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_LAST: + case VIR_DOMAIN_DEVICE_GVDPA: default: break; } @@ -10254,6 +10255,57 @@ qemuBuildCryptoCommandLine(virCommand *cmd, return 0; } =20 +static virJSONValue * +qemuBuildGVdpaDevProps(const virDomainDef *def, + virDomainGVdpaDef *dev) +{ + g_autoptr(virJSONValue) props =3D NULL; + + if (virJSONValueObjectAdd(&props, + "s:driver", "vhost-vdpa-device-pci", + "s:vhostdev", dev->dev, + "s:id", dev->info.alias, + "p:bootindex", dev->info.effectiveBootIndex, + NULL) < 0) + return NULL; + + if (qemuBuildDeviceAddressProps(props, def, &dev->info) < 0) + return NULL; + + return g_steal_pointer(&props); +} + +static int +qemuBuildGVdpaCommandLine(virCommand *cmd, + const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + size_t i; + + for (i =3D 0; i < def->ngvdpas; i++) { + virDomainGVdpaDef *gvdpa =3D def->gvdpas[i]; + g_autoptr(virJSONValue) devprops =3D NULL; + + if (!gvdpa->info.alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("GVdpa device is missing alias")); + return -1; + } + + /* add the device */ + if (qemuCommandAddExtDevice(cmd, &gvdpa->info, def, qemuCaps) < 0) + return -1; + + if (!(devprops =3D qemuBuildGVdpaDevProps(def, gvdpa))) + return -1; + + if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, def, qemuCap= s) < 0) + return -1; + } + + return 0; +} + =20 static int qemuBuildAsyncTeardownCommandLine(virCommand *cmd, @@ -10628,6 +10680,9 @@ qemuBuildCommandLine(virDomainObj *vm, if (qemuBuildCryptoCommandLine(cmd, def, qemuCaps) < 0) return NULL; =20 + if (qemuBuildGVdpaCommandLine(cmd, def, qemuCaps) < 0) + return NULL; + if (qemuBuildAsyncTeardownCommandLine(cmd, def, qemuCaps) < 0) return NULL; =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index bc6cf13..132b479 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6324,6 +6324,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: ret =3D 0; break; =20 @@ -10301,6 +10302,7 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDe= f *dev, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: break; } =20 @@ -12232,6 +12234,7 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainD= eviceDef *dev, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: /* no chardev backend */ break; } diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index cc3bc76..5db2dfa 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -464,6 +464,7 @@ qemuDomainDeviceSupportZPCI(virDomainDeviceDef *device) case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: break; =20 case VIR_DOMAIN_DEVICE_NONE: @@ -978,6 +979,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, } break; =20 + case VIR_DOMAIN_DEVICE_GVDPA: + return pciFlags; + case VIR_DOMAIN_DEVICE_PANIC: switch ((virDomainPanicModel) dev->data.panic->model) { case VIR_DOMAIN_PANIC_MODEL_PVPANIC: @@ -2392,6 +2396,15 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, return -1; } =20 + /* gvdpa */ + for (i =3D 0; i < def->ngvdpas; i++) { + if (!virDeviceInfoPCIAddressIsWanted(&def->gvdpas[i]->info)) + continue; + + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->gvdpas[i]->in= fo) < 0) + return -1; + } + for (i =3D 0; i < def->npanics; i++) { virDomainPanicDef *panic =3D def->panics[i]; =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d01f788..5e3ea85 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6859,6 +6859,7 @@ qemuDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%1$s' is not suppo= rted"), @@ -7066,6 +7067,7 @@ qemuDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%1$s' is not suppor= ted"), @@ -7191,6 +7193,7 @@ qemuDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%1$s' is not suppor= ted"), diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b9c5026..dc9caec 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3454,6 +3454,7 @@ qemuDomainAttachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%1$s' is not supported"), @@ -5281,6 +5282,7 @@ qemuDomainRemoveAuditDevice(virDomainObj *vm, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: /* libvirt doesn't yet support detaching these devices */ break; @@ -5385,6 +5387,7 @@ qemuDomainRemoveDevice(virQEMUDriver *driver, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %1$s device"), @@ -6239,6 +6242,7 @@ qemuDomainDetachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), @@ -7228,6 +7232,7 @@ qemuDomainUpdateDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%1$s' is not supported"), diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 6a73d02..964cf5b 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4577,6 +4577,15 @@ qemuValidateDomainDeviceDefCrypto(virDomainCryptoDef= *crypto, return 0; } =20 +static int +qemuValidateDomainDeviceDefGVdpa(virDomainGVdpaDef *gvdpa G_GNUC_UNUSED, + const virDomainDef *def G_GNUC_UNUSED, + virQEMUCaps *qemuCaps G_GNUC_UNUSED) +{ + if (qemuValidateDomainDefVhostUserRequireSharedMemory(def, "generic-vd= pa") < 0) + return -1; + return 0; +} =20 static int qemuSoundCodecTypeToCaps(int type) @@ -5277,6 +5286,9 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_CRYPTO: return qemuValidateDomainDeviceDefCrypto(dev->data.crypto, def, qe= muCaps); =20 + case VIR_DOMAIN_DEVICE_GVDPA: + return qemuValidateDomainDeviceDefGVdpa(dev->data.gvdpa, def, qemu= Caps); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_NONE: diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index ce4586a..1c1064b 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3534,6 +3534,7 @@ prlsdkAttachDevice(struct _vzDriver *driver, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("attaching device type '%1$s' is unsupported"), virDomainDeviceTypeToString(dev->type)); @@ -3624,6 +3625,7 @@ prlsdkDetachDevice(struct _vzDriver *driver G_GNUC_UN= USED, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("detaching device type '%1$s' is unsupported"), virDomainDeviceTypeToString(dev->type)); @@ -3704,6 +3706,7 @@ prlsdkUpdateDevice(struct _vzDriver *driver, case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_GVDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("updating device type '%1$s' is unsupported"), virDomainDeviceTypeToString(dev->type)); diff --git a/tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.args b/tests/= qemuxmlconfdata/generic-vdpa.x86_64-latest.args new file mode 100644 index 0000000..7e904e2 --- /dev/null +++ b/tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.args @@ -0,0 +1,34 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-vm \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-vm/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-vm/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-vm/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=3Dvm,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-vm/master-key.aes"}' \ +-machine pc-i440fx-8.0,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dpc= .ram,acpi=3Doff \ +-accel tcg \ +-cpu qemu64,hypervisor=3Don,lahf-lm=3Don \ +-m size=3D2097152k \ +-object '{"qom-type":"memory-backend-file","id":"pc.ram","mem-path":"/var/= lib/libvirt/qemu/ram/-1-vm/pc.ram","share":true,"x-use-canonical-path-for-r= amblock-id":false,"size":2147483648}' \ +-overcommit mem-lock=3Doff \ +-smp 2,sockets=3D2,cores=3D1,threads=3D1 \ +-uuid 85e32425-da0d-11ee-96fa-8430ce01b683 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0= x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","add= r":"0x2"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-device '{"driver":"vhost-vdpa-device-pci","vhostdev":"/dev/vhost-vdpa-0",= "id":"gvdpa0","bootindex":1,"bus":"pci.0","addr":"0x9"}' \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.xml b/tests/q= emuxmlconfdata/generic-vdpa.x86_64-latest.xml new file mode 120000 index 0000000..ce074fe --- /dev/null +++ b/tests/qemuxmlconfdata/generic-vdpa.x86_64-latest.xml @@ -0,0 +1 @@ +generic-vdpa.xml \ No newline at end of file diff --git a/tests/qemuxmlconfdata/generic-vdpa.xml b/tests/qemuxmlconfdata= /generic-vdpa.xml new file mode 100644 index 0000000..f2c6bae --- /dev/null +++ b/tests/qemuxmlconfdata/generic-vdpa.xml @@ -0,0 +1,43 @@ + + vm + 85e32425-da0d-11ee-96fa-8430ce01b683 + 2097152 + 2097152 + + + + 2 + + /machine + + + hvm + + + qemu64 + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + + + +