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>
