diff options
author | Kristian Hoegsberg <krh@redhat.com> | 2007-07-15 23:37:24 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-16 09:05:34 -0700 |
commit | 96d7fa421e6424ad9ef6d1d039375dc2edb63fe8 (patch) | |
tree | ba8a8200bda4576e1e4dcce2ff27a7a7a94723a2 /include/linux/idr.h | |
parent | de7d4f0e1172a72277d660fa0be59654ea02bed0 (diff) | |
download | linux-stable-96d7fa421e6424ad9ef6d1d039375dc2edb63fe8.tar.gz linux-stable-96d7fa421e6424ad9ef6d1d039375dc2edb63fe8.tar.bz2 linux-stable-96d7fa421e6424ad9ef6d1d039375dc2edb63fe8.zip |
lib: add idr_for_each()
This patch adds an iterator function for the idr data structure. Compared
to just iterating through the idr with an integer and idr_find, this
iterator is (almost, but not quite) linear in the number of elements, as
opposed to the number of integers in the range covered by the idr. This
makes a difference for sparse idrs, but more importantly, it's a nicer way
to iterate through the elements.
The drm subsystem is moving to idr for tracking contexts and drawables, and
with this change, we can use the idr exclusively for tracking these
resources.
[akpm@linux-foundation.org: fix comment]
Signed-off-by: Kristian Hoegsberg <krh@redhat.com>
Cc: Tejun Heo <htejun@gmail.com>
Cc: Dave Airlie <airlied@linux.ie>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/idr.h')
-rw-r--r-- | include/linux/idr.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/idr.h b/include/linux/idr.h index 915572fa030b..8442c0bffc06 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h @@ -78,6 +78,8 @@ void *idr_find(struct idr *idp, int id); int idr_pre_get(struct idr *idp, gfp_t gfp_mask); int idr_get_new(struct idr *idp, void *ptr, int *id); int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id); +int idr_for_each(struct idr *idp, + int (*fn)(int id, void *p, void *data), void *data); void *idr_replace(struct idr *idp, void *ptr, int id); void idr_remove(struct idr *idp, int id); void idr_destroy(struct idr *idp); |