]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
inetpeer: update inetpeer timestamp in inet_getpeer()
authorEric Dumazet <edumazet@google.com>
Sun, 15 Dec 2024 17:56:28 +0000 (17:56 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Dec 2024 03:37:00 +0000 (19:37 -0800)
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>
net/ipv4/inetpeer.c

index bc79cc9d13ebb4691660f51babbc748900b8f6db..28c3ae5bc4a0b62030bd190dbe5284632ea23efd 100644 (file)
@@ -95,6 +95,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;
@@ -110,6 +111,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) {
@@ -150,9 +154,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))
@@ -224,11 +225,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))
                kfree_rcu(p, rcu);
 }