Date: Thu, 10 Apr 2014 11:18:21 -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: <5346B63D.4080707@gmail.com> In-Reply-To: <CAJ-VmomsK%2BOYdFCzedSaVCCzvu97zUthbNhYFivgAK8eN5Tnvg@mail.gmail.com> References: <53459C96.5040304@gmail.com> <5345BAE7.4010501@gmail.com> <CAJ-VmomsK%2BOYdFCzedSaVCCzvu97zUthbNhYFivgAK8eN5Tnvg@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, By the way this change has opened the gates to greater performance for us when using ng_callout() inside nodes. In some cases we see twice as much pps since packets are direct dispatched instead of being queued in software interrupts threads (swi*). Thanks, Karim PS: I did file a PR : kern/188421 On 09/04/2014 9:09 PM, Adrian Chadd wrote: > 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" > _______________________________________________ > 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?5346B63D.4080707>