Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 09 Apr 2014 15:16:38 -0400
From:      Karim Fodil-Lemelin <fodillemlinkarim@gmail.com>
To:        freebsd-net@FreeBSD.org
Subject:   Preventing ng_callout() timeouts to trigger packet queuing
Message-ID:  <53459C96.5040304@gmail.com>

next in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53459C96.5040304>