On 10/05/2016 05:25 PM, Jon Maloy wrote:
>
>
>> -----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.
[partha] zero timeout means that either the socket is non-blocking or 
this message has MSG_DONTWAIT flag set (irrespective of the socket being 
blocking or non-blocking). From the timeout I derive that this user has 
no intention of waiting.
For multi-threaded applications, each thread can call a blocking 
sendmsg() or call sendmsg() with MSG_DONTWAIT flag or use several thread 
instances of both. The fix should cover all the above.
>
>>>
>>> ///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