From owner-svn-src-head@FreeBSD.ORG Thu Jun 11 20:27:13 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D4F3B1065677 for ; Thu, 11 Jun 2009 20:27:13 +0000 (UTC) (envelope-from julian@elischer.org) Received: from outO.internet-mail-service.net (outo.internet-mail-service.net [216.240.47.238]) by mx1.freebsd.org (Postfix) with ESMTP id B531A8FC26 for ; Thu, 11 Jun 2009 20:27:13 +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 A4F00D2028; Thu, 11 Jun 2009 13:27:36 -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 Received: from julian-mac.elischer.org (home.elischer.org [216.240.48.38]) by idiom.com (Postfix) with ESMTP id DCED92D6017; Thu, 11 Jun 2009 13:27:12 -0700 (PDT) Message-ID: <4A3168A0.2090308@elischer.org> Date: Thu, 11 Jun 2009 13:27:12 -0700 From: Julian Elischer User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Marko Zec References: <200906111650.n5BGonnn053446@svn.freebsd.org> <20090611190140.GE2642@garage.freebsd.pl> <200906112123.02105.zec@freebsd.org> In-Reply-To: <200906112123.02105.zec@freebsd.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Pawel Jakub Dawidek Subject: Re: svn commit: r194012 - in head: . sys/netgraph sys/sys X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Jun 2009 20:27:14 -0000 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. > Cheers, > > Marko > > >> PS. Currently OSD works for threads and jails, but it is ready to be >> extended to work with other object types, eg. vnodes, ifnets, etc. >> Even if you can't use it in this particular case, keep it in mind, >> as it might be useful for other vimage-related stuff. >> >>> Modified: head/sys/sys/proc.h >>> ========================================================================= >>> ===== --- head/sys/sys/proc.h Thu Jun 11 16:48:59 2009 (r194011) >>> +++ head/sys/sys/proc.h Thu Jun 11 16:50:49 2009 (r194012) >>> @@ -235,6 +235,7 @@ struct thread { >>> char td_name[MAXCOMLEN + 1]; /* (*) Thread name. */ >>> struct file *td_fpop; /* (k) file referencing cdev under op */ >>> int td_dbgflags; /* (c) Userland debugger flags */ >>> + int td_ng_outbound; /* (k) Thread entered ng from above. */ >>> struct osd td_osd; /* (k) Object specific data. */ >>> #define td_endzero td_base_pri >