git: netgraph7: Major rework of netgraph7 internal mechanisms.
Nuno Antunes
nant at crater.dragonflybsd.org
Fri Jul 11 02:43:25 PDT 2014
commit ad9efc7b235ec25d20a098e85139e14458b6b2a3
Author: Nuno Antunes <nuno.antunes at gmail.com>
Date: Thu May 9 21:59:47 2013 +0000
netgraph7: Major rework of netgraph7 internal mechanisms.
* Promote the netgraph taskqueue to a fully fledged per-CPU lwkt.
Currently all work is queued to cpu0 but the idea is to later distribute
work among the threads. I also explored the idea of using netisr threads
instead of our own dedicated threads but I think it would be a bad idea to
globaly block a netisr thread due to a netgraph token or other lock.
* Embed a struct lwkt_msg in netgraph items.
* Make ng_apply_item() accept only one argument.
* Remove the global worklist and per-node input queues and related routines.
* Always and only queue items coming from interrupt context.
Items are now always queued, except if they are already being sent from a
netgraph thread (depth > 1). The NG_QUEUE and HK_QUEUE flags become no-ops
but are kept for compatibility reasons.
* Replace the node reader/writer gate with a per-node lwkt shared
token.
* Remove some #if 0'd code
* netgraph7/ng_socket: Avoid blocking on netisr.
Previously, the ng_socket code used a sleep/wakeup mechanism to
prevent returning immediatly from the syscall. This caused
netisr_cpu 0 to block globaly until the item was processed,
which is very inneficient.
Instead, delay the lwkt_replymsg call in the normal case until the item
has been processed. This achieves the same requirement of not returning
from syscall until the item is processed but is much more elegant.
Because ngc_send() returns sooner now, we can't allocate the apply
info from the stack. Instead, dynamically allocate it from an
objcache.
* Zeroize an item before returning it to the objcache.
Objects must be in their initialized state before being returned
to the object cache. Do that for netgraph items.
The above exposed a use after free bug. An item must remain valid
until is applied. If an item has been queued with a registered apply
callback, free it only after the callback is made.
* Add a function to check and apply the callback in case the item has
one registered.
* Pass the apply callback error via lwkt_replymsg() directly, instead of
using a field in the apply_info structure.
* Make sure that ng_socket items don't have their apply callback called
twice which was causing a panic.
* Items are now only allowed to be freed by ng_apply_item(). NG_FREE_ITEM
is kept for compatibility reasons but now it simply marks the item for
deletion and asserts it was not marked already in order to detect
double frees.
Hold a reference on the item every time it is sent or forwarded. When the
recursion is finished we are finally allowed to free the item on
ng_apply_item(). Prior to freeing the item, check it for a registered
callback.
* Let recursion unwinding free the item, even in case of error.
* Go back to using a single item allocation pool, instead of separate data
and message/function pools. If there is a performance hit, we'll have to
deal with it later. Now, ng_realloc_item() simply changes the item type,
without allocating a new one from the objcache.
Dragonfly-bug: http://bugs.dragonflybsd.org/issues/2549
Summary of changes:
sys/netgraph7/netgraph.h | 38 +-
sys/netgraph7/netgraph/ng_base.c | 763 +++++------------------
sys/{sys/linux_types.h => netgraph7/netgraph2.h} | 54 +-
sys/netgraph7/socket/ng_socket.c | 45 +-
4 files changed, 218 insertions(+), 682 deletions(-)
copy sys/{sys/linux_types.h => netgraph7/netgraph2.h} (71%)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/ad9efc7b235ec25d20a098e85139e14458b6b2a3
--
DragonFly BSD source repository
More information about the Commits
mailing list