[libvirt] [PATCH v4 2/2] remote: Move the call to remoteClientFreePrivateCallbacks from FreeFunc to CloseFunc

xinhua.Cao caoxinhua at huawei.com
Tue Nov 14 02:06:47 UTC 2017



在 2017/11/13 22:31, Martin Kletzander 写道:
> On Mon, Nov 13, 2017 at 09:07:58PM +0800, xinhua.Cao wrote:
>> Still because of commit id 'fe8f1c8b' where we generate a REF for the
>> Register and that's transparent to the consumer (e.g. how would they
>> know they need to ensure that Deregister is called), thus the purpose of
>> this patch is to find a way to Deregister if it's determined that the
>> consumer hasn't by the time of the "last" REF we'd have.
>> This solution to this problem is to alter the processing to have the
>> remoteClientCloseFunc handle performing the Deregister calls instead of
>> the remoteClientFreeFunc because there's no way FreeFunc would be called
>> unless the Deregister was already called.
>
> Oh, this would explain the missing bit that I was probably missing.  
> This patch
> looks like what I really wanted this to be handled as, but still, 
> would you be
> able to sketch out a reproducer for the unlucky ones, like me? Thanks 
> a lot.
>
I find this unlucky one by watch the growing of libvirt memory(top -b -d 
30 -p $libvirtd_pid).
the memory always grow up when I kill my client. so I watch the client 
refs then find this unlucky one.
>> ---
>> daemon/remote.c | 10 ++++++----
>> 1 file changed, 6 insertions(+), 4 deletions(-)
>>
>> diff --git a/daemon/remote.c b/daemon/remote.c
>> index 2dcec1e..c2111ae 100644
>> --- a/daemon/remote.c
>> +++ b/daemon/remote.c
>> @@ -1738,11 +1738,9 @@ void remoteClientFreeFunc(void *data)
>> {
>>     struct daemonClientPrivate *priv = data;
>>
>> -    /* Deregister event delivery callback */
>> -    if (priv->conn) {
>> -        remoteClientFreePrivateCallbacks(priv);
>> +    if (priv->conn)
>>         virConnectClose(priv->conn);
>> -    }
>> +
>>     VIR_FREE(priv);
>> }
>>
>> @@ -1752,6 +1750,10 @@ static void 
>> remoteClientCloseFunc(virNetServerClientPtr client)
>>     struct daemonClientPrivate *priv = 
>> virNetServerClientGetPrivateData(client);
>>
>>     daemonRemoveAllClientStreams(priv->streams);
>> +
>> +    /* Deregister event delivery callback */
>> +    if (priv->conn)
>> +        remoteClientFreePrivateCallbacks(priv);
>> }
>>
>>
>> -- 
>> 2.8.3
>>
>>
>> -- 
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list





More information about the libvir-list mailing list