[PATCH 03/10] This patch introduces the ridr_pre_get() routine. Signed-off-by: Nadia Derbey --- include/linux/ridr.h | 1 + lib/ridr.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) Index: linux-2.6.25-mm1/include/linux/ridr.h =================================================================== --- linux-2.6.25-mm1.orig/include/linux/ridr.h 2008-04-29 13:08:00.000000000 +0200 +++ linux-2.6.25-mm1/include/linux/ridr.h 2008-04-29 13:14:56.000000000 +0200 @@ -43,6 +43,7 @@ struct ridr { /* * This is what we export. */ +int ridr_pre_get(struct ridr *, gfp_t); void __init ridr_init_cache(void); Index: linux-2.6.25-mm1/lib/ridr.c =================================================================== --- linux-2.6.25-mm1.orig/lib/ridr.c 2008-04-29 13:08:05.000000000 +0200 +++ linux-2.6.25-mm1/lib/ridr.c 2008-04-29 13:17:59.000000000 +0200 @@ -11,6 +11,52 @@ static struct kmem_cache *ridr_layer_cache; +/* only called when idp->lock is held */ +/* moves an ridr_layer to the free list */ +static void __move_to_free_list(struct ridr *idp, struct ridr_layer *p) +{ + p->idr.ary[0] = idp->id_free; + idp->id_free = p; + idp->id_free_cnt++; +} + +static void move_to_free_list(struct ridr *idp, struct ridr_layer *p) +{ + unsigned long flags; + + /* + * Depends on the return element being zeroed. + */ + spin_lock_irqsave(&idp->lock, flags); + __move_to_free_list(idp, p); + spin_unlock_irqrestore(&idp->lock, flags); +} + +/** + * ridr_pre_get - reserver resources for ridr allocation + * @idp: ridr handle + * @gfp_mask: memory allocation flags + * + * This function should be called prior to locking and calling the + * ridr_get_new* functions. It preallocates enough memory to satisfy + * the worst possible allocation. + * + * If the system is REALLY out of memory this function returns 0, + * otherwise 1. + */ +int ridr_pre_get(struct ridr *idp, gfp_t gfp_mask) +{ + while (idp->id_free_cnt < IDR_FREE_MAX) { + struct ridr_layer *new; + new = kmem_cache_alloc(ridr_layer_cache, gfp_mask); + if (new == NULL) + return (0); + move_to_free_list(idp, new); + } + return 1; +} +EXPORT_SYMBOL(ridr_pre_get); + static void ridr_cache_ctor(struct kmem_cache *ridr_layer_cache, void *ridr_layer) { -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/