diff options
author | Al Viro <viro@ZenIV.linux.org.uk> | 2013-05-05 12:03:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-06 11:06:51 -0400 |
commit | 0020356355192cbaf6d315515e6c95bd09618c3b (patch) | |
tree | 8437e2fe173620f1b08390a728fac5d64a2d0374 /net/ipv4/fib_trie.c | |
parent | b56141ab34e2c3e2d7960cea12c20c99530c0c76 (diff) |
fib_trie: no need to delay vfree()
Now that vfree() can be called from interrupt contexts, there's no
need to play games with schedule_work() to escape calling vfree()
from RCU callbacks.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/fib_trie.c')
-rw-r--r-- | net/ipv4/fib_trie.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ff06b7543d9f..49616fed9340 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -125,7 +125,6 @@ struct tnode { | |||
125 | unsigned int empty_children; /* KEYLENGTH bits needed */ | 125 | unsigned int empty_children; /* KEYLENGTH bits needed */ |
126 | union { | 126 | union { |
127 | struct rcu_head rcu; | 127 | struct rcu_head rcu; |
128 | struct work_struct work; | ||
129 | struct tnode *tnode_free; | 128 | struct tnode *tnode_free; |
130 | }; | 129 | }; |
131 | struct rt_trie_node __rcu *child[0]; | 130 | struct rt_trie_node __rcu *child[0]; |
@@ -383,12 +382,6 @@ static struct tnode *tnode_alloc(size_t size) | |||
383 | return vzalloc(size); | 382 | return vzalloc(size); |
384 | } | 383 | } |
385 | 384 | ||
386 | static void __tnode_vfree(struct work_struct *arg) | ||
387 | { | ||
388 | struct tnode *tn = container_of(arg, struct tnode, work); | ||
389 | vfree(tn); | ||
390 | } | ||
391 | |||
392 | static void __tnode_free_rcu(struct rcu_head *head) | 385 | static void __tnode_free_rcu(struct rcu_head *head) |
393 | { | 386 | { |
394 | struct tnode *tn = container_of(head, struct tnode, rcu); | 387 | struct tnode *tn = container_of(head, struct tnode, rcu); |
@@ -397,10 +390,8 @@ static void __tnode_free_rcu(struct rcu_head *head) | |||
397 | 390 | ||
398 | if (size <= PAGE_SIZE) | 391 | if (size <= PAGE_SIZE) |
399 | kfree(tn); | 392 | kfree(tn); |
400 | else { | 393 | else |
401 | INIT_WORK(&tn->work, __tnode_vfree); | 394 | vfree(tn); |
402 | schedule_work(&tn->work); | ||
403 | } | ||
404 | } | 395 | } |
405 | 396 | ||
406 | static inline void tnode_free(struct tnode *tn) | 397 | static inline void tnode_free(struct tnode *tn) |