From owner-svn-src-all@FreeBSD.ORG Fri Jun 12 06:46:25 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 24AE81065673 for ; Fri, 12 Jun 2009 06:46:25 +0000 (UTC) (envelope-from julian@elischer.org) Received: from outH.internet-mail-service.net (outh.internet-mail-service.net [216.240.47.231]) by mx1.freebsd.org (Postfix) with ESMTP id B0D048FC12 for ; Fri, 12 Jun 2009 06:46:24 +0000 (UTC) (envelope-from julian@elischer.org) Received: from idiom.com (mx0.idiom.com [216.240.32.160]) by out.internet-mail-service.net (Postfix) with ESMTP id 19D35B8930; Thu, 11 Jun 2009 23:46:38 -0700 (PDT) X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e Received: from julian-mac.elischer.org (home.elischer.org [216.240.48.38]) by idiom.com (Postfix) with ESMTP id 6CECC2D6019; Thu, 11 Jun 2009 23:46:23 -0700 (PDT) Message-ID: <4A31F9BE.6000405@elischer.org> Date: Thu, 11 Jun 2009 23:46:22 -0700 From: Julian Elischer User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Alexander Kabaev References: <200906111650.n5BGonnn053446@svn.freebsd.org> <20090611190140.GE2642@garage.freebsd.pl> <200906112123.02105.zec@freebsd.org> <4A3168A0.2090308@elischer.org> <20090611202757.7cb0dad5@kan.dnsalias.net> In-Reply-To: <20090611202757.7cb0dad5@kan.dnsalias.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-head@freebsd.org, Pawel Jakub Dawidek , svn-src-all@freebsd.org, src-committers@freebsd.org, Marko Zec Subject: Re: svn commit: r194012 - in head: . sys/netgraph sys/sys X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Jun 2009 06:46:25 -0000 Alexander Kabaev wrote: > On Thu, 11 Jun 2009 13:27:12 -0700 > Julian Elischer wrote: > >> Marko Zec wrote: >>> On Thursday 11 June 2009 21:01:40 Pawel Jakub Dawidek wrote: >>>> On Thu, Jun 11, 2009 at 04:50:49PM +0000, Marko Zec wrote: >>>>> Author: zec >>>>> Date: Thu Jun 11 16:50:49 2009 >>>>> New Revision: 194012 >>>>> URL: http://svn.freebsd.org/changeset/base/194012 >>>>> >>>>> Log: >>>>> Introduce a mechanism for detecting calls from outbound path of >>>>> the network stack when reentering the inbound path from netgraph, >>>>> and force queueing of mbufs at the outbound netgraph node. >>>>> >>>>> The mechanism relies on two components. First, in netgraph >>>>> nodes where outbound path of the network stack calls into >>>>> netgraph, the current thread has to be appropriately marked using >>>>> the new NG_OUTBOUND_THREAD_REF() macro before proceeding to call >>>>> further into the netgraph topology, and unmarked using the >>>>> NG_OUTBOUND_THREAD_UNREF() macro before returning to the caller. >>>>> Second, netgraph nodes which can potentially reenter the network >>>>> stack in the inbound path have to mark their inbound hooks using >>>>> NG_HOOK_SET_TO_INBOUND() macro. The netgraph framework will >>>>> then detect when there is a danger of a call graph looping back >>>>> from outbound to inbound path via netgraph, and defer handing off >>>>> the mbufs to the "inbound" node to a worker thread with a clean >>>>> stack. >>>>> >>>>> In this first pass only the most obvious netgraph nodes have >>>>> been updated to ensure no outbound to inbound calls can occur. >>>>> Nodes such as ng_ipfw, ng_gif etc. should be further examined >>>>> whether a potential for outbound to inbound call looping exists. >>>>> >>>>> This commit changes the layout of struct thread, but due to >>>>> __FreeBSD_version number shortage a version bump has been >>>>> omitted at this time, nevertheless kernel and modules have to be >>>>> rebuilt. >>>> Are you sure Marko that you can't use sys/sys/osd.h instead of >>>> adding yet another field to the thread structure? Netgraph is >>>> optional component and optional components could take advantage of >>>> allocating stuff they need dynamically. The OSD (Object-Specific >>>> Data) KPI is designed for use by optional components - you can add >>>> your data to a thread, you can get it when you want and OSD will >>>> call your callback when thread dies, so you can clean up. >>>> >>>> Maybe you can't, but it's worth checking. >>> Hmm how much locking overhead do osd_set() / osd_get() methods >>> introduce? We have to bump the refcount on each entry to netgraph, >>> and then check it potentially on each hop to next ng node, and >>> finally drop the refcount when done with the function call into >>> netgraph. Accessing td_ng_outbound directly via curthread is as >>> cheap as it gets performancewise as it requires no locking >>> whatsoever... >> I would add that I suspect that we may end up using it in other >> places as well outside of netgraph. >> > > When that happens then per-thread field can be revisited again. Blowing > the side of major kernel structure for the sake of subsystem is > unused by 90%+ percent of users is little too drastic IMHO. > > I do second Pawel's opinion that you should look at osd for the time > being. After all it was invented for just this reason. And I beg to dissagree. Firstly this is not the first field to be put in these structures for a single module. Secondly, the overhead of doing it in the manner suggested would be quite noticeable I think, certainly a drain on what could be a fast-path for some packet processing.