[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: port leak when starting a translator

From: Richard Braun
Subject: Re: port leak when starting a translator
Date: Thu, 5 May 2011 12:32:00 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

On Thu, May 05, 2011 at 12:55:46AM +0200, Samuel Thibault wrote:
> I've noticed a port leak on buildds when starting a translator. The
> backtrace of the port allocation is this:
> _ports_create_port_internal
> ports_create_port_noinstall
> diskfs_start_protid
> diskfs_create_protid
> diskfs_S_dir_lookup (libdiskfs/dir-lookup.c:260)
> _Xdir_lookup
> What I understand from the diskfs_S_dir_lookup code with my poor
> libports knowledge:
> - diskfs_make_peropen (dnp, 0, dircred->po, &newpo) creates a peropen
>   structure "newpo". Its reference counter is initialized to 0.
> - diskfs_create_portid(newpo, user, &newpi) creates a libport port with 
> receive right. Its
>   reference count is initialized to 1. newpo is made to reference it,
>   its reference counter gets increased to 1. The port right is added to
>   the diskfs_port_bucket portset.
> - dirport = ports_get_send_right(newpi) adds a port send right to newpi, whose
>   reference counter gets increased to 2.
> - ports_port_deref(newpi) drops a reference, the counter thus gets back
>   to 1. As I understand it, it's supposed to be the send one.
> - newpi=0 forgets about the receive part of newpi, only the send part
>   dirport remains.
> - dirport is given to fshelp_fetch_root(), which copies its send right
>   only.
> - mach_port_deallocate (mach_task_self(), dirport); release a send
>   right.
> I'm unsure how the receive part of the kernel port in newpi port is
> supposed to get deallocated in that scenario, I guess the send right
> release at the end is supposed to trigger NOTIFY_NO_SENDERS, and
> libports handles deallocation from that?  The thing is that it doesn't
> seem to happen, thus leaving a port leak here.
> Any idea?

Does this leak appear often ? It seems to be triggered by starting a new
translator only. I only took a quick look but are you sure the dirport
(which is copied as dotdot in fshelp_fetch_root()) isn't kept around in
the "child" translator as long as it runs, as a reference to the
translator managing .. (that is, ports[INIT_PORT_CWDIR]) ? In addition,
is this a mach port leak or a libports leak ?

Richard Braun

reply via email to

[Prev in Thread] Current Thread [Next in Thread]