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>
Subject: [PATCH 03/23] radixtree: hole scanning functions
Date: Sun, 19 Mar 2006 10:34:16 +0800 [thread overview]
Message-ID: <20060319023449.844852000@localhost.localdomain> (raw)
In-Reply-To: <20060319023413.305977000@localhost.localdomain>
[-- Attachment #1: radixtree-hole-scanning-functions.patch --]
[-- Type: text/plain, Size: 3778 bytes --]
Introduce a pair of functions to scan radix tree for hole/empty item.
include/linux/radix-tree.h | 4 +
lib/radix-tree.c | 104 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 108 insertions(+)
Signed-off-by: Wu Fengguang <wfg@mail.ustc.edu.cn>
---
--- linux-2.6.16-rc6-mm2.orig/include/linux/radix-tree.h
+++ linux-2.6.16-rc6-mm2/include/linux/radix-tree.h
@@ -68,6 +68,10 @@ unsigned int radix_tree_cache_count(stru
void *radix_tree_cache_lookup_node(struct radix_tree_root *root,
struct radix_tree_cache *cache,
unsigned long index, unsigned int level);
+unsigned long radix_tree_scan_hole_backward(struct radix_tree_root *root,
+ unsigned long index, unsigned long max_scan);
+unsigned long radix_tree_scan_hole(struct radix_tree_root *root,
+ unsigned long index, unsigned long max_scan);
unsigned int
radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
unsigned long first_index, unsigned int max_items);
--- linux-2.6.16-rc6-mm2.orig/lib/radix-tree.c
+++ linux-2.6.16-rc6-mm2/lib/radix-tree.c
@@ -397,6 +397,110 @@ unsigned int radix_tree_cache_count(stru
EXPORT_SYMBOL(radix_tree_cache_count);
/**
+ * radix_tree_scan_hole_backward - scan backward for hole
+ * @root: radix tree root
+ * @index: index key
+ * @max_scan: advice on max items to scan (it may scan a little more)
+ *
+ * Scan backward from @index for a hole/empty item, stop when
+ * - hit hole
+ * - @max_scan or more items scanned
+ * - hit index 0
+ *
+ * Return the correponding index.
+ */
+unsigned long radix_tree_scan_hole_backward(struct radix_tree_root *root,
+ unsigned long index, unsigned long max_scan)
+{
+ struct radix_tree_cache cache;
+ struct radix_tree_node *node;
+ unsigned long origin;
+ int i;
+
+ origin = index;
+ radix_tree_cache_init(&cache);
+
+ while (origin - index < max_scan) {
+ node = radix_tree_cache_lookup_node(root, &cache, index, 1);
+ if (!node)
+ break;
+
+ if (node->count == RADIX_TREE_MAP_SIZE) {
+ index = (index - RADIX_TREE_MAP_SIZE) |
+ RADIX_TREE_MAP_MASK;
+ goto check_underflow;
+ }
+
+ for (i = index & RADIX_TREE_MAP_MASK; i >= 0; i--, index--) {
+ if (!node->slots[i])
+ goto out;
+ }
+
+check_underflow:
+ if (unlikely(index == ULONG_MAX)) {
+ index = 0;
+ break;
+ }
+ }
+
+out:
+ return index;
+}
+EXPORT_SYMBOL(radix_tree_scan_hole_backward);
+
+/**
+ * radix_tree_scan_hole - scan for hole
+ * @root: radix tree root
+ * @index: index key
+ * @max_scan: advice on max items to scan (it may scan a little more)
+ *
+ * Scan forward from @index for a hole/empty item, stop when
+ * - hit hole
+ * - hit EOF
+ * - hit index ULONG_MAX
+ * - @max_scan or more items scanned
+ *
+ * Return the correponding index.
+ */
+unsigned long radix_tree_scan_hole(struct radix_tree_root *root,
+ unsigned long index, unsigned long max_scan)
+{
+ struct radix_tree_cache cache;
+ struct radix_tree_node *node;
+ unsigned long origin;
+ int i;
+
+ origin = index;
+ radix_tree_cache_init(&cache);
+
+ while (index - origin < max_scan) {
+ node = radix_tree_cache_lookup_node(root, &cache, index, 1);
+ if (!node)
+ break;
+
+ if (node->count == RADIX_TREE_MAP_SIZE) {
+ index = (index | RADIX_TREE_MAP_MASK) + 1;
+ goto check_overflow;
+ }
+
+ for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE;
+ i++, index++) {
+ if (!node->slots[i])
+ goto out;
+ }
+
+check_overflow:
+ if (unlikely(!index)) {
+ index = ULONG_MAX;
+ break;
+ }
+ }
+out:
+ return index;
+}
+EXPORT_SYMBOL(radix_tree_scan_hole);
+
+/**
* radix_tree_tag_set - set a tag on a radix tree node
* @root: radix tree root
* @index: index key
--
next prev parent reply other threads:[~2006-03-19 2:41 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-19 2:34 [PATCH 00/23] Adaptive read-ahead V11 Wu Fengguang
2006-03-19 2:34 ` [PATCH 01/23] readahead: kconfig options Wu Fengguang
2006-03-19 2:34 ` [PATCH 02/23] radixtree: look-aside cache Wu Fengguang
2006-03-20 16:01 ` Christoph Lameter
2006-03-21 2:19 ` Wu Fengguang
2006-03-19 2:34 ` Wu Fengguang [this message]
2006-03-19 2:34 ` [PATCH 04/23] readahead: page flag PG_readahead Wu Fengguang
2006-03-19 2:34 ` [PATCH 05/23] readahead: refactor do_generic_mapping_read() Wu Fengguang
2006-03-19 2:34 ` [PATCH 06/23] readahead: refactor __do_page_cache_readahead() Wu Fengguang
2006-03-19 2:34 ` [PATCH 07/23] readahead: insert cond_resched() calls Wu Fengguang
2006-03-19 3:50 ` Lee Revell
2006-03-19 5:32 ` Wu Fengguang
2006-03-20 13:31 ` Wu Fengguang
2006-03-19 2:34 ` [PATCH 08/23] readahead: common macros Wu Fengguang
2006-03-19 2:34 ` [PATCH 09/23] readahead: events accounting Wu Fengguang
2006-03-19 2:34 ` [PATCH 10/23] readahead: support functions Wu Fengguang
2006-03-19 2:34 ` [PATCH 11/23] readahead: sysctl parameters Wu Fengguang
2006-03-19 2:34 ` [PATCH 12/23] readahead: min/max sizes Wu Fengguang
2006-03-19 2:34 ` [PATCH 13/23] readahead: page cache aging accounting Wu Fengguang
2006-03-19 2:34 ` [PATCH 14/23] readahead: state based method Wu Fengguang
2006-03-19 2:34 ` [PATCH 15/23] readahead: context " Wu Fengguang
2006-03-19 2:34 ` [PATCH 16/23] readahead: other methods Wu Fengguang
2006-03-19 2:34 ` [PATCH 17/23] readahead: call scheme Wu Fengguang
2006-03-19 2:34 ` [PATCH 18/23] readahead: laptop mode Wu Fengguang
2006-03-19 2:34 ` [PATCH 19/23] readahead: loop case Wu Fengguang
2006-03-19 2:34 ` [PATCH 20/23] readahead: nfsd case Wu Fengguang
2006-03-19 2:34 ` [PATCH 21/23] readahead: debug radix tree new functions Wu Fengguang
2006-03-19 2:34 ` [PATCH 22/23] readahead: debug traces showing accessed file names Wu Fengguang
2006-03-19 2:34 ` [PATCH 23/23] readahead: debug traces showing read patterns Wu Fengguang
2006-03-19 3:10 ` [PATCH 00/23] Adaptive read-ahead V11 Jon Smirl
2006-03-19 3:47 ` Wu Fengguang
2006-03-19 4:10 ` Jon Smirl
2006-03-19 5:09 ` Wu Fengguang
2006-03-19 15:53 ` Jon Smirl
2006-03-20 13:54 ` Wu Fengguang
2006-03-27 21:38 ` Matt Heler
2006-03-28 3:44 ` 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=20060319023449.844852000@localhost.localdomain \
--to=wfg@mail.ustc.edu.cn \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/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
Powered by JetHome