Date: Wed, 9 Apr 2014 18:09:53 -0700 From: Adrian Chadd <adrian@freebsd.org> To: Karim Fodil-Lemelin <fodillemlinkarim@gmail.com> Cc: FreeBSD Net <freebsd-net@freebsd.org> Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing Message-ID: <CAJ-VmomsK%2BOYdFCzedSaVCCzvu97zUthbNhYFivgAK8eN5Tnvg@mail.gmail.com> In-Reply-To: <5345BAE7.4010501@gmail.com> References: <53459C96.5040304@gmail.com> <5345BAE7.4010501@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi! Would you mind filing a PR for this? www.freebsd.org/send-pr.html That way it won't (hopefully!) get lost. Thanks! -a On 9 April 2014 14:25, Karim Fodil-Lemelin <fodillemlinkarim@gmail.com> 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"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmomsK%2BOYdFCzedSaVCCzvu97zUthbNhYFivgAK8eN5Tnvg>