Date: Wed, 09 Apr 2014 17:25:59 -0400 From: Karim Fodil-Lemelin <fodillemlinkarim@gmail.com> To: freebsd-net@freebsd.org Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing Message-ID: <5345BAE7.4010501@gmail.com> In-Reply-To: <53459C96.5040304@gmail.com> References: <53459C96.5040304@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5345BAE7.4010501>