From: Wu Fengguang <wfg@mail.ustc.edu.cn>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Wu Fengguang <wfg@mail.ustc.edu.cn>,
Nick Piggin <nickpiggin@yahoo.com.au>,
Christoph Lameter <clameter@sgi.com>
Subject: [PATCH 02/33] radixtree: introduce __radix_tree_lookup_parent()
Date: Fri, 26 May 2006 19:39:08 +0800 [thread overview]
Message-ID: <348644373.06563@ustc.edu.cn> (raw)
Message-ID: <20060526115259.223408850@localhost.localdomain> (raw)
In-Reply-To: 20060526113906.084341801@localhost.localdomain
[-- Attachment #1: radixtree-lookup-parent.patch --]
[-- Type: text/plain, Size: 4241 bytes --]
Introduce a general lookup function to radix tree.
- __radix_tree_lookup_parent(root, index, level)
Perform partial lookup, return the @level'th parent of the slot at
@index.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Wu Fengguang <wfg@mail.ustc.edu.cn>
---
include/linux/radix-tree.h | 83 +++++++++++++++++++++++++++++++++++
lib/radix-tree.c | 104 ++++++++++++++++++++++++++++++++++-----------
2 files changed, 161 insertions(+), 26 deletions(-)
--- linux-2.6.17-rc4-mm3.orig/include/linux/radix-tree.h
+++ linux-2.6.17-rc4-mm3/include/linux/radix-tree.h
@@ -49,7 +49,8 @@ do { \
} while (0)
int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
-void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
+void *__radix_tree_lookup_parent(struct radix_tree_root *,
+ unsigned long, unsigned int);
void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long);
void *radix_tree_delete(struct radix_tree_root *, unsigned long);
unsigned int
@@ -74,4 +75,17 @@ static inline void radix_tree_preload_en
preempt_enable();
}
+/**
+ * radix_tree_lookup - perform lookup operation on a radix tree
+ * @root: radix tree root
+ * @index: index key
+ *
+ * Lookup the item at the position @index in the radix tree @root.
+ */
+static inline void *radix_tree_lookup(struct radix_tree_root *root,
+ unsigned long index)
+{
+ return __radix_tree_lookup_parent(root, index, 0);
+}
+
#endif /* _LINUX_RADIX_TREE_H */
--- linux-2.6.17-rc4-mm3.orig/lib/radix-tree.c
+++ linux-2.6.17-rc4-mm3/lib/radix-tree.c
@@ -309,36 +309,46 @@ int radix_tree_insert(struct radix_tree_
}
EXPORT_SYMBOL(radix_tree_insert);
-static inline void **__lookup_slot(struct radix_tree_root *root,
- unsigned long index)
+/**
+ * __radix_tree_lookup_parent - low level lookup routine
+ * @root: radix tree root
+ * @index: index key
+ * @level: stop at that many levels from the tree leaf
+ *
+ * Lookup the @level'th parent of the slot at @index in radix tree @root.
+ * The return value is:
+ * @level == 0: page at @index;
+ * @level == 1: the corresponding bottom level tree node;
+ * @level < height: (@level-1)th parent node of the bottom node
+ * that contains @index;
+ * @level >= height: the root node.
+ */
+void *__radix_tree_lookup_parent(struct radix_tree_root *root,
+ unsigned long index, unsigned int level)
{
unsigned int height, shift;
- struct radix_tree_node **slot;
+ struct radix_tree_node *slot;
height = root->height;
if (index > radix_tree_maxindex(height))
return NULL;
- if (height == 0 && root->rnode)
- return (void **)&root->rnode;
-
shift = (height-1) * RADIX_TREE_MAP_SHIFT;
- slot = &root->rnode;
+ slot = root->rnode;
- while (height > 0) {
- if (*slot == NULL)
+ while (height > level) {
+ if (slot == NULL)
return NULL;
- slot = (struct radix_tree_node **)
- ((*slot)->slots +
- ((index >> shift) & RADIX_TREE_MAP_MASK));
+ slot = slot->slots[(index >> shift) & RADIX_TREE_MAP_MASK];
shift -= RADIX_TREE_MAP_SHIFT;
height--;
}
- return (void **)slot;
+ return slot;
}
+EXPORT_SYMBOL(__radix_tree_lookup_parent);
/**
* radix_tree_lookup_slot - lookup a slot in a radix tree
@@ -350,25 +360,15 @@ static inline void **__lookup_slot(struc
*/
void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
{
- return __lookup_slot(root, index);
-}
-EXPORT_SYMBOL(radix_tree_lookup_slot);
+ struct radix_tree_node *node;
-/**
- * radix_tree_lookup - perform lookup operation on a radix tree
- * @root: radix tree root
- * @index: index key
- *
- * Lookup the item at the position @index in the radix tree @root.
- */
-void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
-{
- void **slot;
+ if (root->height == 0)
+ return &root->rnode;
- slot = __lookup_slot(root, index);
- return slot != NULL ? *slot : NULL;
+ node = __radix_tree_lookup_parent(root, index, 1);
+ return node ? node->slots + (index & RADIX_TREE_MAP_MASK) : NULL;
}
-EXPORT_SYMBOL(radix_tree_lookup);
+EXPORT_SYMBOL(radix_tree_lookup_slot);
/**
* radix_tree_tag_set - set a tag on a radix tree node
--
next parent reply other threads:[~2006-05-26 11:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20060526113906.084341801@localhost.localdomain>
[not found] ` <20060526115259.223408850@localhost.localdomain>
2006-05-26 11:39 ` Wu Fengguang [this message]
2006-05-26 13:56 ` [PATCH 02/33] radixtree: introduce __radix_tree_lookup_parent() Christoph Lameter
[not found] ` <20060526140951.GA13954@mail.ustc.edu.cn>
2006-05-26 14:09 ` Wu Fengguang
[not found] ` <20060526115259.809011306@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 03/33] radixtree: introduce radix_tree_scan_hole[_backward]() Wu Fengguang
[not found] ` <20060526115300.609227164@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 04/33] mm: introduce probe_pages() Wu Fengguang
[not found] ` <20060526115301.640751284@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 06/33] readahead: add look-ahead support to __do_page_cache_readahead() Wu Fengguang
[not found] ` <20060526115302.278500703@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 07/33] readahead: delay page release in do_generic_mapping_read() Wu Fengguang
[not found] ` <20060526115303.499451943@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 09/33] readahead: {MIN,MAX}_RA_PAGES Wu Fengguang
[not found] ` <20060526115304.094503892@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 10/33] readahead: events accounting Wu Fengguang
[not found] ` <20060526115304.821789643@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 11/33] readahead: rescue_pages() Wu Fengguang
[not found] ` <20060526115305.437903777@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 12/33] readahead: sysctl parameters Wu Fengguang
[not found] ` <20060526115306.535453644@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 14/33] readahead: state based method - aging accounting Wu Fengguang
[not found] ` <20060526115307.794859372@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 16/33] readahead: state based method Wu Fengguang
[not found] ` <20060526115308.522890112@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 17/33] readahead: context " Wu Fengguang
[not found] ` <20060526115309.581525784@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 19/33] readahead: initial method - thrashing guard size Wu Fengguang
[not found] ` <20060526115310.948231030@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 21/33] readahead: initial method - user recommended size Wu Fengguang
[not found] ` <20060526115311.541535720@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 22/33] readahead: initial method Wu Fengguang
[not found] ` <20060526115312.145248016@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 23/33] readahead: backward prefetching method Wu Fengguang
[not found] ` <20060526115313.491576583@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 25/33] readahead: thrashing recovery method Wu Fengguang
[not found] ` <20060526115314.929319286@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 26/33] readahead: call scheme Wu Fengguang
[not found] ` <20060526115315.823465555@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 28/33] readahead: loop case Wu Fengguang
[not found] ` <20060526115316.335626686@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 29/33] readahead: nfsd case Wu Fengguang
[not found] ` <20060526115316.925345724@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 30/33] readahead: turn on by default Wu Fengguang
[not found] ` <20060526115317.663871267@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 31/33] readahead: debug radix tree new functions Wu Fengguang
[not found] ` <20060526115318.181350700@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 32/33] readahead: debug traces showing accessed file names Wu Fengguang
[not found] ` <20060526115318.520512078@localhost.localdomain>
2006-05-26 11:39 ` [PATCH 33/33] readahead: debug traces showing read patterns Wu Fengguang
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=348644373.06563@ustc.edu.cn \
--to=wfg@mail.ustc.edu.cn \
--cc=akpm@osdl.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nickpiggin@yahoo.com.au \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox