Re: [PATCH net-next v2 1/3] tools/ynl: Make YnlFamily closeable as a context manager

Nikolay Aleksandrov
2026-04-14T05:57:45Z

On 4/14/26 01:08, Daniel Borkmann wrote:
> YnlFamily opens an AF_NETLINK socket in __init__ but has no way
> to release it other than leaving it to the GC. YnlFamily holds a
> self reference cycle through SpecFamily's self.family = self
> in its super().__init__() call, so refcount GC cannot reclaim
> it and the socket stays open until the cyclic GC runs.
>
> If a test creates a guest netns, instantiates a YnlFamily inside
> it via NetNSEnter(), performs some test case work via Ynl, and
> then deletes the netns, then the 'ip netns del' only drops the
> mount binding and cleanup_net in the kernel never runs, so any
> subsequent test case assertions that objects got cleaned up would
> fail given this only gets triggered later via cyclic GC run.
>
> Add an explicit close() that closes the netlink socket and wire
> up the __enter__/__exit__ so callers can scope the instance
> deterministically via 'with YnlFamily(...) as ynl: ...'.
>
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> ---
> tools/net/ynl/pyynl/lib/ynl.py | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/tools/net/ynl/pyynl/lib/ynl.py b/tools/net/ynl/pyynl/lib/ynl.py
> index 9c078599cea0..f63c6f828735 100644
> --- a/tools/net/ynl/pyynl/lib/ynl.py
> +++ b/tools/net/ynl/pyynl/lib/ynl.py
> @@ -731,6 +731,16 @@ class YnlFamily(SpecFamily):
> bound_f = functools.partial(self._op, op_name)
> setattr(self, op.ident_name, bound_f)
>
> + def close(self):
> + if self.sock is not None:
> + self.sock.close()
> + self.sock = None
> +
> + def __enter__(self):
> + return self
> +
> + def __exit__(self, exc_type, exc, tb):
> + self.close()
>
> def ntf_subscribe(self, mcast_name):
> mcast_id = self.nlproto.get_mcast_id(mcast_name, self.mcast_groups)

Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>