netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net PATCH 1/2] net: ipv6: fib: flush exceptions when purging route
@ 2021-01-06  0:22 Sean Tranchetti
  2021-01-06  0:22 ` [net PATCH 2/2] tools: selftests: add test for changing routes with PTMU exceptions Sean Tranchetti
  2021-01-06 16:55 ` [net PATCH 1/2] net: ipv6: fib: flush exceptions when purging route David Ahern
  0 siblings, 2 replies; 5+ messages in thread
From: Sean Tranchetti @ 2021-01-06  0:22 UTC (permalink / raw)
  To: davem, netdev, kuba; +Cc: subashab, Sean Tranchetti

From: Sean Tranchetti <stranche@codeaurora.org>

Route removal is handled by two code paths. The main removal path is via
fib6_del_route() which will handle purging any PMTU exceptions from the
cache, removing all per-cpu copies of the DST entry used by the route, and
releasing the fib6_info struct.

The second removal location is during fib6_add_rt2node() during a route
replacement operation. This path also calls fib6_purge_rt() to handle
cleaning up the per-cpu copies of the DST entries and releasing the
fib6_info associated with the older route, but it does not flush any PMTU
exceptions that the older route had. Since the older route is removed from
the tree during the replacement, we lose any way of accessing it again.

As these lingering DSTs and the fib6_info struct are holding references to
the underlying netdevice struct as well, unregistering that device from the
kernel can never complete.

Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
---
 net/ipv6/ip6_fib.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 605cdd3..f43e275 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1025,6 +1025,8 @@ static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn,
 {
 	struct fib6_table *table = rt->fib6_table;
 
+	/* Flush all cached dst in exception table */
+	rt6_flush_exceptions(rt);
 	fib6_drop_pcpu_from(rt, table);
 
 	if (rt->nh && !list_empty(&rt->nh_list))
@@ -1927,9 +1929,6 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
 	net->ipv6.rt6_stats->fib_rt_entries--;
 	net->ipv6.rt6_stats->fib_discarded_routes++;
 
-	/* Flush all cached dst in exception table */
-	rt6_flush_exceptions(rt);
-
 	/* Reset round-robin state, if necessary */
 	if (rcu_access_pointer(fn->rr_ptr) == rt)
 		fn->rr_ptr = NULL;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-01-07 20:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-06  0:22 [net PATCH 1/2] net: ipv6: fib: flush exceptions when purging route Sean Tranchetti
2021-01-06  0:22 ` [net PATCH 2/2] tools: selftests: add test for changing routes with PTMU exceptions Sean Tranchetti
2021-01-06 17:03   ` David Ahern
2021-01-06 16:55 ` [net PATCH 1/2] net: ipv6: fib: flush exceptions when purging route David Ahern
2021-01-07 20:04   ` Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).