tcp/dccp: no longer use twsk_net(tw) from tw_timer_handler()
authorEric Dumazet <edumazet@google.com>
Mon, 24 Jan 2022 20:24:53 +0000 (12:24 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 25 Jan 2022 11:25:21 +0000 (11:25 +0000)
We will soon get rid of inet_twsk_purge().

This means that tw_timer_handler() might fire after
a netns has been dismantled/freed.

Instead of adding a function (and data structure) to find a netns
from tw->tw_net_cookie, just update the SNMP counters
a bit earlier, when the netns is known to be alive.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_timewait_sock.h
net/ipv4/inet_timewait_sock.c

index c221fe2..b323db9 100644 (file)
@@ -65,10 +65,9 @@ struct inet_timewait_sock {
        /* these three are in inet_sock */
        __be16                  tw_sport;
        /* And these are ours. */
-       unsigned int            tw_kill         : 1,
-                               tw_transparent  : 1,
+       unsigned int            tw_transparent  : 1,
                                tw_flowlabel    : 20,
-                               tw_pad          : 2,    /* 2 bits hole */
+                               tw_pad          : 3,    /* 3 bits hole */
                                tw_tos          : 8;
        u32                     tw_txhash;
        u32                     tw_priority;
index 6e8f4a6..e37e485 100644 (file)
@@ -148,10 +148,6 @@ static void tw_timer_handler(struct timer_list *t)
 {
        struct inet_timewait_sock *tw = from_timer(tw, t, tw_timer);
 
-       if (tw->tw_kill)
-               __NET_INC_STATS(twsk_net(tw), LINUX_MIB_TIMEWAITKILLED);
-       else
-               __NET_INC_STATS(twsk_net(tw), LINUX_MIB_TIMEWAITED);
        inet_twsk_kill(tw);
 }
 
@@ -247,8 +243,11 @@ void __inet_twsk_schedule(struct inet_timewait_sock *tw, int timeo, bool rearm)
         * of PAWS.
         */
 
-       tw->tw_kill = timeo <= 4*HZ;
        if (!rearm) {
+               bool kill = timeo <= 4*HZ;
+
+               __NET_INC_STATS(twsk_net(tw), kill ? LINUX_MIB_TIMEWAITKILLED :
+                                                    LINUX_MIB_TIMEWAITED);
                BUG_ON(mod_timer(&tw->tw_timer, jiffies + timeo));
                atomic_inc(&tw->tw_dr->tw_count);
        } else {