Patch "net: add dst_cache support" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
net: add dst_cache support
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-add-dst_cache-support.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
911362c70df5b766c243dc297fadeaced786ffd8Mon Sep 17 00:00:00 2001
From: Paolo Abeni <[email protected]>
Date: Fri, 12 Feb 2016 15:43:53 +0100
Subject: net: add dst_cache support
From: Paolo Abeni <[email protected]>
commit 911362c70df5b766c243dc297fadeaced786ffd8 upstream.
This patch add a generic, lockless dst cache implementation. The need for lock is avoided updating the dst cache fields only in per cpu scope, and requiring that the cache manipulation functions are invoked with the local bh disabled.
The refresh_ts and reset_ts fields are used to ensure the cache consistency in case of cuncurrent cache update (dst_cache_set*) and reset operation (dst_cache_reset).
Consider the following scenario:
CPU1: CPU2:
<cache lookup with emtpy cache: it fails>
<get dst via uncached route lookup>
<related configuration changes> dst_cache_reset()
dst_cache_set()
The dst entry set passed to dst_cache_set() should not be used for later dst cache lookup, because it's obtained using old configuration values.
Since the refresh_ts is updated only on dst_cache lookup, the cached value in the above scenario will be discarded on the next lookup.
--- include/net/dst_cache.h | 97 +++++++++++++++++++++++++++ net/Kconfig | 4 + net/core/Makefile | 1 net/core/dst_cache.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 270 insertions(+)
include/net/dst_cache.h new file +97 -0
@@ -0,0 +1,97 @@ +#ifndef _NET_DST_CACHE_H +#define _NET_DST_CACHE_H + +#include <linux/jiffies.h> +#include <net/dst.h> +#if IS_ENABLED (CONFIG_IPV6 ) +#include <net/ip6_fib.h> +#endif + +struct dst_cache { +struct dst_cache_pcpu __percpu *cache; +unsigned long reset_ts; +}; + +/** +* dst_cache_get - perform cache lookup +* @dst_cache: the cache +* +* The caller should use dst_cache_get_ip4() if it need to retrieve the +* source address to be used when xmitting to the cached dst. +* local BH must be disabled. +*/ +struct dst_entry *dst_cache_get (struct dst_cache *dst_cache); + +/** +* dst_cache_get_ip4 - perform cache lookup and fetch ipv4 source address +* @dst_cache: the cache +* @saddr: return value for the retrieved source address +* +* local BH must be disabled. +*/ +struct rtable *dst_cache_get_ip4 (struct dst_cache *dst_cache,__be32 *saddr); + +/** +* dst_cache_set_ip4 - store the ipv4 dst into the cache +* @dst_cache: the cache +* @dst: the entry to be cached +* @saddr: the source address to be stored inside the cache +* +* local BH must be disabled. +*/ +void dst_cache_set_ip4 (struct dst_cache *dst_cache,struct dst_entry *dst, +__be32 saddr); + +#if IS_ENABLED (CONFIG_IPV6 ) + +/** +* dst_cache_set_ip6 - store the ipv6 dst into the cache +* @dst_cache: the cache +* @dst: the entry to be cached +* @saddr: the source address to be stored inside the cache +* +* local BH must be disabled. +*/ +void dst_cache_set_ip6 (struct dst_cache *dst_cache,struct dst_entry *dst, +const struct in6_addr *addr); + +/** +* dst_cache_get_ip6 - perform cache lookup and fetch ipv6 source address +* @dst_cache: the cache +* @saddr: return value for the retrieved source address +* +* local BH must be disabled. +*/ +struct dst_entry *dst_cache_get_ip6 (struct dst_cache *dst_cache, +struct in6_addr *saddr); +#endif + +/** +* dst_cache_reset - invalidate the cache contents +* @dst_cache: the cache +* +* This do not free the cached dst to avoid races and contentions. +* the dst will be freed on later cache lookup. +*/ +static inline void dst_cache_reset (struct dst_cache *dst_cache) +{ + dst_cache->reset_ts = jiffies; +} + +/** +* dst_cache_init - initialize the cache, allocating the required storage +* @dst_cache: the cache +* @gfp: allocation flags +*/ +int dst_cache_init (struct dst_cache *dst_cache,gfp_t gfp); + +/** +* dst_cache_destroy - empty the cache and free the allocated storage +* @dst_cache: the cache +* +* No synchronization is enforced: it must be called only when the cache +* is unsed. +*/ +void dst_cache_destroy (struct dst_cache *dst_cache); + +#endif
net/Kconfig +4 -0
@@ -383,6 +383,10 @@ config LWTUNNEL weight tunnel endpoint. Tunnel encapsulation parameters are stored with light weight tunnel state associated with fib routes. +config DST_CACHE + bool "dst cache" + default n + endif # if NET # Used by archs to tell that they support BPF_JIT
net/core/Makefile +1 -0
@@ -24,3 +24,4 @@ obj-$(CONFIG_NET_PTP_CLASSIFY) += ptp_cl obj-$(CONFIG_CGROUP_NET_PRIO) += netprio_cgroup.o obj-$(CONFIG_CGROUP_NET_CLASSID) += netclassid_cgroup.o obj-$(CONFIG_LWTUNNEL) += lwtunnel.o +obj-$(CONFIG_DST_CACHE) += dst_cache.o
net/core/dst_cache.c new file +168 -0
168 lines not on this page · raw message
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/net-add-dst_cache-support.patch queue-4.4/net-replace-dst_cache-ip6_tunnel-implementation-with-the-generic-one.patch queue-4.4/netfilter-on-sockopt-acquire-sock-lock-only-in-the-required-scope.patch
Paolo Abeni
maintainerQuoted 7 lines · On Thu, 2018-02-22 at 19:23 +0100, [email protected] wrote:
This is a note to let you know that I've just added the patch titled
net: add
dst_cachesupportto the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
Quoted 6 lines
The filename of the patch is:
net-add-dst_cache-support.patch
and it can be found in the queue-4.4 subdirectory.If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
I see this patch is needed by "net: replace dst_cache ip6_tunnel implementation with the generic one", but I'm not 100% sure this is stable material ?!? the race addressed by the later patch is very hard to reproduce - I never saw that in real life scenario.
Anyway, if this is going to land on stable, I suggest to add also:
commit 9b246841f4041f85265dec5f769c017fc36a0d33
Author: Dave Jones <[email protected]> Date: Mon Mar 21 18:37:22 2016 -0400
Make DST_CACHE a silent config option
Thanks,
Paolo
Greg KH
maintainerQuoted 12 lines · Paolo Abeni
Quoted 11 lines · On Thu, 2018-02-22 at 19:23 +0100, [email protected] wrote:
This is a note to let you know that I've just added the patch titled
net: add
dst_cachesupportto the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summaryThe filename of the patch is:
net-add-dst_cache-support.patch
and it can be found in the queue-4.4 subdirectory.
Quoted 7 lines
Quoted 2 lines
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
I see this patch is needed by "net: replace
dst_cacheip6_tunnelimplementation with the generic one", but I'm not 100% sure this is stable material ?!? the race addressed by the later patch is very hard to reproduce - I never saw that in real life scenario.
Manoj seems to have hit this in real devices, and asked for it to be backported as it fixes a problem.
Quoted 7 lines
Anyway, if this is going to land on stable, I suggest to add also:
commit
9b246841f4041f85265dec5f769c017fc36a0d33Author: Dave Jones <[email protected]> Date: Mon Mar 21 18:37:22 2016 -0400Make
DST_CACHEa silent config option
Ah, nice, will go queue that one up too, thanks.
greg k-h
Paolo Abeni
maintainerQuoted 16 lines · Greg KH
Quoted 15 lines · Paolo Abeni
Quoted 13 lines · On Thu, 2018-02-22 at 19:23 +0100, [email protected] wrote:
This is a note to let you know that I've just added the patch titled
net: add
dst_cachesupportto the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summaryThe filename of the patch is:
net-add-dst_cache-support.patch
and it can be found in the queue-4.4 subdirectory.If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 7 lines
Quoted 4 lines
I see this patch is needed by "net: replace
dst_cacheip6_tunnelimplementation with the generic one", but I'm not 100% sure this is stable material ?!? the race addressed by the later patch is very hard to reproduce - I never saw that in real life scenario.Manoj seems to have hit this in real devices, and asked for it to be backported as it fixes a problem.
Ok, I'm fine with that than! Also I'm somewhat "happy" that race I saw on the paper is a real thing and not a lack-of-coffee issue ;
Thanks for tacking care of this,
Paolo