--- mempool.c Tue Mar 12 19:21:33 2002 +++ mempool.c.new Tue Mar 5 10:37:19 2002 @@ -34,6 +34,9 @@ mempool_t *pool; int i; + BUG_ON(!alloc_fn); + BUG_ON(!free_fn); + pool = kmalloc(sizeof(*pool), GFP_KERNEL); if (!pool) return NULL; @@ -97,6 +100,7 @@ void *element; unsigned long flags; struct list_head *tmp; + struct list_head tmp_pool_to_free; if (new_min_nr <= 0) BUG(); @@ -107,20 +111,21 @@ /* * Free possible excess elements. */ + INIT_LIST_HEAD(&tmp_pool_to_free); while (pool->curr_nr > pool->min_nr) { tmp = pool->elements.next; if (tmp == &pool->elements) BUG(); list_del(tmp); - element = tmp; + list_add(tmp, &tmp_pool_to_free); pool->curr_nr--; - spin_unlock_irqrestore(&pool->lock, flags); + } + spin_unlock_irqrestore(&pool->lock, flags); + list_for_each(tmp, &tmp_pool_to_free) { + element = tmp; pool->free(element, pool->pool_data); - - spin_lock_irqsave(&pool->lock, flags); } - spin_unlock_irqrestore(&pool->lock, flags); return; } delta = new_min_nr - pool->min_nr;