Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52452c54 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

inet: drop prev pointer handling in request sock



When request sock are put in ehash table, the whole notion
of having a previous request to update dl_next is pointless.

Also, following patch will get rid of big purge timer,
so we want to delete a request sock without holding listener lock.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a998f712
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -29,7 +29,6 @@ struct dst_entry *inet6_csk_route_req(struct sock *sk, struct flowi6 *fl6,
				      const struct request_sock *req);
				      const struct request_sock *req);


struct request_sock *inet6_csk_search_req(const struct sock *sk,
struct request_sock *inet6_csk_search_req(const struct sock *sk,
					  struct request_sock ***prevp,
					  const __be16 rport,
					  const __be16 rport,
					  const struct in6_addr *raddr,
					  const struct in6_addr *raddr,
					  const struct in6_addr *laddr,
					  const struct in6_addr *laddr,
+4 −7
Original line number Original line Diff line number Diff line
@@ -257,7 +257,6 @@ inet_csk_rto_backoff(const struct inet_connection_sock *icsk,
struct sock *inet_csk_accept(struct sock *sk, int flags, int *err);
struct sock *inet_csk_accept(struct sock *sk, int flags, int *err);


struct request_sock *inet_csk_search_req(const struct sock *sk,
struct request_sock *inet_csk_search_req(const struct sock *sk,
					 struct request_sock ***prevp,
					 const __be16 rport,
					 const __be16 rport,
					 const __be32 raddr,
					 const __be32 raddr,
					 const __be32 laddr);
					 const __be32 laddr);
@@ -310,17 +309,15 @@ static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
}
}


static inline void inet_csk_reqsk_queue_unlink(struct sock *sk,
static inline void inet_csk_reqsk_queue_unlink(struct sock *sk,
					       struct request_sock *req,
					       struct request_sock *req)
					       struct request_sock **prev)
{
{
	reqsk_queue_unlink(&inet_csk(sk)->icsk_accept_queue, req, prev);
	reqsk_queue_unlink(&inet_csk(sk)->icsk_accept_queue, req);
}
}


static inline void inet_csk_reqsk_queue_drop(struct sock *sk,
static inline void inet_csk_reqsk_queue_drop(struct sock *sk,
					     struct request_sock *req,
					     struct request_sock *req)
					     struct request_sock **prev)
{
{
	inet_csk_reqsk_queue_unlink(sk, req, prev);
	inet_csk_reqsk_queue_unlink(sk, req);
	inet_csk_reqsk_queue_removed(sk, req);
	inet_csk_reqsk_queue_removed(sk, req);
	reqsk_free(req);
	reqsk_free(req);
}
}
+11 −4
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ int inet_rtx_syn_ack(struct sock *parent, struct request_sock *req);
struct request_sock {
struct request_sock {
	struct sock_common		__req_common;
	struct sock_common		__req_common;
#define rsk_refcnt			__req_common.skc_refcnt
#define rsk_refcnt			__req_common.skc_refcnt
#define rsk_hash			__req_common.skc_hash


	struct request_sock		*dl_next;
	struct request_sock		*dl_next;
	struct sock			*rsk_listener;
	struct sock			*rsk_listener;
@@ -216,11 +217,16 @@ static inline int reqsk_queue_empty(struct request_sock_queue *queue)
}
}


static inline void reqsk_queue_unlink(struct request_sock_queue *queue,
static inline void reqsk_queue_unlink(struct request_sock_queue *queue,
				      struct request_sock *req,
				      struct request_sock *req)
				      struct request_sock **prev_req)
{
{
	struct listen_sock *lopt = queue->listen_opt;
	struct request_sock **prev;

	write_lock(&queue->syn_wait_lock);
	write_lock(&queue->syn_wait_lock);
	*prev_req = req->dl_next;
	prev = &lopt->syn_table[req->rsk_hash];
	while (*prev != req)
		prev = &(*prev)->dl_next;
	*prev = req->dl_next;
	write_unlock(&queue->syn_wait_lock);
	write_unlock(&queue->syn_wait_lock);
}
}


@@ -300,7 +306,6 @@ static inline void reqsk_queue_hash_req(struct request_sock_queue *queue,
	req->num_retrans = 0;
	req->num_retrans = 0;
	req->num_timeout = 0;
	req->num_timeout = 0;
	req->sk = NULL;
	req->sk = NULL;
	req->dl_next = lopt->syn_table[hash];


	/* before letting lookups find us, make sure all req fields
	/* before letting lookups find us, make sure all req fields
	 * are committed to memory and refcnt initialized.
	 * are committed to memory and refcnt initialized.
@@ -308,7 +313,9 @@ static inline void reqsk_queue_hash_req(struct request_sock_queue *queue,
	smp_wmb();
	smp_wmb();
	atomic_set(&req->rsk_refcnt, 1);
	atomic_set(&req->rsk_refcnt, 1);


	req->rsk_hash = hash;
	write_lock(&queue->syn_wait_lock);
	write_lock(&queue->syn_wait_lock);
	req->dl_next = lopt->syn_table[hash];
	lopt->syn_table[hash] = req;
	lopt->syn_table[hash] = req;
	write_unlock(&queue->syn_wait_lock);
	write_unlock(&queue->syn_wait_lock);
}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -406,8 +406,7 @@ enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      struct sk_buff *skb,
					      const struct tcphdr *th);
					      const struct tcphdr *th);
struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, struct request_sock **prev,
			   struct request_sock *req, bool fastopen);
			   bool fastopen);
int tcp_child_process(struct sock *parent, struct sock *child,
int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);
		      struct sk_buff *skb);
void tcp_enter_loss(struct sock *sk);
void tcp_enter_loss(struct sock *sk);
+1 −2
Original line number Original line Diff line number Diff line
@@ -280,8 +280,7 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
				       struct request_sock *req,
				       struct request_sock *req,
				       struct dst_entry *dst);
				       struct dst_entry *dst);
struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
			    struct request_sock *req,
			    struct request_sock *req);
			    struct request_sock **prev);


int dccp_child_process(struct sock *parent, struct sock *child,
int dccp_child_process(struct sock *parent, struct sock *child,
		       struct sk_buff *skb);
		       struct sk_buff *skb);
Loading