neigh: introduce neigh_confirm() helper function
authorYajun Deng <yajun.deng@linux.dev>
Tue, 23 Nov 2021 02:54:30 +0000 (10:54 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Nov 2021 11:51:37 +0000 (11:51 +0000)
Add neigh_confirm() for the confirmed member in struct neighbour,
it can be called as an independent unit by other functions.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/arp.h
include/net/ndisc.h
include/net/neighbour.h
include/net/sock.h

index 4950191..031374a 100644 (file)
@@ -53,13 +53,7 @@ static inline void __ipv4_confirm_neigh(struct net_device *dev, u32 key)
 
        rcu_read_lock_bh();
        n = __ipv4_neigh_lookup_noref(dev, key);
-       if (n) {
-               unsigned long now = jiffies;
-
-               /* avoid dirtying neighbour */
-               if (READ_ONCE(n->confirmed) != now)
-                       WRITE_ONCE(n->confirmed, now);
-       }
+       neigh_confirm(n);
        rcu_read_unlock_bh();
 }
 
index 04341d8..53cb8de 100644 (file)
@@ -411,13 +411,7 @@ static inline void __ipv6_confirm_neigh(struct net_device *dev,
 
        rcu_read_lock_bh();
        n = __ipv6_neigh_lookup_noref(dev, pkey);
-       if (n) {
-               unsigned long now = jiffies;
-
-               /* avoid dirtying neighbour */
-               if (READ_ONCE(n->confirmed) != now)
-                       WRITE_ONCE(n->confirmed, now);
-       }
+       neigh_confirm(n);
        rcu_read_unlock_bh();
 }
 
@@ -428,13 +422,7 @@ static inline void __ipv6_confirm_neigh_stub(struct net_device *dev,
 
        rcu_read_lock_bh();
        n = __ipv6_neigh_lookup_noref_stub(dev, pkey);
-       if (n) {
-               unsigned long now = jiffies;
-
-               /* avoid dirtying neighbour */
-               if (READ_ONCE(n->confirmed) != now)
-                       WRITE_ONCE(n->confirmed, now);
-       }
+       neigh_confirm(n);
        rcu_read_unlock_bh();
 }
 
index 38a0c1d..55af812 100644 (file)
@@ -321,6 +321,17 @@ static inline struct neighbour *__neigh_lookup_noref(struct neigh_table *tbl,
        return ___neigh_lookup_noref(tbl, tbl->key_eq, tbl->hash, pkey, dev);
 }
 
+static inline void neigh_confirm(struct neighbour *n)
+{
+       if (n) {
+               unsigned long now = jiffies;
+
+               /* avoid dirtying neighbour */
+               if (READ_ONCE(n->confirmed) != now)
+                       WRITE_ONCE(n->confirmed, now);
+       }
+}
+
 void neigh_table_init(int index, struct neigh_table *tbl);
 int neigh_table_clear(int index, struct neigh_table *tbl);
 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
index a79fc77..e7c2313 100644 (file)
@@ -2135,13 +2135,10 @@ static inline void sock_confirm_neigh(struct sk_buff *skb, struct neighbour *n)
 {
        if (skb_get_dst_pending_confirm(skb)) {
                struct sock *sk = skb->sk;
-               unsigned long now = jiffies;
 
-               /* avoid dirtying neighbour */
-               if (READ_ONCE(n->confirmed) != now)
-                       WRITE_ONCE(n->confirmed, now);
                if (sk && READ_ONCE(sk->sk_dst_pending_confirm))
                        WRITE_ONCE(sk->sk_dst_pending_confirm, 0);
+               neigh_confirm(n);
        }
 }