> -----Original Message-----
> From: Parthasarathy Bhuvaragan
> Sent: Thursday, 06 October, 2016 04:35
> 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/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-
> discuss...@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.

Ok. It seems I haven't fully understood this aspect of the API.
Acked-by: jon

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