Merge branch 'ida-4.19' of git://git.infradead.org/users/willy/linux-dax
Pull IDA updates from Matthew Wilcox:
"A better IDA API:
id = ida_alloc(ida, GFP_xxx);
ida_free(ida, id);
rather than the cumbersome ida_simple_get(), ida_simple_remove().
The new IDA API is similar to ida_simple_get() but better named. The
internal restructuring of the IDA code removes the bitmap
preallocation nonsense.
I hope the net -200 lines of code is convincing"
* 'ida-4.19' of git://git.infradead.org/users/willy/linux-dax: (29 commits)
ida: Change ida_get_new_above to return the id
ida: Remove old API
test_ida: check_ida_destroy and check_ida_alloc
test_ida: Convert check_ida_conv to new API
test_ida: Move ida_check_max
test_ida: Move ida_check_leaf
idr-test: Convert ida_check_nomem to new API
ida: Start new test_ida module
target/iscsi: Allocate session IDs from an IDA
iscsi target: fix session creation failure handling
drm/vmwgfx: Convert to new IDA API
dmaengine: Convert to new IDA API
ppc: Convert vas ID allocation to new IDA API
media: Convert entity ID allocation to new IDA API
ppc: Convert mmu context allocation to new IDA API
Convert net_namespace to new IDA API
cb710: Convert to new IDA API
rsxx: Convert to new IDA API
osd: Convert to new IDA API
sd: Convert to new IDA API
...
This commit is contained in:
commit
aba16dc5cf
28 changed files with 486 additions and 680 deletions
|
|
@ -236,34 +236,74 @@ struct ida {
|
|||
}
|
||||
#define DEFINE_IDA(name) struct ida name = IDA_INIT(name)
|
||||
|
||||
int ida_pre_get(struct ida *ida, gfp_t gfp_mask);
|
||||
int ida_get_new_above(struct ida *ida, int starting_id, int *p_id);
|
||||
void ida_remove(struct ida *ida, int id);
|
||||
int ida_alloc_range(struct ida *, unsigned int min, unsigned int max, gfp_t);
|
||||
void ida_free(struct ida *, unsigned int id);
|
||||
void ida_destroy(struct ida *ida);
|
||||
|
||||
int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end,
|
||||
gfp_t gfp_mask);
|
||||
void ida_simple_remove(struct ida *ida, unsigned int id);
|
||||
/**
|
||||
* ida_alloc() - Allocate an unused ID.
|
||||
* @ida: IDA handle.
|
||||
* @gfp: Memory allocation flags.
|
||||
*
|
||||
* Allocate an ID between 0 and %INT_MAX, inclusive.
|
||||
*
|
||||
* Context: Any context.
|
||||
* Return: The allocated ID, or %-ENOMEM if memory could not be allocated,
|
||||
* or %-ENOSPC if there are no free IDs.
|
||||
*/
|
||||
static inline int ida_alloc(struct ida *ida, gfp_t gfp)
|
||||
{
|
||||
return ida_alloc_range(ida, 0, ~0, gfp);
|
||||
}
|
||||
|
||||
/**
|
||||
* ida_alloc_min() - Allocate an unused ID.
|
||||
* @ida: IDA handle.
|
||||
* @min: Lowest ID to allocate.
|
||||
* @gfp: Memory allocation flags.
|
||||
*
|
||||
* Allocate an ID between @min and %INT_MAX, inclusive.
|
||||
*
|
||||
* Context: Any context.
|
||||
* Return: The allocated ID, or %-ENOMEM if memory could not be allocated,
|
||||
* or %-ENOSPC if there are no free IDs.
|
||||
*/
|
||||
static inline int ida_alloc_min(struct ida *ida, unsigned int min, gfp_t gfp)
|
||||
{
|
||||
return ida_alloc_range(ida, min, ~0, gfp);
|
||||
}
|
||||
|
||||
/**
|
||||
* ida_alloc_max() - Allocate an unused ID.
|
||||
* @ida: IDA handle.
|
||||
* @max: Highest ID to allocate.
|
||||
* @gfp: Memory allocation flags.
|
||||
*
|
||||
* Allocate an ID between 0 and @max, inclusive.
|
||||
*
|
||||
* Context: Any context.
|
||||
* Return: The allocated ID, or %-ENOMEM if memory could not be allocated,
|
||||
* or %-ENOSPC if there are no free IDs.
|
||||
*/
|
||||
static inline int ida_alloc_max(struct ida *ida, unsigned int max, gfp_t gfp)
|
||||
{
|
||||
return ida_alloc_range(ida, 0, max, gfp);
|
||||
}
|
||||
|
||||
static inline void ida_init(struct ida *ida)
|
||||
{
|
||||
INIT_RADIX_TREE(&ida->ida_rt, IDR_RT_MARKER | GFP_NOWAIT);
|
||||
}
|
||||
|
||||
/**
|
||||
* ida_get_new - allocate new ID
|
||||
* @ida: idr handle
|
||||
* @p_id: pointer to the allocated handle
|
||||
*
|
||||
* Simple wrapper around ida_get_new_above() w/ @starting_id of zero.
|
||||
*/
|
||||
static inline int ida_get_new(struct ida *ida, int *p_id)
|
||||
{
|
||||
return ida_get_new_above(ida, 0, p_id);
|
||||
}
|
||||
#define ida_simple_get(ida, start, end, gfp) \
|
||||
ida_alloc_range(ida, start, (end) - 1, gfp)
|
||||
#define ida_simple_remove(ida, id) ida_free(ida, id)
|
||||
|
||||
static inline bool ida_is_empty(const struct ida *ida)
|
||||
{
|
||||
return radix_tree_empty(&ida->ida_rt);
|
||||
}
|
||||
|
||||
/* in lib/radix-tree.c */
|
||||
int ida_pre_get(struct ida *ida, gfp_t gfp_mask);
|
||||
#endif /* __IDR_H__ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue