wake_up_all(&page_pools[pool]->ppp_waitq);
}
-static int pools_should_grow(int page_needed, time64_t now,
- unsigned int pool_index)
+static int pools_should_grow(int needed, unsigned int pool_index)
{
/*
* don't grow if someone else is growing the pools right now,
return 0;
/* if total pages is not enough, we need to grow */
- if (page_pools[pool_index]->ppp_total_pages < page_needed)
+ if (page_pools[pool_index]->ppp_total_pages < needed)
return 1;
/*
wait_queue_entry_t waitlink;
unsigned long this_idle = -1;
u64 tick_ns = 0;
- time64_t now;
int p_idx, g_idx;
int i, rc = 0;
if (tick_ns == 0)
tick_ns = ktime_get_ns();
- now = ktime_get_real_seconds();
-
page_pool->ppp_st_missings++;
page_pool->ppp_pages_short += count;
- if (pools_should_grow(count, now, pool_idx)) {
+ if (pools_should_grow(count, pool_idx)) {
page_pool->ppp_growing = 1;
spin_unlock(&page_pool->ppp_lock);
*/
int sptlrpc_pool_add_user(void)
{
- int need_grow = 0;
spin_lock(&page_pools[PAGES_POOL]->ppp_lock);
- if (page_pools[PAGES_POOL]->ppp_growing == 0 &&
- page_pools[PAGES_POOL]->ppp_total_pages == 0) {
+ /* ask for 1 page - so if the pool is empty, it will grow
+ * (this might also grow an in-use pool if it's full, which is fine)
+ */
+ if (pools_should_grow(1, PAGES_POOL)) {
page_pools[PAGES_POOL]->ppp_growing = 1;
- need_grow = 1;
- }
- spin_unlock(&page_pools[PAGES_POOL]->ppp_lock);
-
+ spin_unlock(&page_pools[PAGES_POOL]->ppp_lock);
- if (need_grow) {
pool_add_pages(PTLRPC_MAX_BRW_PAGES * 2, PAGES_POOL);
spin_lock(&page_pools[PAGES_POOL]->ppp_lock);
page_pools[PAGES_POOL]->ppp_growing = 0;
pools_wakeup(PAGES_POOL);
- spin_unlock(&page_pools[PAGES_POOL]->ppp_lock);
}
+ spin_unlock(&page_pools[PAGES_POOL]->ppp_lock);
return 0;
}
EXPORT_SYMBOL(sptlrpc_pool_add_user);