From owner-freebsd-net@FreeBSD.ORG Fri Apr 11 18:59:35 2014 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 1A59FCB6 for ; Fri, 11 Apr 2014 18:59:35 +0000 (UTC) Received: from vps1.elischer.org (vps1.elischer.org [204.109.63.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "vps1.elischer.org", Issuer "CA Cert Signing Authority" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id D84FD112E for ; Fri, 11 Apr 2014 18:59:34 +0000 (UTC) Received: from Julian-MBP3.local (50-196-156-133-static.hfc.comcastbusiness.net [50.196.156.133]) (authenticated bits=0) by vps1.elischer.org (8.14.8/8.14.8) with ESMTP id s3BIxUKU004077 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 11:59:33 -0700 (PDT) (envelope-from julian@freebsd.org) Message-ID: <53483B8B.7030409@freebsd.org> Date: Sat, 12 Apr 2014 02:59:23 +0800 From: Julian Elischer User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: freebsd-net@freebsd.org Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing References: <53459C96.5040304@gmail.com> <5345BAE7.4010501@gmail.com> In-Reply-To: <5345BAE7.4010501@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.17 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, 11 Apr 2014 18:59:35 -0000 disclaimer: I'm not looking at the code now.. I want to go to bed: :-) When I wrote that code, the idea was that even a direct node execution should become a queuing operation if there was already something else on the queue. so in that model packets were not supposed to get re-ordered. does that not still work? Either that, or you need to explain the problem to me a bit better.. On 4/10/14, 5:25 AM, Karim Fodil-Lemelin wrote: > Hi, > > Below is a revised patch for this issue. It accounts for nodes or > hooks that explicitly need to be queuing: > > @@ -3632,7 +3632,12 @@ ng_callout(struct callout *c, node_p node, > hook_p hook, int ticks, > if ((item = ng_alloc_item(NGQF_FN, NG_NOFLAGS)) == NULL) > return (ENOMEM); > > - item->el_flags |= NGQF_WRITER; > + if ((node->nd_flags & NGF_FORCE_WRITER) || > + (hook && (hook->hk_flags & HK_FORCE_WRITER))) > + item->el_flags |= NGQF_WRITER; > + else > + item->el_flags |= NGQF_READER; > + > NG_NODE_REF(node); /* and one for the item */ > NGI_SET_NODE(item, node); > if (hook) { > > Regards, > > Karim. > > On 09/04/2014 3:16 PM, Karim Fodil-Lemelin wrote: >> Hi List, >> >> I'm calling out to the general wisdom ... I have seen an issue in >> netgraph where, if called, a callout routine registered by >> ng_callout() will trigger packet queuing inside the worklist of >> netgraph since ng_callout() makes my node suddenly a WRITER node >> (therefore non reentrant) for the duration of the call. >> >> So as soon as the callout function returns, all following packets >> will get directly passed to the node again and when the ngintr >> thread gets executed then only then will I get the queued packets. >> This introduces out of order packets in the flow. I am using the >> current patch below to solve the issue and I am wondering if there >> is anything wrong with it (and maybe contribute back :): >> >> >> @@ -3632,7 +3632,7 @@ ng_callout(struct callout *c, node_p node, >> hook_p hook, int ticks, >> if ((item = ng_alloc_item(NGQF_FN, NG_NOFLAGS)) == NULL) >> return (ENOMEM); >> >> - item->el_flags |= NGQF_WRITER; >> + item->el_flags = NGQF_READER; >> NG_NODE_REF(node); /* and one for the item */ >> NGI_SET_NODE(item, node); >> if (hook) { >> >> >> Best regards, >> >> Karim. >> _______________________________________________ >> freebsd-net@freebsd.org mailing list >> http://lists.freebsd.org/mailman/listinfo/freebsd-net >> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" > > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" >