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