shrinker
TAILQ_HEAD(, shrinker) shrinkers = TAILQ_HEAD_INITIALIZER(shrinkers);
struct shrinker *
struct shrinker *s;
shrinker_register(struct shrinker *shrinker)
TAILQ_INSERT_TAIL(&shrinkers, shrinker, next);
shrinker_free(struct shrinker *shrinker)
TAILQ_REMOVE(&shrinkers, shrinker, next);
kfree(shrinker);
struct shrinker *shrinker;
shrinker = TAILQ_FIRST(&shrinkers);
while (shrinker && npages > 0) {
ret = shrinker->scan_objects(shrinker, &sc);
shrinker = TAILQ_NEXT(shrinker, next);
i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
struct drm_i915_private *i915 = shrinker->private_data;
i915->mm.shrinker->batch =
max((i915->mm.shrinker->batch + avg) >> 1,
i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
struct drm_i915_private *i915 = shrinker->private_data;
i915->mm.shrinker = shrinker_alloc(0, "drm-i915_gem");
if (!i915->mm.shrinker) {
i915->mm.shrinker->scan_objects = i915_gem_shrinker_scan;
i915->mm.shrinker->count_objects = i915_gem_shrinker_count;
i915->mm.shrinker->batch = 4096;
i915->mm.shrinker->private_data = i915;
shrinker_register(i915->mm.shrinker);
shrinker_free(i915->mm.shrinker);
struct shrinker *shrinker;
u_long (*count_objects)(struct shrinker *, struct shrink_control *);
u_long (*scan_objects)(struct shrinker *, struct shrink_control *);
TAILQ_ENTRY(shrinker) next;
struct shrinker *shrinker_alloc(u_int, const char *, ...);
void shrinker_free(struct shrinker *);
void shrinker_register(struct shrinker *);
static unsigned long ttm_pool_shrinker_scan(struct shrinker *shrink,
static unsigned long ttm_pool_shrinker_count(struct shrinker *shrink,
static struct shrinker *mm_shrinker;