tcp: constify tcp_syn_flood_action() socket argument
authorEric Dumazet <edumazet@google.com>
Tue, 29 Sep 2015 14:42:51 +0000 (07:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Sep 2015 23:53:10 +0000 (16:53 -0700)
tcp_syn_flood_action() will soon be called with unlocked socket.
In order to avoid SYN flood warning being emitted multiple times,
use xchg().
Extend max_qlen_log and synflood_warned fields in struct listen_sock
to u32

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

index 90247ec7955bf590da5e577ffb194698eef577be..c146b528478650b4f36c62c6b133ee877991401b 100644 (file)
@@ -129,9 +129,8 @@ struct listen_sock {
        atomic_t                qlen_dec; /* qlen = qlen_inc - qlen_dec */
        atomic_t                young_dec;
 
-       u8                      max_qlen_log ____cacheline_aligned_in_smp;
-       u8                      synflood_warned;
-       /* 2 bytes hole, try to use */
+       u32                     max_qlen_log ____cacheline_aligned_in_smp;
+       u32                     synflood_warned;
        u32                     hash_rnd;
        u32                     nr_table_entries;
        struct request_sock     *syn_table[0];
index 67b27aee8d280dd43a041cf99c7f03534aa1fc06..e58cbcd2f07e0d382e25b85616ab4e89b34d21b9 100644 (file)
@@ -6064,7 +6064,7 @@ EXPORT_SYMBOL(inet_reqsk_alloc);
 /*
  * Return true if a syncookie should be sent
  */
-static bool tcp_syn_flood_action(struct sock *sk,
+static bool tcp_syn_flood_action(const struct sock *sk,
                                 const struct sk_buff *skb,
                                 const char *proto)
 {
@@ -6082,11 +6082,12 @@ static bool tcp_syn_flood_action(struct sock *sk,
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPREQQFULLDROP);
 
        lopt = inet_csk(sk)->icsk_accept_queue.listen_opt;
-       if (!lopt->synflood_warned && sysctl_tcp_syncookies != 2) {
-               lopt->synflood_warned = 1;
+       if (!lopt->synflood_warned &&
+           sysctl_tcp_syncookies != 2 &&
+           xchg(&lopt->synflood_warned, 1) == 0)
                pr_info("%s: Possible SYN flooding on port %d. %s.  Check SNMP counters.\n",
                        proto, ntohs(tcp_hdr(skb)->dest), msg);
-       }
+
        return want_cookie;
 }