From nobody Mon Apr 29 08:40:05 2024 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 151284072762566.584428066015; Sat, 9 Dec 2017 09:32:07 -0800 (PST) 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 mx1.redhat.com (Postfix) with ESMTPS id 0A66836809; Sat, 9 Dec 2017 17:32:05 +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 DEF8A1822B; Sat, 9 Dec 2017 17:32:02 +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 79F481800BDF; Sat, 9 Dec 2017 17:32:00 +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 vB9HTXP9028913 for ; Sat, 9 Dec 2017 12:29:33 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0DFEE51C4B; 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 CA4A218BBC for ; Sat, 9 Dec 2017 17:29:32 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Sat, 9 Dec 2017 12:29:12 -0500 Message-Id: <20171209172914.14640-2-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 1/3] nodedev: Move device enumumeration out of nodeStateInitialize 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.16 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:06 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Let's move the udevEnumerateDevices into a thread to "speed up" the initialization process. If the enumeration fails we can set the Quit flag to ensure that udevEventHandleCallback will not run. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/node_device/node_device_udev.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 1e1b71742..e0fca6159 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1891,6 +1891,25 @@ udevSetupSystemDev(void) } =20 =20 +static void +nodeStateInitializeEnumerate(void *opaque) +{ + struct udev *udev =3D opaque; + udevEventDataPtr priv =3D driver->privateData; + + /* Populate with known devices */ + if (udevEnumerateDevices(udev) !=3D 0) + goto error; + + return; + + error: + virObjectLock(priv); + priv->threadQuit =3D true; + virObjectUnlock(priv); +} + + static int udevPCITranslateInit(bool privileged ATTRIBUTE_UNUSED) { @@ -1922,6 +1941,7 @@ nodeStateInitialize(bool privileged, { udevEventDataPtr priv =3D NULL; struct udev *udev =3D NULL; + virThread enumThread; =20 if (VIR_ALLOC(driver) < 0) return -1; @@ -2002,9 +2022,12 @@ nodeStateInitialize(bool privileged, if (udevSetupSystemDev() !=3D 0) goto cleanup; =20 - /* Populate with known devices */ - if (udevEnumerateDevices(udev) !=3D 0) + if (virThreadCreate(&enumThread, false, nodeStateInitializeEnumerate, + udev) < 0) { + virReportSystemError(errno, "%s", + _("failed to create udev enumerate thread")); goto cleanup; + } =20 return 0; =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 08:40:05 2024 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 1512840771445332.95084100057636; Sat, 9 Dec 2017 09:32:51 -0800 (PST) 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 mx1.redhat.com (Postfix) with ESMTPS id 92BCF804E3; Sat, 9 Dec 2017 17:32:49 +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 7397419F00; Sat, 9 Dec 2017 17:32:49 +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 33EAE1800C87; Sat, 9 Dec 2017 17:32:49 +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 vB9HTXuA028918 for ; Sat, 9 Dec 2017 12:29:33 -0500 Received: by smtp.corp.redhat.com (Postfix) id 67E2B51C4B; 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 305B718BBC 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:13 -0500 Message-Id: <20171209172914.14640-3-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 2/3] nodedev: Move the udevPCITranslate{Init|Deinit} 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Sat, 09 Dec 2017 17:32:50 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Move the functions to the top - about to change where/when the Init helper gets called away from the main StateInitialize. Signed-off-by: John Ferlan --- src/node_device/node_device_udev.c | 74 +++++++++++++++++++---------------= ---- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index e0fca6159..ca5b47767 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -126,6 +126,43 @@ udevEventDataNew(void) } =20 =20 +static int +udevPCITranslateInit(bool privileged ATTRIBUTE_UNUSED) +{ +#if defined __s390__ || defined __s390x_ + /* On s390(x) system there is no PCI bus. + * Therefore there is nothing to initialize here. */ +#else + int rc; + + if ((rc =3D pci_system_init()) !=3D 0) { + /* Ignore failure as non-root; udev is not as helpful in that + * situation, but a non-privileged user won't benefit much + * from udev in the first place. */ + if (errno !=3D ENOENT && (privileged || errno !=3D EACCES)) { + virReportSystemError(rc, "%s", + _("Failed to initialize libpciaccess")); + return -1; + } + } +#endif + return 0; +} + + +static void +udevPCITranslateDeinit(void) +{ +#if defined __s390__ || defined __s390x_ + /* Nothing was initialized, nothing needs to be cleaned up */ +#else + /* pci_system_cleanup returns void */ + pci_system_cleanup(); +#endif + return; +} + + static bool udevHasDeviceProperty(struct udev_device *dev, const char *key) @@ -1627,19 +1664,6 @@ udevEnumerateDevices(struct udev *udev) } =20 =20 -static void -udevPCITranslateDeinit(void) -{ -#if defined __s390__ || defined __s390x_ - /* Nothing was initialized, nothing needs to be cleaned up */ -#else - /* pci_system_cleanup returns void */ - pci_system_cleanup(); -#endif - return; -} - - static int nodeStateCleanup(void) { @@ -1911,30 +1935,6 @@ nodeStateInitializeEnumerate(void *opaque) =20 =20 static int -udevPCITranslateInit(bool privileged ATTRIBUTE_UNUSED) -{ -#if defined __s390__ || defined __s390x_ - /* On s390(x) system there is no PCI bus. - * Therefore there is nothing to initialize here. */ -#else - int rc; - - if ((rc =3D pci_system_init()) !=3D 0) { - /* Ignore failure as non-root; udev is not as helpful in that - * situation, but a non-privileged user won't benefit much - * from udev in the first place. */ - if (errno !=3D ENOENT && (privileged || errno !=3D EACCES)) { - virReportSystemError(rc, "%s", - _("Failed to initialize libpciaccess")); - return -1; - } - } -#endif - return 0; -} - - -static int nodeStateInitialize(bool privileged, virStateInhibitCallback callback ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 08:40:05 2024 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