Date: Sat, 7 Sep 2013 18:30:31 +0300 From: Mikolaj Golub <trociny@FreeBSD.org> To: Andre Oppermann <andre@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, zec@freebsd.org, bz@freebsd.org, svn-src-head@freebsd.org, julian@freebsd.org Subject: Re: svn commit: r254773 - head/sys/net Message-ID: <20130907153029.GB7349@gmail.com> In-Reply-To: <201308241117.r7OBHPQ1032341@svn.freebsd.org> References: <201308241117.r7OBHPQ1032341@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--LyciRD1jyfeSSjG0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, On Sat, Aug 24, 2013 at 11:17:25AM +0000, Andre Oppermann wrote: > Author: andre > Date: Sat Aug 24 11:17:25 2013 > New Revision: 254773 > URL: http://svnweb.freebsd.org/changeset/base/254773 > > Log: > Resolve the confusion between the head_list and the hook list. > > The linked list of pfil hooks is changed to "chain" and this term > is applied consistently. The head_list remains with "list" term. > > Add KASSERT to vnet_pfil_uninit(). ... > vnet_pfil_uninit(const void *unused) > { > > - /* XXX should panic if list is not empty */ > + KASSERT(LIST_EMPTY(&V_pfil_head_list), > + ("%s: pfil_head_list %p not empty", __func__, &V_pfil_head_list)); > PFIL_LOCK_DESTROY_REAL(&V_pfil_lock); > return (0); > } > It is triggered when destroying a vnet, due to inet/inet6 pfil hooks are not being unregistered. The attached patch fixes the issue for me. I am going to commit it if there are no objections -- might the unregistration has been skipped intentionally due to some unresolved issue? -- Mikolaj Golub --LyciRD1jyfeSSjG0 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: inline; filename="ip_input.pfil_head_unregister.1.patch" Unregister inet/inet6 pfil hooks on vnet destroy. Index: sys/netinet/ip_input.c =================================================================== --- sys/netinet/ip_input.c (revision 255362) +++ sys/netinet/ip_input.c (working copy) @@ -363,7 +363,12 @@ ip_init(void) void ip_destroy(void) { + int i; + if ((i = pfil_head_unregister(&V_inet_pfil_hook)) != 0) + printf("%s: WARNING: unable to unregister pfil hook, " + "error %d\n", __func__, i); + /* Cleanup in_ifaddr hash table; should be empty. */ hashdestroy(V_in_ifaddrhashtbl, M_IFADDR, V_in_ifaddrhmask); Index: sys/netinet6/ip6_input.c =================================================================== --- sys/netinet6/ip6_input.c (revision 255362) +++ sys/netinet6/ip6_input.c (working copy) @@ -307,7 +307,11 @@ ip6proto_unregister(short ip6proto) void ip6_destroy() { + int i; + if ((i = pfil_head_unregister(&V_inet6_pfil_hook)) != 0) + printf("%s: WARNING: unable to unregister pfil hook, " + "error %d\n", __func__, i); hashdestroy(V_in6_ifaddrhashtbl, M_IFADDR, V_in6_ifaddrhmask); nd6_destroy(); callout_drain(&V_in6_tmpaddrtimer_ch); --LyciRD1jyfeSSjG0--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130907153029.GB7349>