From nobody Mon Mar 23 23:39:49 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1773131748; cv=none; d=zohomail.com; s=zohoarc; b=OUEaSEXffIsz11kbch6n/D/nSHZV9IVw2LnwDSLTiS6aJ19YX0+u5gTO8GVnYhJv7Q1+lo/e5+CeZYO/PchyJSqqlP2X/jxx1bWJJ8F9Do44oRJ0XBDEB7c36WThXd8RhvT9MP39F0NGgI2ozCPQMtofF/qT0AxVMi83r9/Sc4Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773131748; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Subject:Subject:To:To:Message-Id:Cc; bh=64AEBLyzEp05TMqnpvTiztakeaLdZgc5ksFC+W/aZt8=; b=TSLu84Bwjy+sFRhSkgFdd4aLPBZXcnvq27E+vYFAKDJjEjgapYeNYNy7JmUQp7nnfzZFiUZBG180Oxsmr7IEF+h1lgduoQEcOC+RhDfx4qhGX5p3T0mNZLPMDTtj5O8jm9fr4K9dGjXJRH//gVWiFvfov7KP7v3ltZKh6UPmFHo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1773131748541416.3725961264122; Tue, 10 Mar 2026 01:35:48 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 793C64180E; Tue, 10 Mar 2026 04:35:47 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 21584418E2; Tue, 10 Mar 2026 04:35:14 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E8B0B3F937; Tue, 10 Mar 2026 04:35:09 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 2C12B3F342 for ; Tue, 10 Mar 2026 04:35:09 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-j6uuWRHsO56Aw5HPYuB7DA-1; Tue, 10 Mar 2026 04:35:07 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4E6EA180049D for ; Tue, 10 Mar 2026 08:35:06 +0000 (UTC) Received: from antique-work.redhat.com (unknown [10.44.33.175]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 84C571955D71 for ; Tue, 10 Mar 2026 08:35:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773131708; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=64AEBLyzEp05TMqnpvTiztakeaLdZgc5ksFC+W/aZt8=; b=IXr5Y7Xxl7tRbkuhCRB/XiW/aARraV+1Oa43+jaOKT/q/sv14bCwgEbKyPVZVj2WDq534t i9qhx8LmEmdn4VuXmpbY6y82oZaGY38/4wO6ddhFJ0HveHiAZ9dJIvvfjbPfwOOjYLYWXO pbHA4aLmhmnc94I2r8UPOvCItCbCk7k= X-MC-Unique: j6uuWRHsO56Aw5HPYuB7DA-1 X-Mimecast-MFC-AGG-ID: j6uuWRHsO56Aw5HPYuB7DA_1773131706 To: devel@lists.libvirt.org Subject: [libvirt PATCH] qemu_hotplug: Fix crash when attaching network inteface with hostdev network Date: Tue, 10 Mar 2026 09:35:04 +0100 Message-ID: <044de005f5ac5f28cd1d16ca0d84dc4d0321425c.1773131697.git.phrdina@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: I3S_jxNMs4U_K-rElXuszC4oZM3M_3HFS7l5gvvXHJc_1773131706 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: XP6KKDPGNSAXV4P77BTIS7NYVYJL32WQ X-Message-ID-Hash: XP6KKDPGNSAXV4P77BTIS7NYVYJL32WQ X-MailFrom: phrdina@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Pavel Hrdina via Devel Reply-To: Pavel Hrdina X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773131755656154100 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Pavel Hrdina The following interface XML will crash libvirt when attached to running VM: Instead of trying to figure out every single place where hostdev is used as struct directly and allocating empty private data check if iommufd is configured as that will happen only for device where the private data are correctly allocated. This patch is best viewed with `git show -w`. Signed-off-by: Pavel Hrdina Reviewed-by: Jiri Denemark --- src/qemu/qemu_hotplug.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b3f2a173a8..966e746f2b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1630,20 +1630,23 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, =20 qemuDomainObjEnterMonitor(vm); =20 - if (objprops) { - if ((ret =3D qemuFDPassDirectTransferMonitor(priv->iommufd, priv->= mon)) < 0) - goto exit_monitor; =20 - if ((ret =3D qemuMonitorAddObject(priv->mon, &objprops, NULL)) < 0) - goto exit_monitor; + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + if (objprops) { + if ((ret =3D qemuFDPassDirectTransferMonitor(priv->iommufd, pr= iv->mon)) < 0) + goto exit_monitor; + + if ((ret =3D qemuMonitorAddObject(priv->mon, &objprops, NULL))= < 0) + goto exit_monitor; =20 - priv->iommufdState =3D true; - removeiommufd =3D true; + priv->iommufdState =3D true; + removeiommufd =3D true; + } + + if ((ret =3D qemuFDPassDirectTransferMonitor(hostdevPriv->vfioDevi= ceFd, priv->mon)) < 0) + goto exit_monitor; } =20 - if ((ret =3D qemuFDPassDirectTransferMonitor(hostdevPriv->vfioDeviceFd= , priv->mon)) < 0) - goto exit_monitor; - if ((ret =3D qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)= ) < 0) goto exit_monitor; =20 @@ -1674,15 +1677,17 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, if (teardownmemlock && qemuDomainAdjustMaxMemLock(vm) < 0) VIR_WARN("Unable to reset maximum locked memory on hotplug fail"); =20 - qemuDomainObjEnterMonitor(vm); + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + qemuDomainObjEnterMonitor(vm); =20 - if (removeiommufd) - ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false)); + if (removeiommufd) + ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false= )); =20 - qemuFDPassDirectTransferMonitorRollback(hostdevPriv->vfioDeviceFd, pri= v->mon); - qemuFDPassDirectTransferMonitorRollback(priv->iommufd, priv->mon); + qemuFDPassDirectTransferMonitorRollback(hostdevPriv->vfioDeviceFd,= priv->mon); + qemuFDPassDirectTransferMonitorRollback(priv->iommufd, priv->mon); =20 - qemuDomainObjExitMonitor(vm); + qemuDomainObjExitMonitor(vm); + } =20 if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, info); --=20 2.53.0