Preventing ng_callout() timeouts to trigger packet queuing

Julian Elischer julian at freebsd.org
Fri Apr 11 18:59:35 UTC 2014


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



More information about the freebsd-net mailing list