Petr Horáček has uploaded a new change for review. Change subject: netlink: rtnl_put_link after rtnl_link_get_kernel ......................................................................
netlink: rtnl_put_link after rtnl_link_get_kernel According to netlink documentation [1] we have to decrement reference counter when we don't need link (obtained from rtnl_link_get_kernel) anymore. [1] http://www.infradead.org/~tgr/libnl/doc/route.html#link_direct_lookup Change-Id: Iefa70103c7c0f218c89abbe5c8371b745064a13e Bug-Url: https://bugzilla.redhat.com/1158108 Signed-off-by: Petr Horáček <[email protected]> --- M lib/vdsm/netlink/link.py 1 file changed, 31 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/12/40812/1 diff --git a/lib/vdsm/netlink/link.py b/lib/vdsm/netlink/link.py index 1797902..8ce0ce5 100644 --- a/lib/vdsm/netlink/link.py +++ b/lib/vdsm/netlink/link.py @@ -16,6 +16,7 @@ # # Refer to the README and COPYING files for full details of the license # +from contextlib import contextmanager from ctypes import (CFUNCTYPE, byref, c_char, c_char_p, c_int, c_void_p, c_size_t, sizeof) from functools import partial @@ -24,18 +25,19 @@ from . import _cache_manager, _nl_cache_get_first, _nl_cache_get_next from . import _char_proto, _int_char_proto, _int_proto, _void_proto -from . import LIBNL_ROUTE, _nl_geterror, _pool +from . import LIBNL_ROUTE, _nl_geterror, _pool, _none_proto from . import _addr_to_str, CHARBUFFSIZE def get_link(name): """Returns the information dictionary of the name specified link.""" with _pool.socket() as sock: - link = _get_link(name=name, sock=sock) - if not link: - raise IOError(errno.ENODEV, '%s is not present in the system' % - name) - return _link_info(link) + with _get_link(name=name, sock=sock) as link: + if not link: + raise IOError(errno.ENODEV, '%s is not present in the system' % + name) + link_info = _link_info(link) + return link_info def iter_links(): @@ -95,11 +97,12 @@ name = (c_char * CHARBUFFSIZE)() if cache is None: - link = _get_link(index=link_index) - if link is None: - raise IOError(errno.ENODEV, 'Dev with index %s is not present in ' - 'the system' % link_index) - return _rtnl_link_get_name(link) + with _get_link(index=link_index) as link: + if link is None: + raise IOError(errno.ENODEV, 'Dev with index %s is not present ' + 'in the system' % link_index) + name = _rtnl_link_get_name(link) + return name else: return _rtnl_link_i2name(cache, link_index, name, sizeof(name)) @@ -143,6 +146,7 @@ return -1 +@contextmanager def _get_link(name=None, index=0, sock=None): """ If defined both name and index, index is primary """ # libnl/incluede/netlink/errno.h @@ -151,17 +155,22 @@ if name is None and index == 0: raise ValueError('Must specify either a name or an index') link = c_void_p() - if sock is None: - with _pool.socket() as sock: - err = _rtnl_link_get_kernel(sock, index, name, byref(link)) - else: - err = _rtnl_link_get_kernel(sock, index, name, byref(link)) - if err: - if -err == NLE_NODEV: - link = None + + try: + if sock is None: + with _pool.socket() as sock: + err = _rtnl_link_get_kernel(sock, index, name, byref(link)) else: - raise IOError(-err, _nl_geterror()) - return link + err = _rtnl_link_get_kernel(sock, index, name, byref(link)) + if err: + if -err == NLE_NODEV: + link = None + else: + raise IOError(-err, _nl_geterror()) + yield link + finally: + if link is not None: + _rtnl_link_put(link) _nl_link_cache = partial(_cache_manager, _rtnl_link_alloc_cache) @@ -180,3 +189,4 @@ 'rtnl_link_i2name', LIBNL_ROUTE)) _rtnl_link_operstate2str = _int_char_proto(('rtnl_link_operstate2str', LIBNL_ROUTE)) +_rtnl_link_put = _none_proto(('rtnl_link_put', LIBNL_ROUTE)) -- To view, visit https://gerrit.ovirt.org/40812 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iefa70103c7c0f218c89abbe5c8371b745064a13e Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Petr Horáček <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
