Preventing ng_callout() timeouts to trigger packet queuing
Adrian Chadd
adrian at freebsd.org
Fri Apr 11 19:51:10 UTC 2014
Well, ethernet drivers nowdays seem to be doing:
* always queue
* then pop the head item off the queue and transmit that.
-a
On 11 April 2014 11:59, Julian Elischer <julian at freebsd.org> wrote:
> 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"
>>
>
> _______________________________________________
> 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