From nobody Sat Apr 20 16:02:11 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1520359145051226.97490928283207; Tue, 6 Mar 2018 09:59:05 -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 6D51C776C5; Tue, 6 Mar 2018 17:59:03 +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 460BC600D3; Tue, 6 Mar 2018 17:59:03 +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 0D58D4A471; Tue, 6 Mar 2018 17:59:03 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w26HwvwU002049 for ; Tue, 6 Mar 2018 12:58:57 -0500 Received: by smtp.corp.redhat.com (Postfix) id C9A141C71C; Tue, 6 Mar 2018 17:58:57 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.54]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3ED001C71B; Tue, 6 Mar 2018 17:58:57 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 6 Mar 2018 17:58:48 +0000 Message-Id: <20180306175852.18773-2-berrange@redhat.com> In-Reply-To: <20180306175852.18773-1-berrange@redhat.com> References: <20180306175852.18773-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/5] rpc: push ref acquisition into RPC dispatch function 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: , Content-Type: text/plain; charset="utf-8" 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]); Tue, 06 Mar 2018 17:59:03 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 There's no reason why the virNetServerClientDispatchRead method needs to acquire an extra reference on the "client" object. An extra reference is only needed if the registered dispatch callback is going to keep hold of the "client" for work in the background. Thus we can push reference acquisition into virNetServerDispatchNewMessage. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Jim Fehlig Reviewed-by: John Ferlan --- src/rpc/virnetserver.c | 2 ++ src/rpc/virnetserverclient.c | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 204f425264..28afe54e49 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -217,9 +217,11 @@ static int virNetServerDispatchNewMessage(virNetServer= ClientPtr client, priority =3D virNetServerProgramGetPriority(prog, msg->header.= proc); } =20 + virObjectRef(client); ret =3D virThreadPoolSendJob(srv->workers, priority, job); =20 if (ret < 0) { + virObjectUnref(client); VIR_FREE(job); virObjectUnref(prog); } diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c index 388514946b..00459d17ba 100644 --- a/src/rpc/virnetserverclient.c +++ b/src/rpc/virnetserverclient.c @@ -1315,12 +1315,10 @@ static void virNetServerClientDispatchRead(virNetSe= rverClientPtr client) =20 /* Send off to for normal dispatch to workers */ if (msg) { - virObjectRef(client); if (!client->dispatchFunc || client->dispatchFunc(client, msg, client->dispatchOpaque) = < 0) { virNetMessageFree(msg); client->wantClose =3D true; - virObjectUnref(client); return; } } --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 16:02:11 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1520359141233239.4711799593208; Tue, 6 Mar 2018 09:59:01 -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 E60EF2D6A08; Tue, 6 Mar 2018 17:58:59 +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 BFFB8600D3; Tue, 6 Mar 2018 17:58:59 +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 849F518033ED; Tue, 6 Mar 2018 17:58:59 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w26Hwwkd002056 for ; Tue, 6 Mar 2018 12:58:58 -0500 Received: by smtp.corp.redhat.com (Postfix) id 956761C71C; Tue, 6 Mar 2018 17:58:58 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.54]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0AA771C71B; Tue, 6 Mar 2018 17:58:57 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 6 Mar 2018 17:58:49 +0000 Message-Id: <20180306175852.18773-3-berrange@redhat.com> In-Reply-To: <20180306175852.18773-1-berrange@redhat.com> References: <20180306175852.18773-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/5] rpc: simplify calling convention of virNetServerClientDispatchFunc 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: , Content-Type: text/plain; charset="utf-8" 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.29]); Tue, 06 Mar 2018 17:59:00 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Currently virNetServerClientDispatchFunc implementations are only responsible for free'ing the "msg" parameter upon success. Simplify the calling convention by making it their unconditional responsibility to free the "msg", and close the client if desired. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Jim Fehlig Reviewed-by: John Ferlan --- src/rpc/virnetserver.c | 24 +++++++++++++----------- src/rpc/virnetserverclient.c | 6 +++--- src/rpc/virnetserverclient.h | 9 ++++++--- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 28afe54e49..7a1376bf49 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -182,15 +182,14 @@ static void virNetServerHandleJob(void *jobOpaque, vo= id *opaque) VIR_FREE(job); } =20 -static int virNetServerDispatchNewMessage(virNetServerClientPtr client, - virNetMessagePtr msg, - void *opaque) +static void virNetServerDispatchNewMessage(virNetServerClientPtr client, + virNetMessagePtr msg, + void *opaque) { virNetServerPtr srv =3D opaque; virNetServerProgramPtr prog =3D NULL; unsigned int priority =3D 0; size_t i; - int ret =3D -1; =20 VIR_DEBUG("server=3D%p client=3D%p message=3D%p", srv, client, msg); @@ -207,7 +206,7 @@ static int virNetServerDispatchNewMessage(virNetServerC= lientPtr client, virNetServerJobPtr job; =20 if (VIR_ALLOC(job) < 0) - goto cleanup; + goto error; =20 job->client =3D client; job->msg =3D msg; @@ -218,21 +217,24 @@ static int virNetServerDispatchNewMessage(virNetServe= rClientPtr client, } =20 virObjectRef(client); - ret =3D virThreadPoolSendJob(srv->workers, priority, job); - - if (ret < 0) { + if (virThreadPoolSendJob(srv->workers, priority, job) < 0) { virObjectUnref(client); VIR_FREE(job); virObjectUnref(prog); + goto error; } } else { - ret =3D virNetServerProcessMsg(srv, client, prog, msg); + if (virNetServerProcessMsg(srv, client, prog, msg) < 0) + goto error; } =20 - cleanup: virObjectUnlock(srv); + return; =20 - return ret; + error: + virNetMessageFree(msg); + virNetServerClientClose(client); + virObjectUnlock(srv); } =20 /** diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c index 00459d17ba..ea0d5abdee 100644 --- a/src/rpc/virnetserverclient.c +++ b/src/rpc/virnetserverclient.c @@ -1315,11 +1315,11 @@ static void virNetServerClientDispatchRead(virNetSe= rverClientPtr client) =20 /* Send off to for normal dispatch to workers */ if (msg) { - if (!client->dispatchFunc || - client->dispatchFunc(client, msg, client->dispatchOpaque) = < 0) { + if (!client->dispatchFunc) { virNetMessageFree(msg); client->wantClose =3D true; - return; + } else { + client->dispatchFunc(client, msg, client->dispatchOpaque); } } =20 diff --git a/src/rpc/virnetserverclient.h b/src/rpc/virnetserverclient.h index 1a939ad4e1..b21446eeb7 100644 --- a/src/rpc/virnetserverclient.h +++ b/src/rpc/virnetserverclient.h @@ -36,9 +36,12 @@ typedef virNetServer *virNetServerPtr; typedef struct _virNetServerClient virNetServerClient; typedef virNetServerClient *virNetServerClientPtr; =20 -typedef int (*virNetServerClientDispatchFunc)(virNetServerClientPtr client, - virNetMessagePtr msg, - void *opaque); +/* This function owns the "msg" pointer it is passed and + * must arrange for virNetMessageFree to be called on it + */ +typedef void (*virNetServerClientDispatchFunc)(virNetServerClientPtr clien= t, + virNetMessagePtr msg, + void *opaque); =20 typedef int (*virNetServerClientFilterFunc)(virNetServerClientPtr client, virNetMessagePtr msg, --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 16:02:11 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 152035914317257.254686190640655; Tue, 6 Mar 2018 09:59:03 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F1E2B757DC; Tue, 6 Mar 2018 17:59:01 +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 C81275D75A; Tue, 6 Mar 2018 17:59:01 +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 9047D18033EF; Tue, 6 Mar 2018 17:59:01 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w26HwxC2002072 for ; Tue, 6 Mar 2018 12:58:59 -0500 Received: by smtp.corp.redhat.com (Postfix) id 5F1451C71D; Tue, 6 Mar 2018 17:58:59 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.54]) by smtp.corp.redhat.com (Postfix) with ESMTP id CA98B1C720; Tue, 6 Mar 2018 17:58:58 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 6 Mar 2018 17:58:50 +0000 Message-Id: <20180306175852.18773-4-berrange@redhat.com> In-Reply-To: <20180306175852.18773-1-berrange@redhat.com> References: <20180306175852.18773-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/5] rpc: invoke the message dispatch callback with client unlocked 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: , Content-Type: text/plain; charset="utf-8" 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 06 Mar 2018 17:59:02 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Currently if the virNetServer instance is created with max_workers=3D=3D0 to request a non-threaded dispatch process, we deadlock during dispatch #0 0x00007fb845f6f42d in __lll_lock_wait () from /lib64/libpthread.so.0 #1 0x00007fb845f681d3 in pthread_mutex_lock () from /lib64/libpthread.so= .0 #2 0x000055a6628bb305 in virMutexLock (m=3D) at util/virt= hread.c:89 #3 0x000055a6628a984b in virObjectLock (anyobj=3D) at uti= l/virobject.c:435 #4 0x000055a66286fcde in virNetServerClientIsAuthenticated (client=3Dcli= ent@entry=3D0x55a663a7b960) at rpc/virnetserverclient.c:1565 #5 0x000055a66286cc17 in virNetServerProgramDispatchCall (msg=3D0x55a663= a7bc50, client=3D0x55a663a7b960, server=3D0x55a663a77550, prog=3D0x55a663a78020) at rpc/virnetserverpr= ogram.c:407 #6 virNetServerProgramDispatch (prog=3Dprog@entry=3D0x55a663a78020, serv= er=3Dserver@entry=3D0x55a663a77550, client=3Dclient@entry=3D0x55a663a7b960, msg=3Dmsg@entry=3D0x55a663a7b= c50) at rpc/virnetserverprogram.c:307 #7 0x000055a662871d56 in virNetServerProcessMsg (msg=3D0x55a663a7bc50, p= rog=3D0x55a663a78020, client=3D0x55a663a7b960, srv=3D0x55a663a77550) at rpc/virnetserver.c:148 #8 virNetServerDispatchNewMessage (client=3D0x55a663a7b960, msg=3D0x55a6= 63a7bc50, opaque=3D0x55a663a77550) at rpc/virnetserver.c:227 #9 0x000055a66286e4c0 in virNetServerClientDispatchRead (client=3Dclient= @entry=3D0x55a663a7b960) at rpc/virnetserverclient.c:1322 #10 0x000055a66286e813 in virNetServerClientDispatchEvent (sock=3D, events=3D1, opaque=3D0x55a663a7b960) at rpc/virnetserverclient.c:1507 #11 0x000055a662899be0 in virEventPollDispatchHandles (fds=3D0x55a663a7bd= c0, nfds=3D) at util/vireventpoll.c:508 #12 virEventPollRunOnce () at util/vireventpoll.c:657 #13 0x000055a6628982f1 in virEventRunDefaultImpl () at util/virevent.c:327 #14 0x000055a6628716d5 in virNetDaemonRun (dmn=3D0x55a663a771b0) at rpc/v= irnetdaemon.c:858 #15 0x000055a662864c1d in main (argc=3D, argv=3D0x7ffd105b= 4838) at logging/log_daemon.c:1235 Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Jim Fehlig Reviewed-by: John Ferlan --- src/rpc/virnetserverclient.c | 79 ++++++++++++++++++++++++++++++----------= ---- 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c index ea0d5abdee..fb4775235d 100644 --- a/src/rpc/virnetserverclient.c +++ b/src/rpc/virnetserverclient.c @@ -143,7 +143,7 @@ VIR_ONCE_GLOBAL_INIT(virNetServerClient) =20 static void virNetServerClientDispatchEvent(virNetSocketPtr sock, int even= ts, void *opaque); static void virNetServerClientUpdateEvent(virNetServerClientPtr client); -static void virNetServerClientDispatchRead(virNetServerClientPtr client); +static virNetMessagePtr virNetServerClientDispatchRead(virNetServerClientP= tr client); static int virNetServerClientSendMessageLocked(virNetServerClientPtr clien= t, virNetMessagePtr msg); =20 @@ -340,18 +340,41 @@ virNetServerClientCheckAccess(virNetServerClientPtr c= lient) } #endif =20 +static void virNetServerClientDispatchMessage(virNetServerClientPtr client, + virNetMessagePtr msg) +{ + virObjectLock(client); + if (!client->dispatchFunc) { + virNetMessageFree(msg); + client->wantClose =3D true; + virObjectUnlock(client); + } else { + virObjectUnlock(client); + /* Accessing 'client' is safe, because virNetServerClientSetDispat= cher + * only permits setting 'dispatchFunc' once, so if non-NULL, it wi= ll + * never change again + */ + client->dispatchFunc(client, msg, client->dispatchOpaque); + } +} + =20 static void virNetServerClientSockTimerFunc(int timer, void *opaque) { virNetServerClientPtr client =3D opaque; + virNetMessagePtr msg =3D NULL; virObjectLock(client); virEventUpdateTimeout(timer, -1); /* Although client->rx !=3D NULL when this timer is enabled, it might = have * changed since the client was unlocked in the meantime. */ if (client->rx) - virNetServerClientDispatchRead(client); + msg =3D virNetServerClientDispatchRead(client); virObjectUnlock(client); + + if (msg) { + virNetServerClientDispatchMessage(client, msg); + } } =20 =20 @@ -950,8 +973,13 @@ void virNetServerClientSetDispatcher(virNetServerClien= tPtr client, void *opaque) { virObjectLock(client); - client->dispatchFunc =3D func; - client->dispatchOpaque =3D opaque; + /* Only set dispatcher if not already set, to avoid race + * with dispatch code that runs without locks held + */ + if (!client->dispatchFunc) { + client->dispatchFunc =3D func; + client->dispatchOpaque =3D opaque; + } virObjectUnlock(client); } =20 @@ -1196,26 +1224,32 @@ static ssize_t virNetServerClientRead(virNetServerC= lientPtr client) =20 =20 /* - * Read data until we get a complete message to process + * Read data until we get a complete message to process. + * If a complete message is available, it will be returned + * from this method, for dispatch by the caller. + * + * Returns a complete message for dispatch, or NULL if none is + * yet available, or an error occurred. On error, the wantClose + * flag will be set. */ -static void virNetServerClientDispatchRead(virNetServerClientPtr client) +static virNetMessagePtr virNetServerClientDispatchRead(virNetServerClientP= tr client) { readmore: if (client->rx->nfds =3D=3D 0) { if (virNetServerClientRead(client) < 0) { client->wantClose =3D true; - return; /* Error */ + return NULL; /* Error */ } } =20 if (client->rx->bufferOffset < client->rx->bufferLength) - return; /* Still not read enough */ + return NULL; /* Still not read enough */ =20 /* Either done with length word header */ if (client->rx->bufferLength =3D=3D VIR_NET_MESSAGE_LEN_MAX) { if (virNetMessageDecodeLength(client->rx) < 0) { client->wantClose =3D true; - return; + return NULL; } =20 virNetServerClientUpdateEvent(client); @@ -1236,7 +1270,7 @@ static void virNetServerClientDispatchRead(virNetServ= erClientPtr client) virNetMessageQueueServe(&client->rx); virNetMessageFree(msg); client->wantClose =3D true; - return; + return NULL; } =20 /* Now figure out if we need to read more data to get some @@ -1246,7 +1280,7 @@ static void virNetServerClientDispatchRead(virNetServ= erClientPtr client) virNetMessageQueueServe(&client->rx); virNetMessageFree(msg); client->wantClose =3D true; - return; /* Error */ + return NULL; /* Error */ } =20 /* Try getting the file descriptors (may fail if blocking) */ @@ -1256,7 +1290,7 @@ static void virNetServerClientDispatchRead(virNetServ= erClientPtr client) virNetMessageQueueServe(&client->rx); virNetMessageFree(msg); client->wantClose =3D true; - return; + return NULL; } if (rv =3D=3D 0) /* Blocking */ break; @@ -1270,7 +1304,7 @@ static void virNetServerClientDispatchRead(virNetServ= erClientPtr client) * again next time we run this method */ client->rx->bufferOffset =3D client->rx->bufferLength; - return; + return NULL; } } =20 @@ -1313,16 +1347,6 @@ static void virNetServerClientDispatchRead(virNetSer= verClientPtr client) } } =20 - /* Send off to for normal dispatch to workers */ - if (msg) { - if (!client->dispatchFunc) { - virNetMessageFree(msg); - client->wantClose =3D true; - } else { - client->dispatchFunc(client, msg, client->dispatchOpaque); - } - } - /* Possibly need to create another receive buffer */ if (client->nrequests < client->nrequests_max) { if (!(client->rx =3D virNetMessageNew(true))) { @@ -1338,6 +1362,8 @@ static void virNetServerClientDispatchRead(virNetServ= erClientPtr client) } } virNetServerClientUpdateEvent(client); + + return msg; } } =20 @@ -1482,6 +1508,7 @@ static void virNetServerClientDispatchEvent(virNetSocketPtr sock, int events, void *op= aque) { virNetServerClientPtr client =3D opaque; + virNetMessagePtr msg =3D NULL; =20 virObjectLock(client); =20 @@ -1504,7 +1531,7 @@ virNetServerClientDispatchEvent(virNetSocketPtr sock,= int events, void *opaque) virNetServerClientDispatchWrite(client); if (events & VIR_EVENT_HANDLE_READABLE && client->rx) - virNetServerClientDispatchRead(client); + msg =3D virNetServerClientDispatchRead(client); #if WITH_GNUTLS } #endif @@ -1517,6 +1544,10 @@ virNetServerClientDispatchEvent(virNetSocketPtr sock= , int events, void *opaque) client->wantClose =3D true; =20 virObjectUnlock(client); + + if (msg) { + virNetServerClientDispatchMessage(client, msg); + } } =20 =20 --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 16:02:11 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1520359146289717.027548087908; Tue, 6 Mar 2018 09:59:06 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E94984ACA4; Tue, 6 Mar 2018 17:59:04 +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 B500460BE6; Tue, 6 Mar 2018 17:59:04 +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 42A9318033F1; Tue, 6 Mar 2018 17:59:04 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w26Hx0nY002078 for ; Tue, 6 Mar 2018 12:59:00 -0500 Received: by smtp.corp.redhat.com (Postfix) id 3B52A1C71C; Tue, 6 Mar 2018 17:59:00 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.54]) by smtp.corp.redhat.com (Postfix) with ESMTP id 94F011C71E; Tue, 6 Mar 2018 17:58:59 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 6 Mar 2018 17:58:51 +0000 Message-Id: <20180306175852.18773-5-berrange@redhat.com> In-Reply-To: <20180306175852.18773-1-berrange@redhat.com> References: <20180306175852.18773-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/5] rpc: avoid crashing in pre-exec if no workers are present 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: , Content-Type: text/plain; charset="utf-8" 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 06 Mar 2018 17:59:05 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 If max_workers is set to zero, then the worker thread pool won't be created, so when serializing state for pre-exec we must set various parameters to zero. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Jim Fehlig --- src/rpc/virnetserver.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 7a1376bf49..3ce21a8f53 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -580,18 +580,21 @@ virJSONValuePtr virNetServerPreExecRestart(virNetServ= erPtr srv) goto error; =20 if (virJSONValueObjectAppendNumberUint(object, "min_workers", + srv->workers =3D=3D NULL ? 0 : virThreadPoolGetMinWorkers(srv-= >workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set min_workers data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "max_workers", + srv->workers =3D=3D NULL ? 0 : virThreadPoolGetMaxWorkers(srv-= >workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set max_workers data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "priority_workers", + srv->workers =3D=3D NULL ? 0 : virThreadPoolGetPriorityWorkers= (srv->workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set priority_workers data in JSON documen= t")); --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 16:02:11 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; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 152035914660746.84764466986826; Tue, 6 Mar 2018 09:59:06 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5AC7C81DEC; Tue, 6 Mar 2018 17:59: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 2FFC660C7B; Tue, 6 Mar 2018 17:59:05 +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 D9E9B18033F4; Tue, 6 Mar 2018 17:59:04 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w26Hx1d4002091 for ; Tue, 6 Mar 2018 12:59:01 -0500 Received: by smtp.corp.redhat.com (Postfix) id 05AC11C71B; Tue, 6 Mar 2018 17:59:01 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.54]) by smtp.corp.redhat.com (Postfix) with ESMTP id 70C1D1C71E; Tue, 6 Mar 2018 17:59:00 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 6 Mar 2018 17:58:52 +0000 Message-Id: <20180306175852.18773-6-berrange@redhat.com> In-Reply-To: <20180306175852.18773-1-berrange@redhat.com> References: <20180306175852.18773-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 5/5] rpc: switch virtlockd and virtlogd to use single-threaded dispatch 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: , Content-Type: text/plain; charset="utf-8" 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 06 Mar 2018 17:59:05 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Currently both virtlogd and virtlockd use a single worker thread for dispatching RPC messages. Even this is overkill and their RPC message handling callbacks all run in short, finite time and so blocking the main loop is not an issue like you'd see in libvirtd with long running QEMU commands. By setting max_workers=3D=3D0, we can turn off the worker thread and run these daemons single threaded. This in turn fixes a serious problem in the virtlockd daemon whereby it looses all fcntl() locks at re-exec due to multiple threads existing. fcntl() locks only get preserved if the process is single threaded at time of exec(). Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Jim Fehlig Reviewed-by: John Ferlan --- src/locking/lock_daemon.c | 4 ++-- src/logging/log_daemon.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c index 79ab90fc91..7afff42246 100644 --- a/src/locking/lock_daemon.c +++ b/src/locking/lock_daemon.c @@ -165,7 +165,7 @@ virLockDaemonNew(virLockDaemonConfigPtr config, bool pr= ivileged) goto error; =20 if (!(srv =3D virNetServerNew("virtlockd", 1, - 1, 1, 0, config->max_clients, + 0, 0, 0, config->max_clients, config->max_clients, -1, 0, NULL, virLockDaemonClientNew, @@ -180,7 +180,7 @@ virLockDaemonNew(virLockDaemonConfigPtr config, bool pr= ivileged) srv =3D NULL; =20 if (!(srv =3D virNetServerNew("admin", 1, - 1, 1, 0, config->admin_max_clients, + 0, 0, 0, config->admin_max_clients, config->admin_max_clients, -1, 0, NULL, remoteAdmClientNew, diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c index d54d26ab9d..35d7ebb6d2 100644 --- a/src/logging/log_daemon.c +++ b/src/logging/log_daemon.c @@ -154,7 +154,7 @@ virLogDaemonNew(virLogDaemonConfigPtr config, bool priv= ileged) goto error; =20 if (!(srv =3D virNetServerNew("virtlogd", 1, - 1, 1, 0, config->max_clients, + 0, 0, 0, config->max_clients, config->max_clients, -1, 0, NULL, virLogDaemonClientNew, @@ -169,7 +169,7 @@ virLogDaemonNew(virLogDaemonConfigPtr config, bool priv= ileged) srv =3D NULL; =20 if (!(srv =3D virNetServerNew("admin", 1, - 1, 1, 0, config->admin_max_clients, + 0, 0, 0, config->admin_max_clients, config->admin_max_clients, -1, 0, NULL, remoteAdmClientNew, --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list