[libvirt] [PATCH] fix bug libvirt daemon deadlock when another force console break down an existed console client when this deadlock hanppened, libvirtd backtrace as follow, a typical ABBA deadlock circumstance:
Michal Privoznik
mprivozn at redhat.com
Tue Nov 19 15:41:39 UTC 2019
On 11/19/19 12:39 PM, LanceLiu wrote:
> (gdb) thread 23
> [Switching to thread 23 (Thread 0x7fbb54810700 (LWP 296966))]
> (gdb) bt
> at rpc/virnetserverclient.c:1503
> client=client at entry=0x5641d20e20a0, msg=0x7fbb08003ab0, rerr=rerr at entry=0x7fbb5480f7b0, procedure=201,
> type=type at entry=3, serial=9) at rpc/virnetserverprogram.c:173
> msg=<optimized out>, rerr=rerr at entry=0x7fbb5480f7b0, procedure=<optimized out>, serial=<optimized out>)
> at rpc/virnetserverprogram.c:222
> opaque=opaque at entry=0x5641d20e20a0) at stream.c:246
> force=force at entry=true) at conf/virchrdev.c:386
> at qemu/qemu_driver.c:16188
> st=st at entry=0x7fbb08008fc0, flags=1) at libvirt-domain.c:9363
> rerr=0x7fbb5480fc10, msg=<optimized out>, client=0x5641d20e4e80) at remote_dispatch.h:8540
> rerr=0x7fbb5480fc10, args=0x7fbb08005eb0, ret=<optimized out>) at remote_dispatch.h:8505
> server=0x5641d20be420, prog=0x5641d20da580) at rpc/virnetserverprogram.c:437
> msg=0x5641d20e9a20) at rpc/virnetserverprogram.c:307
> srv=0x5641d20be420) at rpc/virnetserver.c:148
> ---Type <return> to continue, or q <return> to quit---
>
> (gdb) thread 26
> [Switching to thread 26 (Thread 0x7fbb87a378c0 (LWP 295636))]
> (gdb) bt
> at stream.c:286
> at rpc/virnetserverclient.c:1247
> at rpc/virnetserverclient.c:1457
> at util/vireventpoll.c:508
>
> Signed-off-by: LanceLiu <liu.lance.89 at gmail.com>
> ---
> src/remote/remote_daemon_stream.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/src/remote/remote_daemon_stream.c b/src/remote/remote_daemon_stream.c
> index 1f6e783..b27348f 100644
> --- a/src/remote/remote_daemon_stream.c
> +++ b/src/remote/remote_daemon_stream.c
> @@ -284,14 +284,16 @@ daemonStreamEvent(virStreamPtr st, int events, void *opaque)
> * -1 on fatal client error
> */
> static int
> -daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +daemonStreamFilter(virNetServerClientPtr client,
This does not look rebased onto current git HEAD ;-) "Luckily", the
problem you're fixing is still there.
> virNetMessagePtr msg,
> void *opaque)
> {
> daemonClientStream *stream = opaque;
> int ret = 0;
>
> + virObjectUnlock(client);
> virMutexLock(&stream->priv->lock);
> + virObjectLock(client);
>
> if (msg->header.type != VIR_NET_STREAM &&
> msg->header.type != VIR_NET_STREAM_HOLE)
>
I've reworded the commit message, put a comment to
virNetServerClientFilterFunc() typedef, ACKed and pushed.
Congratulations on your first libvirt contribution!
Michal
More information about the libvir-list
mailing list