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. > > ///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