Re: How many copies to get from NIC RX to user read()?

From: Hurwitz Justin W. (hurwitz@lanl.gov)
Date: Wed Jul 10 2002 - 16:15:38 EST


So, to make sure I have this right:

When the data is processed from the NIC
  tcp_rcv_established() is called in processing it
    if a user process is waiting on the socket
      iovec copy data to the user
    else
      copy it to receive_queue or backlog_queue

When the user tries read (in any way) a socket
  iovec copy from receive_queue or backlog_queue

E.g., if the user is ready for the data, dump it straight from SKBs. Else,
don't waste SKBs on a lazy (or busy) user and copy the data to a queue.

If this is right, I'm happy :) If it's wrong, please correct.

Thx,
--Gus

On Wed, 10 Jul 2002 niv@us.ibm.com wrote:

>
> > I could've sworn I heard the stack was single-copy
> > on both the TX and RX sides. But, it doesn't look to
> > me like it is. Rather, it looks like there is one copy
> > in tcp_rcv_estabilshed() (via tcp_copy_to_iovec()), and a
> > second copy in tcp_recvmsg() (which is called when the
> > user calls read()). Both of these copies are, I believe,
> > done by skb_copy_datagram_iovec().
>
> tcp_recvmsg() only does the copy from the receive_queue
> or the backlog queue. tcp_rcv_established() does the copy
> directly into the iovec or queues it onto the receive_queue
> or backlog queue for tcp_recvmsg() to complete the work. So
> there arent two copies of the same data happening, just a
> question of one or the other function doing the work depending
> on whether there is currently a process doing a read or not..
>
> hth,
>
> thanks,
> Nivedita
>
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jul 15 2002 - 22:00:18 EST