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-unsubscr...@freebsd.org"
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"