I noticed this bit of discussion in tcp_recvmsg. It implies that a better
queuing policy would be good. But it is confusing English (Alexey?) so
not sure where to start.


>               if (!sysctl_tcp_low_latency && tp->ucopy.task == user_recv) {
>                       /* Install new reader */
>                       if (!user_recv && !(flags & (MSG_TRUNC | MSG_PEEK))) {
>                               user_recv = current;
>                               tp->ucopy.task = user_recv;
>                               tp->ucopy.iov = msg->msg_iov;
>                       }
> 
>                       tp->ucopy.len = len;
> 
>                       BUG_TRAP(tp->copied_seq == tp->rcv_nxt ||
>                                (flags & (MSG_PEEK | MSG_TRUNC)));
> 
>                       /* Ugly... If prequeue is not empty, we have to
>                        * process it before releasing socket, otherwise
>                        * order will be broken at second iteration.
>                        * More elegant solution is required!!!
>                        *
>                        * Look: we have the following (pseudo)queues:
>                        *
>                        * 1. packets in flight
>                        * 2. backlog
>                        * 3. prequeue
>                        * 4. receive_queue
>                        *
>                        * Each queue can be processed only if the next ones
>                        * are empty. At this point we have empty receive_queue.
>                        * But prequeue _can_ be not empty after 2nd iteration,
>                        * when we jumped to start of loop because backlog
>                        * processing added something to receive_queue.
>                        * We cannot release_sock(), because backlog contains
>                        * packets arrived _after_ prequeued ones.
>                        *
>                        * Shortly, algorithm is clear --- to process all
>                        * the queues in order. We could make it more directly,
>                        * requeueing packets from backlog to prequeue, if
>                        * is not empty. It is more elegant, but eats cycles,
>                        * unfortunately.
>                        */
>                       if (!skb_queue_empty(&tp->ucopy.prequeue))
>                               goto do_prequeue;
> 
>                       /* __ Set realtime policy in scheduler __ */
>               }
> 
>               if (copied >= target) {
>                       /* Do not sleep, just process backlog. */
>                       release_sock(sk);
>                       lock_sock(sk);
>               } else
>               

-- 
Stephen Hemminger <[EMAIL PROTECTED]>
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to