From nobody Wed May 8 04:13:16 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1706193307075757.8439974785824; Thu, 25 Jan 2024 06:35:07 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id C87B81B0D; Thu, 25 Jan 2024 09:35:05 -0500 (EST) Received: from lists.libvirt.org.85.43.8.in-addr.arpa (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 8B65D19A9; Thu, 25 Jan 2024 09:33:40 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 6991719A1; Thu, 25 Jan 2024 09:33:38 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 C94CE1939 for ; Thu, 25 Jan 2024 09:33:37 -0500 (EST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-410-V9L23zCZNRK0Sh1Gt9J8yg-1; Thu, 25 Jan 2024 09:33:36 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (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 mimecast-mx02.redhat.com (Postfix) with ESMTPS id C9C60879845 for ; Thu, 25 Jan 2024 14:33:35 +0000 (UTC) Received: from maggie.brq.redhat.com (unknown [10.43.3.102]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7415DC15E61 for ; Thu, 25 Jan 2024 14:33:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: V9L23zCZNRK0Sh1Gt9J8yg-1 From: Michal Privoznik To: devel@lists.libvirt.org Subject: [PATCH] qemu_hotplug: Don't lose 'created' flag in qemuDomainChangeNet() Date: Thu, 25 Jan 2024 15:33:34 +0100 Message-ID: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: AR4VJLO7Y33AHYLSHOZDKCMZ3CCUFG6E X-Message-ID-Hash: AR4VJLO7Y33AHYLSHOZDKCMZ3CCUFG6E X-MailFrom: mprivozn@redhat.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header 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"; x-default="true" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1706193308607100001 After v9.1.0-rc1~116 we track whether it's us who created a macvtap or not. But when updating a vNIC its definition might be replaced with a new one (though, ifname is not allowed to change), e.g. to reflect new QoS, link state, etc. Now, the fact whether we created macvtap for given vNIC is stored in net->privateData->created. And replacing definition is done by simply freeing the old definition and making the pointer point to the new one. But this does not preserve the 'created' flag, which in turn means when a domain is shutting off, the macvtap is not removed (see loop inside of qemuProcessStop()). Copy this flag into new definition and leave a note in _qemuDomainNetworkPrivate struct. Fixes: 61d1b9e6592660121aeda66bf7adbcd39de06aa8 Resolves: https://issues.redhat.com/browse/RHEL-22714 Signed-off-by: Michal Privoznik Reviewed-by: J=C3=A1n Tomko --- I also contemplated idea of preserving whole privateData, e.g.: virObjectUnref(newdev->privateData); newdev->privateData =3D g_steal_pointer(&olddev->privateData); but then decided against it. Looks like a heavy gun, though in my debugging all members but 'created' were zero/NULL at point of calling qemuDomainChangeNet(). Then there is qemuDomainNetworkPrivateFormat() and qemuDomainNetworkPrivateParse() combo, but in order to use it I'd need to create and then parse an XML doc (to get 'ctxt') and that looks too much work for very little gain. Does somebody have any other idea? src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_hotplug.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b4512cc80e..6ba3f10e8d 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -420,6 +420,8 @@ typedef struct _qemuDomainNetworkPrivate qemuDomainNetw= orkPrivate; struct _qemuDomainNetworkPrivate { virObject parent; =20 + /* Don't forget to possibly copy these members in qemuDomainChangeNet(= ). */ + /* True if the device was created by us. Otherwise we should * avoid removing it. Currently only used for * VIR_DOMAIN_NET_TYPE_DIRECT. */ diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0e45bd53e1..31b00e05ca 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4166,6 +4166,11 @@ qemuDomainChangeNet(virQEMUDriver *driver, else VIR_WARN("Unable to release network device '%s'", NULLSTR(= olddev->ifname)); } + + /* Carry over fact whether we created the device or not. */ + QEMU_DOMAIN_NETWORK_PRIVATE(newdev)->created =3D + QEMU_DOMAIN_NETWORK_PRIVATE(olddev)->created; + virDomainNetDefFree(olddev); /* move newdev into the nets list, and NULL it out from the * virDomainDeviceDef that we were given so that the caller --=20 2.43.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org