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

Reply via email to