aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorGravatar Eric Dumazet <edumazet@google.com> 2015-03-12 16:44:06 -0700
committerGravatar David S. Miller <davem@davemloft.net> 2015-03-12 22:58:13 -0400
commit1e2e01172fd11b4dbfee746c0c8fbcaa9dbf22a0 (patch)
tree8384ce93ce79c7fa49bb29349102dd2b4d1137fd /include
parentinet: add ireq_state field to inet_request_sock (diff)
downloadlinux-1e2e01172fd11b4dbfee746c0c8fbcaa9dbf22a0.tar.gz
linux-1e2e01172fd11b4dbfee746c0c8fbcaa9dbf22a0.tar.bz2
linux-1e2e01172fd11b4dbfee746c0c8fbcaa9dbf22a0.zip
inet: add rsk_refcnt/ireq_refcnt to request socks
When request socks will be in ehash, they'll need to be refcounted. This patch adds rsk_refcnt/ireq_refcnt macros, and adds reqsk_put() function, but nothing yet use them. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/net/inet_sock.h1
-rw-r--r--include/net/request_sock.h8
2 files changed, 9 insertions, 0 deletions
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index b31f01de5cd6..9d6470c16a27 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -81,6 +81,7 @@ struct inet_request_sock {
#define ir_cookie req.__req_common.skc_cookie
#define ireq_net req.__req_common.skc_net
#define ireq_state req.__req_common.skc_state
+#define ireq_refcnt req.__req_common.skc_refcnt
kmemcheck_bitfield_begin(flags);
u16 snd_wscale : 4,
diff --git a/include/net/request_sock.h b/include/net/request_sock.h
index 7f830ff67f08..e255ecf8bb40 100644
--- a/include/net/request_sock.h
+++ b/include/net/request_sock.h
@@ -49,6 +49,8 @@ int inet_rtx_syn_ack(struct sock *parent, struct request_sock *req);
*/
struct request_sock {
struct sock_common __req_common;
+#define rsk_refcnt __req_common.skc_refcnt
+
struct request_sock *dl_next;
u16 mss;
u8 num_retrans; /* number of retransmits */
@@ -86,6 +88,12 @@ static inline void reqsk_free(struct request_sock *req)
__reqsk_free(req);
}
+static inline void reqsk_put(struct request_sock *req)
+{
+ if (atomic_dec_and_test(&req->rsk_refcnt))
+ reqsk_free(req);
+}
+
extern int sysctl_max_syn_backlog;
/** struct listen_sock - listen state