ipv6: fixes for RTF_CACHE entries
Subsystems (3)
Paolo Abeni
maintainerv3 cover ipv6: fixes for RTF_CACHE entries
This series addresses 2 different but related issues with RTF_CACHE introduced by the recent refactory.
patch 1 restore the gc timer for such routes
patch 2 removes the aged out dst from the fib tree, properly coping with pMTU routes
v1 -> v2:
- dropped the for ip route show cache
- avoid touching dst.obsolete when the dst is aged out
v2 -> v3:
- take care of pMTU exceptions
Paolo Abeni (2):
ipv6: start fib6 gc on RTF_CACHE dst creation
ipv6: remove from fib tree aged out RTF_CACHE dst
net/ipv6/route.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
Signature · 1 line
2.13.6
Paolo Abeni
maintainerPATCH v3 1/2 ipv6: start fib6 gc on RTF_CACHE dst creation
After the commit 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache"), the fib6 gc is not started after the creation of a RTF_CACHE via a redirect or pmtu update, since fib6_add() isn't invoked anymore for such dsts.
We need the fib6 gc to run periodically to clean the RTF_CACHE, or the dst will stay there forever.
Fix it by explicitly calling fib6_force_start_gc() on successful exception creation. gc_args->more accounting will ensure that the gc timer will run for whatever time needed to properly clean the table.
v2 -> v3:
- clarified the commit message
--- net/ipv6/route.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/route.c +3 -1
@@ -1340,8 +1340,10 @@ static int rt6_insert_exception(struct rt6_info *nrt,spin_unlock_bh (&rt6_exception_lock);/* Update fn->fn_sernum to invalidate all cached dst */ -if (!err) +if (!err) {fib6_update_sernum (ort); +fib6_force_start_gc (net); + }return err; }
Signature · 1 line
2.13.6
Re: [PATCH net-next v3 1/2] ipv6: start fib6 gc on RTF_CACHE dst creation
Quoted 13 lines · Paolo Abeni
After the commit
2b760fcf5cfb("ipv6: hook up exception table to store dst cache"), the fib6 gc is not started after the creation of aRTF_CACHEvia a redirect or pmtu update, sincefib6_add()isn't invoked anymore for such dsts.We need the fib6 gc to run periodically to clean the
RTF_CACHE, or the dst will stay there forever.Fix it by explicitly calling
fib6_force_start_gc()on successful exception creation.gc_args->moreaccounting will ensure that the gc timer will run for whatever time needed to properly clean the table.
Quoted 6 lines
v2 -> v3:
- clarified the commit messageFixes 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache")Signed-off-by Paolo Abeni <[email protected]>---
Quoted 22 lines
net/ipv6/route.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)net/ipv6/route.c +3
-2@@ -1340,8 +1340,10 @@ static int rt6_insert_exception(struct rt6_info *nrt,spin_unlock_bh (&rt6_exception_lock);/* Update fn->fn_sernum to invalidate all cached dst */ -if (!err) +if (!err) {fib6_update_sernum (ort); +fib6_force_start_gc (net); + }return err; } --2.13.6
Re: [PATCH net-next v3 1/2] ipv6: start fib6 gc on RTF_CACHE dst creation
In reply to Paolo AbeniQuoted 13 lines · Paolo Abeni
After the commit
2b760fcf5cfb("ipv6: hook up exception table to store dst cache"), the fib6 gc is not started after the creation of aRTF_CACHEvia a redirect or pmtu update, sincefib6_add()isn't invoked anymore for such dsts.We need the fib6 gc to run periodically to clean the
RTF_CACHE, or the dst will stay there forever.Fix it by explicitly calling
fib6_force_start_gc()on successful exception creation.gc_args->moreaccounting will ensure that the gc timer will run for whatever time needed to properly clean the table.
Quoted 5 lines
v2 -> v3:
- clarified the commit messageFixes 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache")Signed-off-by Paolo Abeni <[email protected]>
Paolo Abeni
maintainerPATCH v3 2/2 ipv6: remove from fib tree aged out RTF_CACHE dst
In reply to Paolo AbeniThe commit 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache") partially reverted the commit 1e2ea8ad37be ("ipv6: set dst.obsolete when a cached route has expired").
As a result, RTF_CACHE dst referenced outside the fib tree will not be removed until the next sernum change; dst_check() does not fail on aged-out dst, and dst->__refcnt can't decrease: the aged out dst will stay valid for a potentially unlimited time after the timeout expiration.
This change explicitly removes RTF_CACHE dst from the fib tree when aged out. The rt6_remove_exception() logic will then obsolete the dst and other entities will drop the related reference on next dst_check().
pMTU exceptions are not aged-out, and are removed from the exception table only when the - usually considerably longer - ip6_rt_mtu_expires timeout expires.
v1 -> v2:
- do not touch dst.obsolete in rt6_remove_exception(), not needed
v2 -> v3:
- take care of pMTU exceptions, too
--- net/ipv6/route.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
net/ipv6/route.c +11 -1
@@ -1575,7 +1575,13 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket, {struct rt6_info *rt = rt6_ex->rt6i; -if (atomic_read (&rt->dst.__refcnt) ==1 && +/* we are pruning and obsoleting aged-out and non gateway exceptions +* even if others have still references to them, so that on next +* dst_check() such references can be dropped. +* EXPIRES exceptions - e.g. pmtu-generated ones are pruned when +* expired, independently from their aging, as per RFC 8201 section 4 +*/ +if (!(rt->rt6i_flags &RTF_EXPIRES ) &&time_after_eq (now, rt->dst.lastuse + gc_args->timeout)) {RT6_TRACE ("aging clone %p\n" , rt);rt6_remove_exception (bucket, rt6_ex);
@@ -1595,6 +1601,10 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,rt6_remove_exception (bucket, rt6_ex);return ; } + }else if (__rt6_check_expired (rt)) { +RT6_TRACE ("purging expired route %p\n" , rt); +rt6_remove_exception (bucket, rt6_ex); +return ; } gc_args->more++; }
Signature · 1 line
2.13.6
Re: [PATCH net-next v3 2/2] ipv6: remove from fib tree aged out RTF_CACHE dst
Quoted 19 lines · Paolo Abeni
The commit
2b760fcf5cfb("ipv6: hook up exception table to store dst cache") partially reverted the commit1e2ea8ad37be("ipv6: set dst.obsolete when a cached route has expired").As a result,
RTF_CACHEdst referenced outside the fib tree will not be removed until the next sernum change;dst_check()does not fail on aged-out dst, anddst->__refcntcan't decrease: the aged out dst will stay valid for a potentially unlimited time after the timeout expiration.This change explicitly removes
RTF_CACHEdst from the fib tree when aged out. Thert6_remove_exception()logic will then obsolete the dst and other entities will drop the related reference on nextdst_check().pMTU exceptions are not aged-out, and are removed from the exception table only when the - usually considerably longer -
ip6_rt_mtu_expirestimeout expires.
Quoted 8 lines
v1 -> v2:
- do not touch dst.obsolete inrt6_remove_exception(), not needed
v2 -> v3:
- take care of pMTU exceptions, tooFixes 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache")Signed-off-by Paolo Abeni <[email protected]>---
Quoted 36 lines
net/ipv6/route.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)net/ipv6/route.c +11
-2@@ -1575,7 +1575,13 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket, {struct rt6_info *rt = rt6_ex->rt6i; -if (atomic_read (&rt->dst.__refcnt) ==1 && +/* we are pruning and obsoleting aged-out and non gateway exceptions +* even if others have still references to them, so that on next +* dst_check() such references can be dropped. +* EXPIRES exceptions - e.g. pmtu-generated ones are pruned when +* expired, independently from their aging, as per RFC 8201 section 4 +*/ +if (!(rt->rt6i_flags &RTF_EXPIRES ) &&time_after_eq (now, rt->dst.lastuse + gc_args->timeout)) {RT6_TRACE ("aging clone %p\n" , rt);rt6_remove_exception (bucket, rt6_ex);@@ -1595,6 +1601,10 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,rt6_remove_exception (bucket, rt6_ex);return ; } + }else if (__rt6_check_expired (rt)) { +RT6_TRACE ("purging expired route %p\n" , rt); +rt6_remove_exception (bucket, rt6_ex); +return ; } gc_args->more++; } --2.13.6
Re: [PATCH net-next v3 2/2] ipv6: remove from fib tree aged out RTF_CACHE dst
In reply to Paolo AbeniQuoted 19 lines · Paolo Abeni
The commit
2b760fcf5cfb("ipv6: hook up exception table to store dst cache") partially reverted the commit1e2ea8ad37be("ipv6: set dst.obsolete when a cached route has expired").As a result,
RTF_CACHEdst referenced outside the fib tree will not be removed until the next sernum change;dst_check()does not fail on aged-out dst, anddst->__refcntcan't decrease: the aged out dst will stay valid for a potentially unlimited time after the timeout expiration.This change explicitly removes
RTF_CACHEdst from the fib tree when aged out. Thert6_remove_exception()logic will then obsolete the dst and other entities will drop the related reference on nextdst_check().pMTU exceptions are not aged-out, and are removed from the exception table only when the - usually considerably longer -
ip6_rt_mtu_expirestimeout expires.
Quoted 7 lines
v1 -> v2:
- do not touch dst.obsolete inrt6_remove_exception(), not needed
v2 -> v3:
- take care of pMTU exceptions, tooFixes 2b760fcf5cfb ("ipv6: hook up exception table to store dst cache")Signed-off-by Paolo Abeni <[email protected]>
David Miller
maintainerFrom: Paolo Abeni <[email protected]>
Date: Thu, 19 Oct 2017 16:07:09 +0200
Quoted 7 lines
This series addresses 2 different but related issues with
RTF_CACHEintroduced by the recent refactory.patch 1 restore the gc timer for such routes
patch 2 removes the aged out dst from the fib tree, properly coping with pMTU routes
Quoted 6 lines
v1 -> v2:
- dropped the for ip route show cache
- avoid touching dst.obsolete when the dst is aged outv2 -> v3:
- take care of pMTU exceptions
Series applied, thank you.