> + page->in_use = 0; > + page->offset = 0; This move makes total sense to me. > return NULL; > > spin_lock_irqsave(&pool->lock, flags); > - > - list_add(&page->page_list, &pool->page_list); > + pool_initialise_page(pool, page); .. but this now moves all of pool_initialise_page inside the pool->lock critical section. Is that really a good idea?