| From 5bd45ad2e48071f4a6e573fb0708aea01466417e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 15 Dec 2024 17:56:28 +0000 |
| Subject: inetpeer: update inetpeer timestamp in inet_getpeer() |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit 50b362f21d6c10b0f7939c1482c6a1b43da82f1a ] |
| |
| inet_putpeer() will be removed in the following patch, |
| because we will no longer use refcounts. |
| |
| Update inetpeer timestamp (p->dtime) at lookup time. |
| |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Link: https://patch.msgid.link/20241215175629.1248773-4-edumazet@google.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Stable-dep-of: a853c609504e ("inetpeer: do not get a refcount in inet_getpeer()") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/ipv4/inetpeer.c | 12 ++++-------- |
| 1 file changed, 4 insertions(+), 8 deletions(-) |
| |
| diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c |
| index 5670571ee5fbe..596e2c3a8551f 100644 |
| --- a/net/ipv4/inetpeer.c |
| +++ b/net/ipv4/inetpeer.c |
| @@ -98,6 +98,7 @@ static struct inet_peer *lookup(const struct inetpeer_addr *daddr, |
| { |
| struct rb_node **pp, *parent, *next; |
| struct inet_peer *p; |
| + u32 now; |
| |
| pp = &base->rb_root.rb_node; |
| parent = NULL; |
| @@ -113,6 +114,9 @@ static struct inet_peer *lookup(const struct inetpeer_addr *daddr, |
| if (cmp == 0) { |
| if (!refcount_inc_not_zero(&p->refcnt)) |
| break; |
| + now = jiffies; |
| + if (READ_ONCE(p->dtime) != now) |
| + WRITE_ONCE(p->dtime, now); |
| return p; |
| } |
| if (gc_stack) { |
| @@ -158,9 +162,6 @@ static void inet_peer_gc(struct inet_peer_base *base, |
| for (i = 0; i < gc_cnt; i++) { |
| p = gc_stack[i]; |
| |
| - /* The READ_ONCE() pairs with the WRITE_ONCE() |
| - * in inet_putpeer() |
| - */ |
| delta = (__u32)jiffies - READ_ONCE(p->dtime); |
| |
| if (delta < ttl || !refcount_dec_if_one(&p->refcnt)) |
| @@ -232,11 +233,6 @@ EXPORT_SYMBOL_GPL(inet_getpeer); |
| |
| void inet_putpeer(struct inet_peer *p) |
| { |
| - /* The WRITE_ONCE() pairs with itself (we run lockless) |
| - * and the READ_ONCE() in inet_peer_gc() |
| - */ |
| - WRITE_ONCE(p->dtime, (__u32)jiffies); |
| - |
| if (refcount_dec_and_test(&p->refcnt)) |
| call_rcu(&p->rcu, inetpeer_free_rcu); |
| } |
| -- |
| 2.39.5 |
| |