Preventing ng_callout() timeouts to trigger packet queuing

Adrian Chadd adrian at freebsd.org
Thu Apr 10 16:41:43 UTC 2014


Sweet!

I'll ask around and see if anyone netmap clued can review. :)

-a


On 10 April 2014 08:18, Karim Fodil-Lemelin <fodillemlinkarim at gmail.com> wrote:
> Hi,
>
> By the way this change has opened the gates to greater performance for us
> when using ng_callout() inside nodes. In some cases we see twice as much pps
> since packets are direct dispatched instead of being queued in software
> interrupts threads (swi*).
>
> Thanks,
>
> Karim
>
> PS: I did file a PR : kern/188421
>
>
> On 09/04/2014 9:09 PM, Adrian Chadd wrote:
>>
>> Hi!
>>
>> Would you mind filing a PR for this?
>>
>> www.freebsd.org/send-pr.html
>>
>> That way it won't (hopefully!) get lost.
>>
>> Thanks!
>>
>>
>> -a
>>
>>
>> On 9 April 2014 14:25, Karim Fodil-Lemelin <fodillemlinkarim at gmail.com>
>> 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"
>
>
> _______________________________________________
> 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