From owner-freebsd-net@FreeBSD.ORG Fri Sep 29 08:35:32 2006 Return-Path: X-Original-To: freebsd-net@freebsd.org Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 52CE216A403; Fri, 29 Sep 2006 08:35:32 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from cyrus.watson.org (cyrus.watson.org [209.31.154.42]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5419643D77; Fri, 29 Sep 2006 08:35:31 +0000 (GMT) (envelope-from rwatson@FreeBSD.org) Received: from fledge.watson.org (fledge.watson.org [209.31.154.41]) by cyrus.watson.org (Postfix) with ESMTP id C4BBC46B04; Fri, 29 Sep 2006 04:35:25 -0400 (EDT) Date: Fri, 29 Sep 2006 09:35:25 +0100 (BST) From: Robert Watson X-X-Sender: robert@fledge.watson.org To: Andre Oppermann In-Reply-To: <451C4850.5030302@freebsd.org> Message-ID: <20060929092813.U73166@fledge.watson.org> References: <451C4850.5030302@freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: freebsd-net@freebsd.org, freebsd-current@freebsd.org, gallatin@cs.duke.edu Subject: Re: Much improved sosend_*() functions X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Sep 2006 08:35:32 -0000 On Fri, 29 Sep 2006, Andre Oppermann wrote: > The patch is available here: > http://people.freebsd.org/~andre/sosend+m_uiotombuf-20060928.diff I like the concept of these changes in principle -- this is the reason I broke out sosend_copyin(), so that we could start plugging bits of the send routines more easily for optimization. However, I think we need to review this really carefully. A casual glance brought up one question, and I hope to get a chance to review this in detail in the next few days. The question is with regard to the 'space' variable. When breaking out sosend_copyin(), I originally simply passed space in as an argument, which is what you do currently. However, I found I had to change it to pass in the variable by reference so that it could be updated, as later portions of sosend() depend on it being updated in order to figure out what flags to pass to pru_send() with respect to PRUS_MORETOCOME, as well as for the (resid && space > 0) condition for the main loop. In your revised version, 'space' isn't updated in sosend() after calling m_uiotombuf(), which on a casual read, suggests that PRUS_MORETOCOME will no longer get set on the last pass into pru_send(), and that the loop may go an extra time and pass more data into TCP than there is room in the socket send buffer. I may be reading wrong, I've not had time to look in any detail, but that was my experience, so you may find you need to pass send by reference, as I do in sosend_copyin(), for the same reason. Robert N M Watson Computer Laboratory University of Cambridge