Commit 50b362f2 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

inetpeer: update inetpeer timestamp in inet_getpeer()



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: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20241215175629.1248773-4-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7a596a50
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -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);
}