Date: Thu, 29 May 2003 09:20:50 -0700 (PDT) From: Matthew Dillon <dillon@apollo.backplane.com> To: Terry Lambert <tlambert2@mindspring.com> Cc: arch@freebsd.org Subject: Re: sendfile(2) SF_NOPUSH flag proposal Message-ID: <200305291620.h4TGKobi078312@apollo.backplane.com> References: <200305281755.h4SHtbu05504@windsor.research.att.com> <3ED5961E.5DE0F41B@mindspring.com>
next in thread | previous in thread | raw e-mail | index | archive | help
:Bill Fenner wrote: :> Why not set PRUS_MORETOCOME on all but the final pru_send() call? : :If the file is larger than `sysctl net.inet.tcp.sendspace`, then :this code in do_sendfile(): : : if (sbspace(&so->so_snd) < so->so_snd.sb_lowat) { : if (so->so_state & SS_NBIO) { : m_freem(m); : sbunlock(&so->so_snd); : splx(s); : error = EAGAIN; : goto done; : } : error = sbwait(&so->so_snd); : :will result in you sleeping with PRUS_MORETOCOME set, but with :no more being sent because the send buffer doesn't get emptied, :as it's waiting for more data to send. : :-- Terry Not unless the send buffer is substantially near the size of a single packet, which it isn't (it's far larger). PRUS_MORETOCOME is smarter then that, Terry. tcp_output() just uses it as a hint, it doesn't unconditionally hold off a flush. The code to refer to is netinet/tcp_output.c around line 313 (in stable), in tcp_output(). The section within the if (len) { ... } sequence. This section does all tests related to sending a packet and as you can see TF_MORETOCOME will not prevent the data from being flushed the more there is enough to fill a packet. -Matt Matthew Dillon <dillon@backplane.com>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305291620.h4TGKobi078312>