Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fdc6bef authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

tuntap: dont use a private kmem_cache



Commit 96442e42 (tuntap: choose the txq based on rxq)
added a per tun_struct kmem_cache.

As soon as several tun_struct are used, we get an error
because two caches cannot have same name.

Use the default kmalloc()/kfree_rcu(), as it reduce code
size and doesn't have performance impact here.

Reported-by: default avatarPaul Moore <pmoore@redhat.com>
Tested-by: default avatarPaul Moore <pmoore@redhat.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 30e6c9fa
Loading
Loading
Loading
Loading
+3 −21
Original line number Diff line number Diff line
@@ -180,7 +180,6 @@ struct tun_struct {
	int debug;
#endif
	spinlock_t lock;
	struct kmem_cache *flow_cache;
	struct hlist_head flows[TUN_NUM_FLOW_ENTRIES];
	struct timer_list flow_gc_timer;
	unsigned long ageing_time;
@@ -209,8 +208,8 @@ static struct tun_flow_entry *tun_flow_create(struct tun_struct *tun,
					      struct hlist_head *head,
					      u32 rxhash, u16 queue_index)
{
	struct tun_flow_entry *e = kmem_cache_alloc(tun->flow_cache,
						    GFP_ATOMIC);
	struct tun_flow_entry *e = kmalloc(sizeof(*e), GFP_ATOMIC);

	if (e) {
		tun_debug(KERN_INFO, tun, "create flow: hash %u index %u\n",
			  rxhash, queue_index);
@@ -223,19 +222,12 @@ static struct tun_flow_entry *tun_flow_create(struct tun_struct *tun,
	return e;
}

static void tun_flow_free(struct rcu_head *head)
{
	struct tun_flow_entry *e
		= container_of(head, struct tun_flow_entry, rcu);
	kmem_cache_free(e->tun->flow_cache, e);
}

static void tun_flow_delete(struct tun_struct *tun, struct tun_flow_entry *e)
{
	tun_debug(KERN_INFO, tun, "delete flow: hash %u index %u\n",
		  e->rxhash, e->queue_index);
	hlist_del_rcu(&e->hash_link);
	call_rcu(&e->rcu, tun_flow_free);
	kfree_rcu(e, rcu);
}

static void tun_flow_flush(struct tun_struct *tun)
@@ -833,12 +825,6 @@ static int tun_flow_init(struct tun_struct *tun)
{
	int i;

	tun->flow_cache = kmem_cache_create("tun_flow_cache",
					    sizeof(struct tun_flow_entry), 0, 0,
					    NULL);
	if (!tun->flow_cache)
		return -ENOMEM;

	for (i = 0; i < TUN_NUM_FLOW_ENTRIES; i++)
		INIT_HLIST_HEAD(&tun->flows[i]);

@@ -854,10 +840,6 @@ static void tun_flow_uninit(struct tun_struct *tun)
{
	del_timer_sync(&tun->flow_gc_timer);
	tun_flow_flush(tun);

	/* Wait for completion of call_rcu()'s */
	rcu_barrier();
	kmem_cache_destroy(tun->flow_cache);
}

/* Initialize net device. */