diff mbox series

[net-next] inet: do not set backlog if listen fails

Message ID 1538579279-11614-1-git-send-email-laoar.shao@gmail.com
State Changes Requested, archived
Delegated to: David Miller
Headers show
Series [net-next] inet: do not set backlog if listen fails | expand

Commit Message

Yafang Shao Oct. 3, 2018, 3:07 p.m. UTC
These two backlog members are not necessary set in inet_csk_listen_start().
Regarding sk_max_ack_backlog, it will be set in the caller inet_listen
and dccp_listen_start.
Regraing sk_ack_backlog, it is better to put it together with
sk_max_ack_backlog in the same function and only set on success.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 net/dccp/proto.c                | 1 +
 net/ipv4/af_inet.c              | 1 +
 net/ipv4/inet_connection_sock.c | 3 ---
 3 files changed, 2 insertions(+), 3 deletions(-)

Comments

Eric Dumazet Oct. 3, 2018, 3:41 p.m. UTC | #1
On 10/03/2018 08:07 AM, Yafang Shao wrote:
> These two backlog members are not necessary set in inet_csk_listen_start().
> Regarding sk_max_ack_backlog, it will be set in the caller inet_listen
> and dccp_listen_start.
> Regraing sk_ack_backlog, it is better to put it together with
> sk_max_ack_backlog in the same function and only set on success.
> 
> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> ---
>  net/dccp/proto.c                | 1 +
>  net/ipv4/af_inet.c              | 1 +
>  net/ipv4/inet_connection_sock.c | 3 ---
>  3 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/net/dccp/proto.c b/net/dccp/proto.c
> index 875858c..34d48cd 100644
> --- a/net/dccp/proto.c
> +++ b/net/dccp/proto.c
> @@ -959,6 +959,7 @@ int inet_dccp_listen(struct socket *sock, int backlog)
>  		err = dccp_listen_start(sk, backlog);
>  		if (err)
>  			goto out;
> +		sk->sk_ack_backlog = 0;


This is racy, remember that dccp and tcp have lockless listeners.

Do not change sk_ack_backlog after a TCP/DCCP socket is ready to accept new flows.
Yafang Shao Oct. 5, 2018, 1:54 a.m. UTC | #2
On Wed, Oct 3, 2018 at 11:41 PM Eric Dumazet <eric.dumazet@gmail.com> wrote:
>
>
>
> On 10/03/2018 08:07 AM, Yafang Shao wrote:
> > These two backlog members are not necessary set in inet_csk_listen_start().
> > Regarding sk_max_ack_backlog, it will be set in the caller inet_listen
> > and dccp_listen_start.
> > Regraing sk_ack_backlog, it is better to put it together with
> > sk_max_ack_backlog in the same function and only set on success.
> >
> > Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> > ---
> >  net/dccp/proto.c                | 1 +
> >  net/ipv4/af_inet.c              | 1 +
> >  net/ipv4/inet_connection_sock.c | 3 ---
> >  3 files changed, 2 insertions(+), 3 deletions(-)
> >
> > diff --git a/net/dccp/proto.c b/net/dccp/proto.c
> > index 875858c..34d48cd 100644
> > --- a/net/dccp/proto.c
> > +++ b/net/dccp/proto.c
> > @@ -959,6 +959,7 @@ int inet_dccp_listen(struct socket *sock, int backlog)
> >               err = dccp_listen_start(sk, backlog);
> >               if (err)
> >                       goto out;
> > +             sk->sk_ack_backlog = 0;
>
>
> This is racy, remember that dccp and tcp have lockless listeners.
>
> Do not change sk_ack_backlog after a TCP/DCCP socket is ready to accept new flows.

Understood. Thanks for your explanation.
diff mbox series

Patch

diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 875858c..34d48cd 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -959,6 +959,7 @@  int inet_dccp_listen(struct socket *sock, int backlog)
 		err = dccp_listen_start(sk, backlog);
 		if (err)
 			goto out;
+		sk->sk_ack_backlog = 0;
 	}
 	sk->sk_max_ack_backlog = backlog;
 	err = 0;
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 1fbe2f8..9690e0d 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -230,6 +230,7 @@  int inet_listen(struct socket *sock, int backlog)
 		if (err)
 			goto out;
 		tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_LISTEN_CB, 0, NULL);
+		sk->sk_ack_backlog = 0;
 	}
 	sk->sk_max_ack_backlog = backlog;
 	err = 0;
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index dfd5009..c25d0b3 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -870,9 +870,6 @@  int inet_csk_listen_start(struct sock *sk, int backlog)
 	int err = -EADDRINUSE;
 
 	reqsk_queue_alloc(&icsk->icsk_accept_queue);
-
-	sk->sk_max_ack_backlog = backlog;
-	sk->sk_ack_backlog = 0;
 	inet_csk_delack_init(sk);
 
 	/* There is race window here: we announce ourselves listening,