All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen.hemminger@vyatta.com>
To: Eric Dumazet <dada1@cosmosbay.com>
Cc: Robert Olsson <Robert.Olsson@data.slu.se>,
	David Miller <davem@davemloft.net>,
	robert.olsson@its.uu.se, netdev@vger.kernel.org
Subject: Re: [RFC 6/6] fib_trie: combine leaf and info
Date: Tue, 15 Jan 2008 09:47:53 -0800	[thread overview]
Message-ID: <20080115094753.32e35823@deepthought> (raw)
In-Reply-To: <20080115182544.98c18d08.dada1@cosmosbay.com>

This is how I did it:

--- a/net/ipv4/fib_trie.c	2008-01-15 09:14:53.000000000 -0800
+++ b/net/ipv4/fib_trie.c	2008-01-15 09:21:48.000000000 -0800
@@ -101,13 +101,6 @@ struct node {
 	t_key key;
 };
 
-struct leaf {
-	unsigned long parent;
-	t_key key;
-	struct hlist_head list;
-	struct rcu_head rcu;
-};
-
 struct leaf_info {
 	struct hlist_node hlist;
 	struct rcu_head rcu;
@@ -115,6 +108,13 @@ struct leaf_info {
 	struct list_head falh;
 };
 
+struct leaf {
+	unsigned long parent;
+	t_key key;
+	struct hlist_head list;
+	struct rcu_head rcu;
+};
+
 struct tnode {
 	unsigned long parent;
 	t_key key;
@@ -321,16 +321,6 @@ static void __leaf_free_rcu(struct rcu_h
 	kmem_cache_free(trie_leaf_kmem, leaf);
 }
 
-static void __leaf_info_free_rcu(struct rcu_head *head)
-{
-	kfree(container_of(head, struct leaf_info, rcu));
-}
-
-static inline void free_leaf_info(struct leaf_info *leaf)
-{
-	call_rcu(&leaf->rcu, __leaf_info_free_rcu);
-}
-
 static struct tnode *tnode_alloc(size_t size)
 {
 	struct page *pages;
@@ -357,7 +347,7 @@ static void __tnode_free_rcu(struct rcu_
 		free_pages((unsigned long)tn, get_order(size));
 }
 
-static inline void tnode_free(struct tnode *tn)
+static void tnode_free(struct tnode *tn)
 {
 	if (IS_LEAF(tn)) {
 		struct leaf *l = (struct leaf *) tn;
@@ -376,16 +366,41 @@ static struct leaf *leaf_new(void)
 	return l;
 }
 
+static void leaf_info_init(struct leaf_info *li, int plen)
+{
+	li->plen = plen;
+	INIT_LIST_HEAD(&li->falh);
+}
+
+static struct leaf_info *leaf_info_first(struct leaf *l, int plen)
+{
+	struct leaf_info *li = (struct leaf_info *) (l + 1);
+	leaf_info_init(li, plen);
+	return li;
+}
+
 static struct leaf_info *leaf_info_new(int plen)
 {
 	struct leaf_info *li = kmalloc(sizeof(struct leaf_info),  GFP_KERNEL);
-	if (li) {
-		li->plen = plen;
-		INIT_LIST_HEAD(&li->falh);
-	}
+	if (li)
+		leaf_info_init(li, plen);
+
 	return li;
 }
 
+static void __leaf_info_free_rcu(struct rcu_head *head)
+{
+	kfree(container_of(head, struct leaf_info, rcu));
+}
+
+static inline void free_leaf_info(struct leaf *l, struct leaf_info *leaf)
+{
+	if (leaf == (struct leaf_info *)(l + 1))
+		return;
+
+	call_rcu(&leaf->rcu, __leaf_info_free_rcu);
+}
+
 static struct tnode* tnode_new(t_key key, int pos, int bits)
 {
 	size_t sz = sizeof(struct tnode) + (sizeof(struct node *) << bits);
@@ -1047,18 +1062,13 @@ static struct list_head *fib_insert_node
 		insert_leaf_info(&l->list, li);
 		goto done;
 	}
-	l = leaf_new();
 
+	l = leaf_new();
 	if (!l)
 		return NULL;
 
 	l->key = key;
-	li = leaf_info_new(plen);
-
-	if (!li) {
-		tnode_free((struct tnode *) l);
-		return NULL;
-	}
+	li = leaf_info_first(l, plen);
 
 	fa_head = &li->falh;
 	insert_leaf_info(&l->list, li);
@@ -1091,7 +1101,7 @@ static struct list_head *fib_insert_node
 		}
 
 		if (!tn) {
-			free_leaf_info(li);
+			free_leaf_info(l, li);
 			tnode_free((struct tnode *) l);
 			return NULL;
 		}
@@ -1624,7 +1634,7 @@ static int fn_trie_delete(struct fib_tab
 
 	if (list_empty(fa_head)) {
 		hlist_del_rcu(&li->hlist);
-		free_leaf_info(li);
+		free_leaf_info(l, li);
 	}
 
 	if (hlist_empty(&l->list))
@@ -1668,7 +1678,7 @@ static int trie_flush_leaf(struct trie *
 
 		if (list_empty(&li->falh)) {
 			hlist_del_rcu(&li->hlist);
-			free_leaf_info(li);
+			free_leaf_info(l, li);
 		}
 	}
 	return found;
@@ -1935,7 +1945,8 @@ void __init fib_hash_init(void)
 	fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias),
 					  0, SLAB_PANIC, NULL);
 
-	trie_leaf_kmem = kmem_cache_create("ip_fib_trie", sizeof(struct leaf),
+	trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
+					   sizeof(struct leaf) + sizeof(struct leaf_info),
 					   0, SLAB_PANIC, NULL);
 }
 

  reply	other threads:[~2008-01-15 17:50 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20080112064513.803976049@linux-foundation.org>
     [not found] ` <20080112064646.056241123@linux-foundation.org>
2008-01-13  4:49   ` [PATCH 1/9] get rid of trie_init David Miller
     [not found] ` <20080112064646.132747871@linux-foundation.org>
2008-01-13  4:50   ` [PATCH 2/9] get rid of unused revision element David Miller
2008-01-14 11:44     ` Robert Olsson
2008-01-14 12:06       ` David Miller
2008-01-14 16:35         ` Stephen Hemminger
2008-01-15  7:07           ` David Miller
     [not found] ` <20080112064646.207183428@linux-foundation.org>
2008-01-13  4:53   ` [PATCH 3/9] move size information to pr_debug() David Miller
     [not found] ` <20080112064646.282104074@linux-foundation.org>
2008-01-13  4:55   ` [PATCH 4/9] statistics improvements David Miller
2008-01-13  5:33     ` Stephen Hemminger
2008-01-13  5:44       ` David Miller
2008-01-14 20:57         ` [PATCH] [IPV4] fib_trie: size and statistics Stephen Hemminger
     [not found]           ` <20080114164450.55f8c9b2@deepthought>
2008-01-15  0:46             ` [PATCH 3/6] [IPV4] trie: put leaf nodes in a slab cache Stephen Hemminger
2008-01-15  0:47               ` [PATCH 4/6] [IPV4] fib_trie style cleanup Stephen Hemminger
2008-01-15  2:58                 ` [PATCH 5/6] [IPV4] fib_trie: checkleaf calling convention Stephen Hemminger
2008-01-15  5:07                   ` [RFC 6/6] fib_trie: combine leaf and info Stephen Hemminger
2008-01-15  6:12                     ` Eric Dumazet
2008-01-15  6:16                       ` Eric Dumazet
2008-01-15 16:19                         ` Stephen Hemminger
2008-01-15 16:44                           ` Robert Olsson
2008-01-15 17:25                             ` Eric Dumazet
2008-01-15 17:47                               ` Stephen Hemminger [this message]
2008-01-15 18:10                                 ` Eric Dumazet
2008-01-15 18:15                                   ` Stephen Hemminger
2008-01-15 18:32                                     ` Eric Dumazet
2008-01-15 20:18                                 ` Robert Olsson
2008-01-15 21:16                                   ` Eric Dumazet
2008-01-15 17:59                               ` Robert Olsson
2008-01-15  6:49               ` [PATCH 3/6] [IPV4] trie: put leaf nodes in a slab cache Eric Dumazet
2008-01-15  7:29               ` David Miller
2008-01-15  5:00           ` [PATCH 2/6] [IPV4] fib hash|trie initialization Stephen Hemminger
2008-01-15  7:14             ` David Miller
2008-01-15  6:55           ` [PATCH] [IPV4] fib_trie: size and statistics Eric Dumazet
2008-01-15  7:28             ` David Miller
2008-01-15  7:12           ` David Miller
     [not found] ` <20080112064646.356466158@linux-foundation.org>
2008-01-13  4:56   ` [PATCH 5/9] use %u for unsigned printfs David Miller
     [not found] ` <20080112064646.432200237@linux-foundation.org>
2008-01-13  4:57   ` [PATCH 6/9] : fib_insert_node cleanup David Miller
     [not found] ` <20080112064646.507015655@linux-foundation.org>
2008-01-13  4:58   ` [PATCH 7/9] printk related cleanups David Miller
     [not found] ` <20080112064646.583836190@linux-foundation.org>
2008-01-13  5:23   ` [PATCH 8/9] add statistics David Miller
     [not found] ` <20080112064646.659443238@linux-foundation.org>
2008-01-12 11:16   ` [PATCH 9/9] fix sparse warnings Eric Dumazet
2008-01-12 11:28     ` David Miller
2008-01-12 21:08     ` Stephen Hemminger
2008-01-14 11:07       ` Robert Olsson
2008-01-14 17:34         ` Eric Dumazet
2008-01-14 17:59           ` Robert Olsson
2008-01-14 19:27             ` [FIB]: Avoid using static variables without proper locking Eric Dumazet
2008-01-15  7:10               ` David Miller
2008-01-12 21:09     ` [PATCH 9/9] fix sparse warnings Stephen Hemminger
2008-01-13  5:28       ` David Miller
2008-01-13 18:30     ` [FIB]: full_children & empty_children should be uint, not ushort Eric Dumazet
2008-01-13 22:02       ` Robert Olsson
2008-01-14  6:32         ` David Miller
2008-01-13  5:25   ` [PATCH 9/9] fix sparse warnings David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080115094753.32e35823@deepthought \
    --to=stephen.hemminger@vyatta.com \
    --cc=Robert.Olsson@data.slu.se \
    --cc=dada1@cosmosbay.com \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=robert.olsson@its.uu.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.