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>
This commit is contained in:
Родитель
b56141ab34
Коммит
0020356355
|
@ -125,7 +125,6 @@ struct tnode {
|
|||
unsigned int empty_children; /* KEYLENGTH bits needed */
|
||||
union {
|
||||
struct rcu_head rcu;
|
||||
struct work_struct work;
|
||||
struct tnode *tnode_free;
|
||||
};
|
||||
struct rt_trie_node __rcu *child[0];
|
||||
|
@ -383,12 +382,6 @@ static struct tnode *tnode_alloc(size_t size)
|
|||
return vzalloc(size);
|
||||
}
|
||||
|
||||
static void __tnode_vfree(struct work_struct *arg)
|
||||
{
|
||||
struct tnode *tn = container_of(arg, struct tnode, work);
|
||||
vfree(tn);
|
||||
}
|
||||
|
||||
static void __tnode_free_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct tnode *tn = container_of(head, struct tnode, rcu);
|
||||
|
@ -397,10 +390,8 @@ static void __tnode_free_rcu(struct rcu_head *head)
|
|||
|
||||
if (size <= PAGE_SIZE)
|
||||
kfree(tn);
|
||||
else {
|
||||
INIT_WORK(&tn->work, __tnode_vfree);
|
||||
schedule_work(&tn->work);
|
||||
}
|
||||
else
|
||||
vfree(tn);
|
||||
}
|
||||
|
||||
static inline void tnode_free(struct tnode *tn)
|
||||
|
|
Загрузка…
Ссылка в новой задаче