From nobody Sat May 4 00:18:43 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 1504256311857735.4573315177753; Fri, 1 Sep 2017 01:58:31 -0700 (PDT) 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 85A2AC056870; Fri, 1 Sep 2017 08:58:29 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1E6216A563; Fri, 1 Sep 2017 08:58:29 +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 582943FC73; Fri, 1 Sep 2017 08:58:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v818dHMP006448 for ; Fri, 1 Sep 2017 04:39:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id DE14B60BEB; Fri, 1 Sep 2017 08:39:17 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 66CB86062A for ; Fri, 1 Sep 2017 08:39:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 85A2AC056870 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 1 Sep 2017 10:39:10 +0200 Message-Id: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH] virnetdaemon: Don't deadlock when talking to D-Bus 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.32]); Fri, 01 Sep 2017 08:58:30 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.redhat.com/show_bug.cgi?id=3D1487322 In ace45e67abbd I've tried to fix a problem that we get the reply to a D-Bus call while we were sleeping. In that case the callback was never set. So I've changed the code that the callback is called directly in this case. However, I hadn't realized that since callback is called out of order it lock the virNetDaemon. Exactly the very same virNetDaemon that we are dealing with right now and have it locked already (in virNetDaemonAddShutdownInhibition()) Signed-off-by: Michal Privoznik --- src/rpc/virnetdaemon.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c index 00247cfc3..e3b9390af 100644 --- a/src/rpc/virnetdaemon.c +++ b/src/rpc/virnetdaemon.c @@ -439,14 +439,12 @@ virNetDaemonAutoShutdown(virNetDaemonPtr dmn, =20 #if defined(WITH_DBUS) && defined(DBUS_TYPE_UNIX_FD) static void -virNetDaemonGotInhibitReply(DBusPendingCall *pending, - void *opaque) +virNetDaemonGotInhibitReplyLocked(DBusPendingCall *pending, + virNetDaemonPtr dmn) { - virNetDaemonPtr dmn =3D opaque; DBusMessage *reply; int fd; =20 - virObjectLock(dmn); dmn->autoShutdownCallingInhibit =3D false; =20 VIR_DEBUG("dmn=3D%p", dmn); @@ -470,11 +468,22 @@ virNetDaemonGotInhibitReply(DBusPendingCall *pending, virDBusMessageUnref(reply); =20 cleanup: - virObjectUnlock(dmn); dbus_pending_call_unref(pending); } =20 =20 +static void +virNetDaemonGotInhibitReply(DBusPendingCall *pending, + void *opaque) +{ + virNetDaemonPtr dmn =3D opaque; + + virObjectLock(dmn); + virNetDaemonGotInhibitReplyLocked(pending, dmn); + virObjectUnlock(dmn); +} + + /* As per: http://www.freedesktop.org/wiki/Software/systemd/inhibit */ static void virNetDaemonCallInhibit(virNetDaemonPtr dmn, @@ -516,7 +525,7 @@ virNetDaemonCallInhibit(virNetDaemonPtr dmn, 25 * 1000) && pendingReply) { if (dbus_pending_call_get_completed(pendingReply)) { - virNetDaemonGotInhibitReply(pendingReply, dmn); + virNetDaemonGotInhibitReplyLocked(pendingReply, dmn); } else { dbus_pending_call_set_notify(pendingReply, virNetDaemonGotInhibitReply, --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list