From nobody Thu May 15 01:21:06 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1512840745088453.44541673506933; Sat, 9 Dec 2017 09:32:25 -0800 (PST) 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 mx1.redhat.com (Postfix) with ESMTPS id 6046A356C2; Sat, 9 Dec 2017 17:32:23 +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 2DB562A2EC; Sat, 9 Dec 2017 17:32:23 +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 E742B1800FC5; Sat, 9 Dec 2017 17:32:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vB9HTXx6028923 for ; Sat, 9 Dec 2017 12:29:33 -0500 Received: by smtp.corp.redhat.com (Postfix) id C3D2918BBC; Sat, 9 Dec 2017 17:29:33 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-132.phx2.redhat.com [10.3.117.132]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8AFD851DE1 for ; Sat, 9 Dec 2017 17:29:33 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Sat, 9 Dec 2017 12:29:14 -0500 Message-Id: <20171209172914.14640-4-jferlan@redhat.com> In-Reply-To: <20171209172914.14640-1-jferlan@redhat.com> References: <20171209172914.14640-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/3] nodedev: Move the udevPCITranslateInit call 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Sat, 09 Dec 2017 17:32:24 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" If the timing is "just right", there is a possibility that the udev nodeStateInitialize conflicts with another systemd thread running an lspci command leaving both waiting for "something", but resulting in a hung libvirtd (and hung lspci thread) from which the only recovery is a reboot because killing either thread is impossible and results in a defunct libvirtd process if a SIGKILL is performed. In order to avoid this let's move where the PCI initialization is done to be where it's actually needed. Ensure we only perform the initialization once via a driver bool. Likewise, during cleanup ensure we only call udevPCITranslateDeinit once the initialization is successful. At least a failure for this driver won't hang out the rest of the the libvirt event loop. May not make certain things usable though. Still a libvirtd restart is far easier than a host reboot. Signed-off-by: John Ferlan --- src/conf/virnodedeviceobj.h | 1 + src/node_device/node_device_udev.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/conf/virnodedeviceobj.h b/src/conf/virnodedeviceobj.h index 87f908369..b5f96f206 100644 --- a/src/conf/virnodedeviceobj.h +++ b/src/conf/virnodedeviceobj.h @@ -41,6 +41,7 @@ struct _virNodeDeviceDriverState { virNodeDeviceObjListPtr devs; /* currently-known devices */ void *privateData; /* driver-specific private data */ bool privileged; /* whether we run in privileged mo= de */ + bool initPCI; /* Set when PCI thread completed */ =20 /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr nodeDeviceEventState; diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index ca5b47767..9cbba8562 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -551,12 +551,21 @@ udevProcessPCI(struct udev_device *device, virPCIEDeviceInfoPtr pci_express =3D NULL; virPCIDevicePtr pciDev =3D NULL; int ret =3D -1; + int rc =3D 0; char *p; bool privileged; =20 nodeDeviceLock(); privileged =3D driver->privileged; + + if (!driver->initPCI) { + rc =3D udevPCITranslateInit(driver->privileged); + driver->initPCI =3D true; + } + nodeDeviceUnlock(); + if (rc < 0) + goto cleanup; =20 if (udevGetUintProperty(device, "PCI_CLASS", &pci_dev->class, 16) < 0) goto cleanup; @@ -1681,6 +1690,9 @@ nodeStateCleanup(void) virThreadJoin(&priv->th); } =20 + if (driver->initPCI) + udevPCITranslateDeinit(); + virObjectUnref(priv); virObjectUnref(driver->nodeDeviceEventState); =20 @@ -1688,7 +1700,6 @@ nodeStateCleanup(void) virMutexDestroy(&driver->lock); VIR_FREE(driver); =20 - udevPCITranslateDeinit(); return 0; } =20 @@ -1962,9 +1973,6 @@ nodeStateInitialize(bool privileged, driver->privateData =3D priv; driver->nodeDeviceEventState =3D virObjectEventStateNew(); =20 - if (udevPCITranslateInit(privileged) < 0) - goto cleanup; - udev =3D udev_new(); if (!udev) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list