> -----Original Message----- > From: Parthasarathy Bhuvaragan > Sent: Wednesday, 05 October, 2016 04:18 > To: Jon Maloy <jon.ma...@ericsson.com>; tipc-discussion@lists.sourceforge.net; > ma...@donjonn.com; Ying Xue <ying....@windriver.com> > Subject: Re: [PATCH net v1 2/3] tipc: return early for non-blocking sockets > at link > congestion > > On 10/04/2016 09:26 PM, Jon Maloy wrote: > > > > > >> -----Original Message----- > >> From: Parthasarathy Bhuvaragan > >> Sent: Tuesday, 04 October, 2016 08:29 > >> To: tipc-discussion@lists.sourceforge.net; Jon Maloy > <jon.ma...@ericsson.com>; > >> ma...@donjonn.com; Ying Xue <ying....@windriver.com> > >> Subject: [PATCH net v1 2/3] tipc: return early for non-blocking sockets at > >> link > >> congestion > >> > >> Until now, in stream/mcast send() we pass the message to the link > >> layer even when the link is congested and add the socket to the > >> link's wakeup queue. This is unnecessary for non-blocking sockets. > >> If a socket is set to non-blocking and sends multicast with zero > >> back off time while receiving EAGAIN, we exhaust the memory. > >> > >> In this commit, we return immediately at stream/mcast send() for > >> non-blocking sockets. > >> > >> Signed-off-by: Parthasarathy Bhuvaragan > >> <parthasarathy.bhuvara...@ericsson.com> > >> --- > >> net/tipc/socket.c | 6 ++++++ > >> 1 file changed, 6 insertions(+) > >> > >> diff --git a/net/tipc/socket.c b/net/tipc/socket.c > >> index f9f5f3c3dab5..adf3e6ecf61e 100644 > >> --- a/net/tipc/socket.c > >> +++ b/net/tipc/socket.c > >> @@ -697,6 +697,9 @@ static int tipc_sendmcast(struct socket *sock, struct > >> tipc_name_seq *seq, > >> uint mtu; > >> int rc; > >> > >> + if (!timeo && tsk->link_cong) > >> + return -ELINKCONG; > > > > Why is the !timeo test needed ? > [partha] When a socket with a non-zero sndtimeo experiences congestion, > the socket is put to sleep for the specified duration and is woken if > congestion ceases and we attempt to transmit the buffer. If we had > experienced congestion for the entire duration, then we return > ELINKLCONG to the user. Hence I can return immediately only when timeout > == 0.
Are you saying that we can have non-blocking sockets with a non-zero timeout? I guess my point was that if the socket is blocking, i.e., the timeout is != 0, you will never get into this second call in the first place, since the socket already is blocked if sk->link_cong is true. Hence no need for testing on the timer value. Unsure if this is valid with multiple threads though. > > > > ///jon > > > >> + > >> msg_set_type(mhdr, TIPC_MCAST_MSG); > >> msg_set_lookup_scope(mhdr, TIPC_CLUSTER_SCOPE); > >> msg_set_destport(mhdr, 0); > >> @@ -1072,6 +1075,9 @@ static int __tipc_send_stream(struct socket *sock, > >> struct msghdr *m, size_t dsz) > >> } > >> > >> timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); > >> + if (!timeo && tsk->link_cong) > >> + return -ELINKCONG; > >> + > >> dnode = tsk_peer_node(tsk); > >> skb_queue_head_init(&pktchain); > >> > >> -- > >> 2.1.4 > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion