idr: Rename idr_for_each_entry_ext
Most places in the kernel that we need to distinguish functions by the type of their arguments, we use '_ul' as a suffix for the unsigned long variant, not '_ext'. Also add kernel-doc. Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
This commit is contained in:
parent
460488c58c
commit
7a4575778f
@ -88,7 +88,7 @@ int idr_alloc_cyclic(struct idr *, void *entry, int start, int end, gfp_t);
|
||||
int idr_for_each(const struct idr *,
|
||||
int (*fn)(int id, void *p, void *data), void *data);
|
||||
void *idr_get_next(struct idr *, int *nextid);
|
||||
void *idr_get_next_ext(struct idr *idr, unsigned long *nextid);
|
||||
void *idr_get_next_ul(struct idr *, unsigned long *nextid);
|
||||
void *idr_replace(struct idr *, void *, unsigned long id);
|
||||
void idr_destroy(struct idr *);
|
||||
|
||||
@ -121,16 +121,18 @@ static inline void idr_preload_end(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* idr_find - return pointer for given id
|
||||
* @idr: idr handle
|
||||
* @id: lookup key
|
||||
* idr_find() - Return pointer for given ID.
|
||||
* @idr: IDR handle.
|
||||
* @id: Pointer ID.
|
||||
*
|
||||
* Return the pointer given the id it has been registered with. A %NULL
|
||||
* return indicates that @id is not valid or you passed %NULL in
|
||||
* idr_get_new().
|
||||
* Looks up the pointer associated with this ID. A %NULL pointer may
|
||||
* indicate that @id is not allocated or that the %NULL pointer was
|
||||
* associated with this ID.
|
||||
*
|
||||
* This function can be called under rcu_read_lock(), given that the leaf
|
||||
* pointers lifetimes are correctly managed.
|
||||
*
|
||||
* Return: The pointer associated with this ID.
|
||||
*/
|
||||
static inline void *idr_find(const struct idr *idr, unsigned long id)
|
||||
{
|
||||
@ -138,28 +140,38 @@ static inline void *idr_find(const struct idr *idr, unsigned long id)
|
||||
}
|
||||
|
||||
/**
|
||||
* idr_for_each_entry - iterate over an idr's elements of a given type
|
||||
* @idr: idr handle
|
||||
* @entry: the type * to use as cursor
|
||||
* @id: id entry's key
|
||||
* idr_for_each_entry() - Iterate over an IDR's elements of a given type.
|
||||
* @idr: IDR handle.
|
||||
* @entry: The type * to use as cursor
|
||||
* @id: Entry ID.
|
||||
*
|
||||
* @entry and @id do not need to be initialized before the loop, and
|
||||
* after normal terminatinon @entry is left with the value NULL. This
|
||||
* after normal termination @entry is left with the value NULL. This
|
||||
* is convenient for a "not found" value.
|
||||
*/
|
||||
#define idr_for_each_entry(idr, entry, id) \
|
||||
for (id = 0; ((entry) = idr_get_next(idr, &(id))) != NULL; ++id)
|
||||
#define idr_for_each_entry_ext(idr, entry, id) \
|
||||
for (id = 0; ((entry) = idr_get_next_ext(idr, &(id))) != NULL; ++id)
|
||||
|
||||
/**
|
||||
* idr_for_each_entry_continue - continue iteration over an idr's elements of a given type
|
||||
* @idr: idr handle
|
||||
* @entry: the type * to use as cursor
|
||||
* @id: id entry's key
|
||||
* idr_for_each_entry_ul() - Iterate over an IDR's elements of a given type.
|
||||
* @idr: IDR handle.
|
||||
* @entry: The type * to use as cursor.
|
||||
* @id: Entry ID.
|
||||
*
|
||||
* Continue to iterate over list of given type, continuing after
|
||||
* the current position.
|
||||
* @entry and @id do not need to be initialized before the loop, and
|
||||
* after normal termination @entry is left with the value NULL. This
|
||||
* is convenient for a "not found" value.
|
||||
*/
|
||||
#define idr_for_each_entry_ul(idr, entry, id) \
|
||||
for (id = 0; ((entry) = idr_get_next_ul(idr, &(id))) != NULL; ++id)
|
||||
|
||||
/**
|
||||
* idr_for_each_entry_continue() - Continue iteration over an IDR's elements of a given type
|
||||
* @idr: IDR handle.
|
||||
* @entry: The type * to use as a cursor.
|
||||
* @id: Entry ID.
|
||||
*
|
||||
* Continue to iterate over entries, continuing after the current position.
|
||||
*/
|
||||
#define idr_for_each_entry_continue(idr, entry, id) \
|
||||
for ((entry) = idr_get_next((idr), &(id)); \
|
||||
|
30
lib/idr.c
30
lib/idr.c
@ -136,13 +136,13 @@ int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)
|
||||
EXPORT_SYMBOL(idr_alloc_cyclic);
|
||||
|
||||
/**
|
||||
* idr_for_each - iterate through all stored pointers
|
||||
* @idr: idr handle
|
||||
* @fn: function to be called for each pointer
|
||||
* @data: data passed to callback function
|
||||
* idr_for_each() - Iterate through all stored pointers.
|
||||
* @idr: IDR handle.
|
||||
* @fn: Function to be called for each pointer.
|
||||
* @data: Data passed to callback function.
|
||||
*
|
||||
* The callback function will be called for each entry in @idr, passing
|
||||
* the id, the pointer and the data pointer passed to this function.
|
||||
* the ID, the entry and @data.
|
||||
*
|
||||
* If @fn returns anything other than %0, the iteration stops and that
|
||||
* value is returned from this function.
|
||||
@ -169,9 +169,9 @@ int idr_for_each(const struct idr *idr,
|
||||
EXPORT_SYMBOL(idr_for_each);
|
||||
|
||||
/**
|
||||
* idr_get_next - Find next populated entry
|
||||
* @idr: idr handle
|
||||
* @nextid: Pointer to lowest possible ID to return
|
||||
* idr_get_next() - Find next populated entry.
|
||||
* @idr: IDR handle.
|
||||
* @nextid: Pointer to an ID.
|
||||
*
|
||||
* Returns the next populated entry in the tree with an ID greater than
|
||||
* or equal to the value pointed to by @nextid. On exit, @nextid is updated
|
||||
@ -192,7 +192,17 @@ void *idr_get_next(struct idr *idr, int *nextid)
|
||||
}
|
||||
EXPORT_SYMBOL(idr_get_next);
|
||||
|
||||
void *idr_get_next_ext(struct idr *idr, unsigned long *nextid)
|
||||
/**
|
||||
* idr_get_next_ul() - Find next populated entry.
|
||||
* @idr: IDR handle.
|
||||
* @nextid: Pointer to an ID.
|
||||
*
|
||||
* Returns the next populated entry in the tree with an ID greater than
|
||||
* or equal to the value pointed to by @nextid. On exit, @nextid is updated
|
||||
* to the ID of the found value. To use in a loop, the value pointed to by
|
||||
* nextid must be incremented by the user.
|
||||
*/
|
||||
void *idr_get_next_ul(struct idr *idr, unsigned long *nextid)
|
||||
{
|
||||
struct radix_tree_iter iter;
|
||||
void __rcu **slot;
|
||||
@ -204,7 +214,7 @@ void *idr_get_next_ext(struct idr *idr, unsigned long *nextid)
|
||||
*nextid = iter.index;
|
||||
return rcu_dereference_raw(*slot);
|
||||
}
|
||||
EXPORT_SYMBOL(idr_get_next_ext);
|
||||
EXPORT_SYMBOL(idr_get_next_ul);
|
||||
|
||||
/**
|
||||
* idr_replace() - replace pointer for given ID.
|
||||
|
@ -124,7 +124,7 @@ static int tcf_dump_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
|
||||
|
||||
s_i = cb->args[0];
|
||||
|
||||
idr_for_each_entry_ext(idr, p, id) {
|
||||
idr_for_each_entry_ul(idr, p, id) {
|
||||
index++;
|
||||
if (index < s_i)
|
||||
continue;
|
||||
@ -181,7 +181,7 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
|
||||
if (nla_put_string(skb, TCA_KIND, ops->kind))
|
||||
goto nla_put_failure;
|
||||
|
||||
idr_for_each_entry_ext(idr, p, id) {
|
||||
idr_for_each_entry_ul(idr, p, id) {
|
||||
ret = __tcf_idr_release(p, false, true);
|
||||
if (ret == ACT_P_DELETED) {
|
||||
module_put(ops->owner);
|
||||
@ -351,7 +351,7 @@ void tcf_idrinfo_destroy(const struct tc_action_ops *ops,
|
||||
int ret;
|
||||
unsigned long id = 1;
|
||||
|
||||
idr_for_each_entry_ext(idr, p, id) {
|
||||
idr_for_each_entry_ul(idr, p, id) {
|
||||
ret = __tcf_idr_release(p, false, true);
|
||||
if (ret == ACT_P_DELETED)
|
||||
module_put(ops->owner);
|
||||
|
Loading…
Reference in New Issue
Block a user