disclaimer: I'm not looking at the code now.. I want to go to bed:  :-)

When I wrote that code, the idea was that even a direct node execution should become a queuing operation if there was already something else on the queue. so in that model packets were not supposed to get re-ordered. does that not still work?

Either that, or you need to explain the problem to me a bit better..


On 4/10/14, 5:25 AM, Karim Fodil-Lemelin 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-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"


_______________________________________________
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"

Reply via email to