Skip to contentSkip to conversation

Patch "net: add dst_cache support" has been added to the 4.4-stable tree

PATCH [email protected] 2 participants 4 messages Feb 22, 2018 – Feb 23, 2018

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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 911362c70df5b766c243dc297fadeaced786ffd8 Mon 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

maintainer
#1 lore raw
Quoted 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_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

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

author maintainer
#2 lore raw
Quoted 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_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.

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_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.

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 9b246841f4041f85265dec5f769c017fc36a0d33

Author: Dave Jones <[email protected]>
Date:   Mon Mar 21 18:37:22 2016 -0400

Make DST_CACHE a silent config option

Ah, nice, will go queue that one up too, thanks.

greg k-h

maintainer
#3 lore raw
Quoted 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_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 7 lines
Quoted 4 lines

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.

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