[libvirt] [PATCH libvirt v2 4/9] remote: Use domainClientEventCallbacks for remoteReplayConnectionClosedEvent

Marc Hartmayer mhartmay at linux.vnet.ibm.com
Mon May 7 14:54:37 UTC 2018


On Fri, Apr 27, 2018 at 02:19 AM +0200, John Ferlan <jferlan at redhat.com> wrote:
> On 04/26/2018 12:27 PM, Marc Hartmayer wrote:
>> On Thu, Apr 26, 2018 at 05:07 PM +0200, John Ferlan <jferlan at redhat.com> wrote:
>>> On 04/12/2018 08:40 AM, Marc Hartmayer wrote:
>>>> This allows us to get rid of another usage of the global variable
>>>> remoteProgram.
>>>>
>>>> Signed-off-by: Marc Hartmayer <mhartmay at linux.vnet.ibm.com>
>>>> Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
>>>> ---
>>>>  src/remote/remote_daemon_dispatch.c | 18 ++++++++++++++----
>>>>  1 file changed, 14 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
>>>> index b4c0e01b0832..cf2cd0add7d6 100644
>>>> --- a/src/remote/remote_daemon_dispatch.c
>>>> +++ b/src/remote/remote_daemon_dispatch.c
>>>> @@ -1661,12 +1661,12 @@ remoteRelayDomainQemuMonitorEvent(virConnectPtr conn,
>>>>  static
>>>>  void remoteRelayConnectionClosedEvent(virConnectPtr conn ATTRIBUTE_UNUSED, int reason, void *opaque)
>>>>  {
>>>> -    virNetServerClientPtr client = opaque;
>>>> +    daemonClientEventCallbackPtr callback = opaque;
>>>>
>>>>      VIR_DEBUG("Relaying connection closed event, reason %d", reason);
>>>>
>>>>      remote_connect_event_connection_closed_msg msg = { reason };
>>>> -    remoteDispatchObjectEventSend(client, remoteProgram,
>>>> +    remoteDispatchObjectEventSend(callback->client, callback->program,
>>>>                                    REMOTE_PROC_CONNECT_EVENT_CONNECTION_CLOSED,
>>>>                                    (xdrproc_t)xdr_remote_connect_event_connection_closed_msg,
>>>>                                    &msg);
>>>> @@ -3836,6 +3836,7 @@ remoteDispatchConnectRegisterCloseCallback(virNetServerPtr server ATTRIBUTE_UNUS
>>>>                                             virNetMessageErrorPtr rerr)
>>>>  {
>>>>      int rv = -1;
>>>> +    daemonClientEventCallbackPtr callback = NULL;
>>>>      struct daemonClientPrivate *priv =
>>>>          virNetServerClientGetPrivateData(client);
>>>>
>>>> @@ -3846,9 +3847,16 @@ remoteDispatchConnectRegisterCloseCallback(virNetServerPtr server ATTRIBUTE_UNUS
>>>>          goto cleanup;
>>>>      }
>>>>
>>>> +    if (VIR_ALLOC(callback) < 0)
>>>> +        goto cleanup;
>>>> +    callback->client = virObjectRef(client);
>>>
>>> Oh and this would seem to fix a problem with the callback possibly using
>>> @client after it had been freed!
>>
>> The problem is more of a theoretical nature as Nikolay had explained:
>>
>> “Refcounting was here originally but then removed in [1] as it conflicts with
>> virConnectRegisterCloseCallback returns 0 in case connectRegisterCloseCallback
>> is not implemented. This is safe though (at least nobody touch this place :).
>>
>> [1] ce35122cfe: "daemon: fixup refcounting in close callback handling"”
>>
>>>
>>>> +    callback->program = virObjectRef(remoteProgram);
>>>> +    /* eventID, callbackID, and legacy are not used */
>>>> +    callback->eventID = -1;
>>>> +    callback->callbackID = -1;
>>>>      if (virConnectRegisterCloseCallback(priv->conn,
>>>>                                          remoteRelayConnectionClosedEvent,
>>>> -                                        client, NULL) < 0)
>>>> +                                        callback, remoteEventCallbackFree) < 0)
>>>>          goto cleanup;
>>>>
>>>
>>> @callback would be leaked in the normal path...
>>
>> By normal path, you mean without the first patch?
>>
>
> I was following how the other register functions proceeded and they
> saved the callback in a list to be freed at unregister.  So if Register
> succeeds, rv == 0 and the removeEventCallbackFree(callback) isn't called
> and we leak callback.  At least that's how I read it

First - sorry for the late response!

The unregister/free’ing is either done within the
'remoteClientFreePrivateCallbacks' call or by an explicit call of
'remoteDispatchConnectUnregisterCloseCallback'. Do we agree on this? If
yes: the function 'remoteClientFreePrivateCallbacks' calls the
virConnectUnregisterCloseCallback -> remoteEventCallbackFree => no
memory leak.

There will be only a memory leak if the virConnectRegisterCloseCallback
call succeeds but the used driver had no support for registering a close
callback (conn->driver->connectRegisterCloseCallback was NULL) AND the
first patch of this series were not applied.

Did I miss something?

>

[…snip…]

>
--
Beste Grüße / Kind regards
   Marc Hartmayer

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294





More information about the libvir-list mailing list