<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"纯文本 Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.Char
        {mso-style-name:"纯文本 Char";
        mso-style-priority:99;
        mso-style-link:纯文本;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="#0563C1" vlink="#954F72" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi all:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  I encountered with an AB deadlock and libvirtd crash problem the other day.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  The process to generate the problems:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  1 use the command "virsh create ***.xml" to create a vm<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  2 after vm is running , use the command "virsh console ***" to connect vm with console<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  3 after connection, use the command "virsh destroy ****" to destroy vm and delete it<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  Then, an AB lock problem occurs, or libvirtd got crashed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">AB LOCK stack:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">[Switching to thread 1 (Thread 0x7ff96bf3d7a0 (LWP 9772))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007ff967b49324 in __lll_lock_wait () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007ff967b49324 in __lll_lock_wait () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#1  0x00007ff967b44669 in _L_lock_1008 () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#2  0x00007ff967b4447e in pthread_mutex_lock () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#3  0x00007ff96b3bd96c in virChrdevFDStreamCloseCb () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#4  0x00007ff96b3c9a34 in virFDStreamCloseInt () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#5  0x00007ff96b40ac3e in virStreamAbort () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#6  0x00007ff96bfa242a in daemonStreamHandleAbort ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#7  0x00007ff96bfa2803 in daemonStreamEvent ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#8  0x00007ff96b3c9bfc in virFDStreamEvent () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#9  0x00007ff96b3083aa in virEventPollRunOnce () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#10 0x00007ff96b307042 in virEventRunDefaultImpl () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#11 0x00007ff96b4503dd in virNetDaemonRun () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#12 0x00007ff96bf72528 in main ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">[Switching to thread 12 (Thread 0x7ff9640ff700 (LWP 9778))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007ff967b49324 in __lll_lock_wait () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007ff967b49324 in __lll_lock_wait () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#1  0x00007ff967b44669 in _L_lock_1008 () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#2  0x00007ff967b4447e in pthread_mutex_lock () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#3  0x00007ff96b3c8f26 in virFDStreamSetInternalCloseCb () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#4  0x00007ff96b30f7b9 in virHashForEach () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#5  0x00007ff96b3be1a2 in virChrdevFree () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#6  0x00007ff96055980f in qemuDomainObjPrivateFree () from /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#7  0x00007ff96b367014 in virDomainObjDispose () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#8  0x00007ff96b330c33 in virObjectUnref () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#9  0x00007ff96b35edb9 in virDomainObjEndAPI () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#10 0x00007ff9605c6e89 in qemuDomainUndefineFlags () from /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#11 0x00007ff96b3e35ac in virDomainUndefine () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#12 0x00007ff96bf996db in remoteDispatchDomainUndefineHelper ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#13 0x00007ff96b4537ef in virNetServerProgramDispatch () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#14 0x00007ff96b45205e in virNetServerProcessMsg () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#15 0x00007ff96b4520e8 in virNetServerHandleJob () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#16 0x00007ff96b349f94 in virThreadPoolWorker () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#17 0x00007ff96b3494a8 in virThreadHelper () from /usr/lib64/libvirt.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#18 0x00007ff967b42806 in start_thread () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#19 0x00007ff96789d67d in clone () from /lib64/libc.so.6<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#20 0x0000000000000000 in ?? ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">coredump stack<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(gdb) f 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#1  0x00007f1672a7c73f in virMutexLock (m=0x68) at util/virthread.c:89<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">89          pthread_mutex_lock(&m->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(gdb) bt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007f1670ace444 in pthread_mutex_lock () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#1  0x00007f1672a7c73f in virMutexLock (m=0x68) at util/virthread.c:89<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#2  0x00007f1672b2fda2 in virFDStreamSetInternalCloseCb (st=0x7f1673a1a370, cb=0x0, opaque=0x0, fcb=0x0) at fdstream.c:796<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#3  0x00007f1672b1f5ad in virChrdevFreeClearCallbacks (payload=0x7f1673a1a370, name=0x7f1673a12520, data=0x0) at conf/virchrdev.c:301<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#4  0x00007f1672a36c9b in virHashForEach (table=0x7f1673a0ba20, iter=0x7f1672b1f567 <virChrdevFreeClearCallbacks>, data=0x0) at util/virhash.c:521<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#5  0x00007f1672b1f626 in virChrdevFree (devs=0x7f1673a2f820) at conf/virchrdev.c:316<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#6  0x00007f1669cca988 in qemuDomainObjPrivateFree (data=0x7f1673a1afa0) at qemu/qemu_domain.c:496<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#7  0x00007f1672a9e293 in virDomainObjDispose (obj=0x7f1673a16400) at conf/domain_conf.c:2545<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#8  0x00007f1672a5b326 in virObjectUnref (anyobj=0x7f1673a16400) at util/virobject.c:265<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#9  0x00007f1672a9e7a5 in virDomainObjEndAPI (vm=0x7f166b07d8d0) at conf/domain_conf.c:2684<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#10 0x00007f1669d3ff00 in qemuDomainDestroyFlags (dom=0x7f16600017f0, flags=0) at qemu/qemu_driver.c:2264<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#11 0x00007f1669d3ff69 in qemuDomainDestroy (dom=0x7f16600017f0) at qemu/qemu_driver.c:2273<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#12 0x00007f1672b39333 in virDomainDestroy (domain=0x7f16600017f0) at libvirt-domain.c:483<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#13 0x00007f16737167a5 in remoteDispatchDomainDestroy (server=0x7f167398f4f0, client=0x7f1673a172f0, msg=0x7f1673a2fc70, rerr=0x7f166b07db50, args=0x7f1673a2f9b0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    at remote_dispatch.h:4002<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#14 0x00007f1673716648 in remoteDispatchDomainDestroyHelper (server=0x7f167398f4f0, client=0x7f1673a172f0, msg=0x7f1673a2fc70, rerr=0x7f166b07db50, args=0x7f1673a2f9b0, ret=<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    0x7f1673a10e10) at remote_dispatch.h:3977<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#15 0x00007f1672bd8a9b in virNetServerProgramDispatchCall (prog=0x7f167399c610, server=0x7f167398f4f0, client=0x7f1673a172f0, msg=0x7f1673a2fc70)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    at rpc/virnetserverprogram.c:437<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#16 0x00007f1672bd85fd in virNetServerProgramDispatch (prog=0x7f167399c610, server=0x7f167398f4f0, client=0x7f1673a172f0, msg=0x7f1673a2fc70) at rpc/virnetserverprogram.c:307<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#17 0x00007f1672bd2a08 in virNetServerProcessMsg (srv=0x7f167398f4f0, client=0x7f1673a172f0, prog=0x7f167399c610, msg=0x7f1673a2fc70) at rpc/virnetserver.c:136<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#18 0x00007f1672bd2aed in virNetServerHandleJob (jobOpaque=0x7f1673a1d780, opaque=0x7f167398f4f0) at rpc/virnetserver.c:157<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#19 0x00007f1672a7d833 in virThreadPoolWorker (opaque=0x7f167399bad0) at util/virthreadpool.c:145<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#20 0x00007f1672a7cbec in virThreadHelper (data=0x7f167399c980) at util/virthread.c:206<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#21 0x00007f1670acc806 in start_thread () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#22 0x00007f167082767d in clone () from /lib64/libc.so.6<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#23 0x0000000000000000 in ?? ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(gdb) bt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#0  0x00007f1670ad3324 in __lll_lock_wait () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#1  0x00007f1670ace669 in _L_lock_1008 () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#2  0x00007f1670ace47e in pthread_mutex_lock () from /lib64/libpthread.so.0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#3  0x00007f1672a7c73f in virMutexLock (m=0x7f1673a2f820) at util/virthread.c:89<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#4  0x00007f1672b1f3fe in virChrdevFDStreamCloseCb (st=0x7f1673a1a370, opaque=0x7f1673a149e0) at conf/virchrdev.c:254<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#5  0x00007f1672b2e8a8 in virFDStreamCloseInt (st=0x7f1673a1a370, streamAbort=true) at fdstream.c:329<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#6  0x00007f1672b2e9d5 in virFDStreamAbort (st=0x7f1673a1a370) at fdstream.c:355<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#7  0x00007f1672b7d856 in virStreamAbort (stream=0x7f1673a1a370) at libvirt-stream.c:663<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#8  0x00007f16737497e8 in daemonStreamHandleAbort (client=0x7f1673a1b1b0, stream=0x7f1673a1ec50, msg=0x7f1673a0d660) at stream.c:613<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#9  0x00007f16737499fa in daemonStreamHandleWrite (client=0x7f1673a1b1b0, stream=0x7f1673a1ec50) at stream.c:662<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#10 0x00007f167374866b in daemonStreamEvent (st=0x7f1673a1a370, events=14, opaque=0x7f1673a1b1b0) at stream.c:138<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#11 0x00007f1672b2e17a in virFDStreamEvent (watch=18, fd=17, events=14, opaque=0x7f1673a1a370) at fdstream.c:173<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#12 0x00007f1672a2c2cb in virEventPollDispatchHandles (nfds=12, fds=0x7f1673a2fda0) at util/vireventpoll.c:509<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#13 0x00007f1672a2cb08 in virEventPollRunOnce () at util/vireventpoll.c:658<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#14 0x00007f1672a2a9e0 in virEventRunDefaultImpl () at util/virevent.c:308<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#15 0x00007f1672bd25d2 in virNetDaemonRun (dmn=0x7f1673990ed0) at rpc/virnetdaemon.c:707<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#16 0x00007f167370cad4 in main (argc=3, argv=0x7ffd63276288) at libvirtd.c:1581<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The reason of this problem is that fdstream abort event or close event occured at the same time, libvirtd doesn't deal with the synchronousness well enough.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">the flows about fdStream is bellow<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family:宋体">、</span><span lang="EN-US">qemuDomainDefineXMLFlags -> virDomainObjListAdd  -> qemuDomainObjPrivateAlloc -> virChrdevAlloc -> virHashCreate
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family:宋体">、</span><span lang="EN-US">qemuDomainOpenConsole -> virChrdevOpen -> virHashAddEntry(devs->hash, path, st)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3</span><span style="font-family:宋体">、</span><span lang="EN-US">virDomainObjDispose -> privateDataFreeFunc (qemuDomainObjPrivateFree) - > virChrdevFree(*dev locked*) -> virChrdevFreeClearCallbacks - >  virFDStreamSetInternalCloseCb(*fdst
 locked*) <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">4</span><span style="font-family:宋体">、</span><span lang="EN-US">virFDStreamCloseInt (*fdst locked*) -> icbFreeOpaque(virChrdevFDStreamCloseCb (*dev locked*)) -> virHashRemoveEntry<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The AB lock problem is obviouse: in step 3, it locks chardev before fdst, and in step 4, it's the opsite way.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The reason of libvirtd crash is that: in virFDStreamCloseInt function we set fdst to NULL, while in virFDStreamSetInternalCloseCb we use fdst->lock, note that fdst has already been freed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">another crash problem occurs because that when virChrdevFree was earlier finished, dev->hash freed and all date of hash is freed, but fdstream event flow use fdStream after hash free. Ahha~~</span><span style="font-family:宋体">,</span><span lang="EN-US">
 libvirtd coredump.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">All of those problem is because  clear vm flow and fdStream flow concurs synchronously.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">then I fix this problem by modify virChrdevFree()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">void virChrdevFree(virChrdevsPtr devs)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    if (!devs || !devs->hash)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        return;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    for (;;) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        virMutexLock(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        if (0 == virHashSize(devs->hash)) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            virMutexUnlock(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        virMutexUnlock(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        usleep(10 * 1000);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    virMutexLock(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    virHashFree(devs->hash);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    virMutexUnlock(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    virMutexDestroy(&devs->lock);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    VIR_FREE(devs);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If the chardev is removed by fdStream close or fdStream abort when vm destroy or shutdown, the modification works well. But I'm not sure is that all chardev would be removed when we clear vm,  if not, it would always
 sleep here. <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Another solution is as follows:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virMutexLock(vm);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virChrdevFree();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virMutexUnlock(vm);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virMutexLock(vm);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virFDStreamCloseInt();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">virMutexUnlock(vm);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I lock vm before calling these 2 functions, which makes them run  sequently.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Do you have other better idea to solve this problem. thanks in advance.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  Thanks in advance.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Wei Fuqiang<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                                                                                                         
<o:p></o:p></span></p>
</div>
</body>
</html>