From patchwork Fri Dec 21 17:17:21 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 207860 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E97472C008A for ; Sat, 22 Dec 2012 04:17:29 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751313Ab2LURR0 (ORCPT ); Fri, 21 Dec 2012 12:17:26 -0500 Received: from mail-pb0-f48.google.com ([209.85.160.48]:51345 "EHLO mail-pb0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750983Ab2LURRY (ORCPT ); Fri, 21 Dec 2012 12:17:24 -0500 Received: by mail-pb0-f48.google.com with SMTP id rq13so2875855pbb.7 for ; Fri, 21 Dec 2012 09:17:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:subject:from:to:cc:in-reply-to:references:content-type :date:message-id:mime-version:x-mailer:content-transfer-encoding; bh=uB4pzZBAlknOqrr1TTIl/46PsL2hJvY6Q/aEf7ru+OQ=; b=ukjzEZyDvq7dq46h3xCfHFxlu271FXn1X2atqTIw62geuSesASrUbE+rBFersYoa/7 cNCaWu9hLhbziTCMPovvpuGSx3jFL80uYdOU6PUk4Ft9h5ZvQgvCp7BCfk82RAkZTx1p pNyhUReT6uXhiS/52rwb1K67QNYL046dQKfPZSs9mOZp3a0YCkhttj6XnUAULY/u98GJ yH3MRu6Inxv4b1PwylDXwXVy+sFGBLnzeHiJFT3PY+IUVym8Nhs7nzN4fCciI6GaHReO kix+ogSYQLIvPVuOkE16/evASd37goiCVTM6xkwklvEIoGy18qdvxc++GnX3BXGRs8N3 Rr0w== X-Received: by 10.68.228.2 with SMTP id se2mr42113863pbc.93.1356110244379; Fri, 21 Dec 2012 09:17:24 -0800 (PST) Received: from ?IPv6:2620:0:1000:3304:224:d7ff:fee3:2a94? ([2620:0:1000:3304:224:d7ff:fee3:2a94]) by mx.google.com with ESMTPS id se4sm7299100pbb.13.2012.12.21.09.17.22 (version=SSLv3 cipher=OTHER); Fri, 21 Dec 2012 09:17:23 -0800 (PST) Subject: [PATCH] tuntap: dont use a private kmem_cache From: Eric Dumazet To: Paul Moore , David Miller Cc: Jason Wang , netdev@vger.kernel.org, Stephen Hemminger In-Reply-To: <2090364.S7KStA6R4d@sifl> References: <4151394.nMo40zlg68@sifl> <1356046697.21834.3606.camel@edumazet-glaptop> <2090364.S7KStA6R4d@sifl> Date: Fri, 21 Dec 2012 09:17:21 -0800 Message-ID: <1356110241.21834.7530.camel@edumazet-glaptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet Commit 96442e42429 (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: Paul Moore Tested-by: Paul Moore Signed-off-by: Eric Dumazet Acked-by: Stephen Hemminger Acked-by: Jason Wang --- drivers/net/tun.c | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 504f7f1..fbd106e 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -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. */