Lines Matching defs:pool

113 static void dmemcg_pool_get(struct dmem_cgroup_pool_state *pool)
115 refcount_inc(&pool->ref);
118 static bool dmemcg_pool_tryget(struct dmem_cgroup_pool_state *pool)
120 return refcount_inc_not_zero(&pool->ref);
123 static void dmemcg_pool_put(struct dmem_cgroup_pool_state *pool)
125 if (!refcount_dec_and_test(&pool->ref))
128 call_rcu(&pool->rcu, dmemcg_pool_free_rcu);
133 struct dmem_cgroup_pool_state *pool = container_of(rcu, typeof(*pool), rcu);
135 if (pool->parent)
136 dmemcg_pool_put(pool->parent);
137 kref_put(&pool->region->ref, dmemcg_free_region);
138 kfree(pool);
141 static void free_cg_pool(struct dmem_cgroup_pool_state *pool)
143 list_del(&pool->region_node);
144 dmemcg_pool_put(pool);
148 set_resource_min(struct dmem_cgroup_pool_state *pool, u64 val)
150 page_counter_set_min(&pool->cnt, val);
154 set_resource_low(struct dmem_cgroup_pool_state *pool, u64 val)
156 page_counter_set_low(&pool->cnt, val);
160 set_resource_max(struct dmem_cgroup_pool_state *pool, u64 val)
162 page_counter_set_max(&pool->cnt, val);
165 static u64 get_resource_low(struct dmem_cgroup_pool_state *pool)
167 return pool ? READ_ONCE(pool->cnt.low) : 0;
170 static u64 get_resource_min(struct dmem_cgroup_pool_state *pool)
172 return pool ? READ_ONCE(pool->cnt.min) : 0;
175 static u64 get_resource_max(struct dmem_cgroup_pool_state *pool)
177 return pool ? READ_ONCE(pool->cnt.max) : PAGE_COUNTER_MAX;
180 static u64 get_resource_current(struct dmem_cgroup_pool_state *pool)
182 return pool ? page_counter_read(&pool->cnt) : 0;
195 struct dmem_cgroup_pool_state *pool;
198 list_for_each_entry_rcu(pool, &dmemcs->pools, css_node)
199 reset_all_resource_limits(pool);
206 struct dmem_cgroup_pool_state *pool, *next;
209 list_for_each_entry_safe(pool, next, &dmemcs->pools, css_node) {
211 *The pool is dead and all references are 0,
214 list_del(&pool->css_node);
215 free_cg_pool(pool);
236 struct dmem_cgroup_pool_state *pool;
238 list_for_each_entry_rcu(pool, &dmemcs->pools, css_node, spin_is_locked(&dmemcg_lock))
239 if (pool->region == region)
240 return pool;
245 static struct dmem_cgroup_pool_state *pool_parent(struct dmem_cgroup_pool_state *pool)
247 if (!pool->cnt.parent)
250 return container_of(pool->cnt.parent, typeof(*pool), cnt);
260 struct dmem_cgroup_pool_state *pool, *found_pool;
270 list_for_each_entry_rcu(pool, &dmemcg_iter->pools, css_node) {
271 if (pool->region == limit_pool->region) {
272 found_pool = pool;
290 * @limit_pool: The pool for which we hit limits
291 * @test_pool: The pool for which to test
306 struct dmem_cgroup_pool_state *pool = test_pool;
310 /* Can always evict from current pool, despite limits */
318 for (pool = test_pool; pool && limit_pool != pool; pool = pool_parent(pool))
321 if (!pool)
359 struct dmem_cgroup_pool_state *pool, *ppool = NULL;
362 pool = kzalloc_obj(*pool, GFP_NOWAIT);
363 if (!pool)
366 pool = *allocpool;
370 pool->region = region;
371 pool->cs = dmemcs;
376 page_counter_init(&pool->cnt,
378 reset_all_resource_limits(pool);
379 refcount_set(&pool->ref, 1);
381 if (ppool && !pool->parent) {
382 pool->parent = ppool;
386 list_add_tail_rcu(&pool->css_node, &dmemcs->pools);
387 list_add_tail(&pool->region_node, &region->pools);
390 pool->inited = true;
392 pool->inited = ppool ? ppool->inited : false;
393 return pool;
400 struct dmem_cgroup_pool_state *pool, *ppool, *retpool;
404 * Recursively create pool, we may not initialize yet on
408 pool = find_cg_pool_locked(p, region);
409 if (!pool)
410 pool = alloc_pool_single(p, region, allocpool);
412 if (IS_ERR(pool))
413 return pool;
415 if (p == dmemcs && pool->inited)
416 return pool;
418 if (pool->inited)
422 retpool = pool = find_cg_pool_locked(dmemcs, region);
424 if (pool->inited)
431 pool->cnt.parent = &ppool->cnt;
432 if (ppool && !pool->parent) {
433 pool->parent = ppool;
436 pool->inited = true;
438 pool = ppool;
447 struct dmem_cgroup_pool_state *pool, *next;
449 list_for_each_entry_safe(pool, next, &region->pools, region_node)
450 free_cg_pool(pool);
470 struct dmem_cgroup_pool_state *pool, *next;
480 list_for_each_entry_safe(pool, next, &region->pools, region_node) {
481 list_del_rcu(&pool->css_node);
482 list_del(&pool->region_node);
483 dmemcg_pool_put(pool);
557 * @pool: &dmem_cgroup_pool_state
559 * Called to drop a reference to the limiting pool returned by
562 void dmem_cgroup_pool_state_put(struct dmem_cgroup_pool_state *pool)
564 if (pool) {
565 css_put(&pool->cs->css);
566 dmemcg_pool_put(pool);
574 struct dmem_cgroup_pool_state *pool, *allocpool = NULL;
578 pool = find_cg_pool_locked(cg, region);
579 if (pool && !READ_ONCE(pool->inited))
580 pool = NULL;
581 if (pool && !dmemcg_pool_tryget(pool))
582 pool = NULL;
585 while (!pool) {
588 pool = get_cg_pool_locked(cg, region, &allocpool);
590 pool = ERR_PTR(-ENODEV);
591 if (!IS_ERR(pool))
592 dmemcg_pool_get(pool);
595 if (pool == ERR_PTR(-ENOMEM)) {
596 pool = NULL;
602 pool = NULL;
609 return pool;
613 * dmem_cgroup_uncharge() - Uncharge a pool.
614 * @pool: Pool to uncharge.
618 * Must be called with the returned pool as argument,
621 void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, u64 size)
623 if (!pool)
626 page_counter_uncharge(&pool->cnt, size);
627 css_put(&pool->cs->css);
628 dmemcg_pool_put(pool);
636 * @ret_pool: On succesfull allocation, the pool that is charged.
637 * @ret_limit_pool: On a failed allocation, the limiting pool.
645 * will be set to the pool for which the limit is hit. This can be used for
656 struct dmem_cgroup_pool_state *pool;
670 pool = get_cg_pool_unlocked(cg, region);
671 if (IS_ERR(pool)) {
672 ret = PTR_ERR(pool);
676 if (!page_counter_try_charge(&pool->cnt, size, &fail)) {
682 dmemcg_pool_put(pool);
688 *ret_pool = pool;
734 struct dmem_cgroup_pool_state *pool = NULL;
768 pool = get_cg_pool_unlocked(dmemcs, region);
769 if (IS_ERR(pool)) {
770 err = PTR_ERR(pool);
775 apply(pool, new_limit);
776 dmemcg_pool_put(pool);
794 struct dmem_cgroup_pool_state *pool = find_cg_pool_locked(dmemcs, region);
799 val = fn(pool);