diff --git a/lib/debugobjects.c b/lib/debugobjects.c index 9d8161f..ac46405 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c @@ -116,9 +116,10 @@ static struct debug_obj *lookup_object(void *addr, struct debug_bucket *b) static struct debug_obj * alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) { + unsigned long flags; struct debug_obj *obj = NULL; - spin_lock(&pool_lock); + spin_lock_irqsave(&pool_lock, flags); if (obj_pool.first) { obj = hlist_entry(obj_pool.first, typeof(*obj), node); @@ -137,7 +138,7 @@ alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) if (obj_pool_free < obj_pool_min_free) obj_pool_min_free = obj_pool_free; } - spin_unlock(&pool_lock); + spin_unlock_irqrestore(&pool_lock, flags); return obj; } @@ -147,18 +148,19 @@ alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) */ static void free_object(struct debug_obj *obj) { + unsigned long flags; unsigned long idx = (unsigned long)(obj - obj_static_pool); if (obj_pool_free < ODEBUG_POOL_SIZE || idx < ODEBUG_POOL_SIZE) { - spin_lock(&pool_lock); + spin_lock_irqsave(&pool_lock, flags); hlist_add_head(&obj->node, &obj_pool); obj_pool_free++; obj_pool_used--; - spin_unlock(&pool_lock); + spin_unlock_irqrestore(&pool_lock, flags); } else { - spin_lock(&pool_lock); + spin_lock_irqsave(&pool_lock, flags); obj_pool_used--; - spin_unlock(&pool_lock); + spin_unlock_irqrestore(&pool_lock, flags); kmem_cache_free(obj_cache, obj); } }