Lines Matching refs:shrinker
352 static int prealloc_memcg_shrinker(struct shrinker *shrinker) in prealloc_memcg_shrinker() argument
361 id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL); in prealloc_memcg_shrinker()
371 shrinker->id = id; in prealloc_memcg_shrinker()
378 static void unregister_memcg_shrinker(struct shrinker *shrinker) in unregister_memcg_shrinker() argument
380 int id = shrinker->id; in unregister_memcg_shrinker()
389 static long xchg_nr_deferred_memcg(int nid, struct shrinker *shrinker, in xchg_nr_deferred_memcg() argument
395 return atomic_long_xchg(&info->nr_deferred[shrinker->id], 0); in xchg_nr_deferred_memcg()
398 static long add_nr_deferred_memcg(long nr, int nid, struct shrinker *shrinker, in add_nr_deferred_memcg() argument
404 return atomic_long_add_return(nr, &info->nr_deferred[shrinker->id]); in add_nr_deferred_memcg()
460 static int prealloc_memcg_shrinker(struct shrinker *shrinker) in prealloc_memcg_shrinker() argument
465 static void unregister_memcg_shrinker(struct shrinker *shrinker) in unregister_memcg_shrinker() argument
469 static long xchg_nr_deferred_memcg(int nid, struct shrinker *shrinker, in xchg_nr_deferred_memcg() argument
475 static long add_nr_deferred_memcg(long nr, int nid, struct shrinker *shrinker, in add_nr_deferred_memcg() argument
492 static long xchg_nr_deferred(struct shrinker *shrinker, in xchg_nr_deferred() argument
497 if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) in xchg_nr_deferred()
501 (shrinker->flags & SHRINKER_MEMCG_AWARE)) in xchg_nr_deferred()
502 return xchg_nr_deferred_memcg(nid, shrinker, in xchg_nr_deferred()
505 return atomic_long_xchg(&shrinker->nr_deferred[nid], 0); in xchg_nr_deferred()
509 static long add_nr_deferred(long nr, struct shrinker *shrinker, in add_nr_deferred() argument
514 if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) in add_nr_deferred()
518 (shrinker->flags & SHRINKER_MEMCG_AWARE)) in add_nr_deferred()
519 return add_nr_deferred_memcg(nr, nid, shrinker, in add_nr_deferred()
522 return atomic_long_add_return(nr, &shrinker->nr_deferred[nid]); in add_nr_deferred()
614 int prealloc_shrinker(struct shrinker *shrinker) in prealloc_shrinker() argument
619 if (shrinker->flags & SHRINKER_MEMCG_AWARE) { in prealloc_shrinker()
620 err = prealloc_memcg_shrinker(shrinker); in prealloc_shrinker()
624 shrinker->flags &= ~SHRINKER_MEMCG_AWARE; in prealloc_shrinker()
627 size = sizeof(*shrinker->nr_deferred); in prealloc_shrinker()
628 if (shrinker->flags & SHRINKER_NUMA_AWARE) in prealloc_shrinker()
631 shrinker->nr_deferred = kzalloc(size, GFP_KERNEL); in prealloc_shrinker()
632 if (!shrinker->nr_deferred) in prealloc_shrinker()
638 void free_prealloced_shrinker(struct shrinker *shrinker) in free_prealloced_shrinker() argument
640 if (shrinker->flags & SHRINKER_MEMCG_AWARE) { in free_prealloced_shrinker()
642 unregister_memcg_shrinker(shrinker); in free_prealloced_shrinker()
647 kfree(shrinker->nr_deferred); in free_prealloced_shrinker()
648 shrinker->nr_deferred = NULL; in free_prealloced_shrinker()
651 void register_shrinker_prepared(struct shrinker *shrinker) in register_shrinker_prepared() argument
654 list_add_tail(&shrinker->list, &shrinker_list); in register_shrinker_prepared()
655 shrinker->flags |= SHRINKER_REGISTERED; in register_shrinker_prepared()
659 int register_shrinker(struct shrinker *shrinker) in register_shrinker() argument
661 int err = prealloc_shrinker(shrinker); in register_shrinker()
665 register_shrinker_prepared(shrinker); in register_shrinker()
673 void unregister_shrinker(struct shrinker *shrinker) in unregister_shrinker() argument
675 if (!(shrinker->flags & SHRINKER_REGISTERED)) in unregister_shrinker()
679 list_del(&shrinker->list); in unregister_shrinker()
680 shrinker->flags &= ~SHRINKER_REGISTERED; in unregister_shrinker()
681 if (shrinker->flags & SHRINKER_MEMCG_AWARE) in unregister_shrinker()
682 unregister_memcg_shrinker(shrinker); in unregister_shrinker()
685 kfree(shrinker->nr_deferred); in unregister_shrinker()
686 shrinker->nr_deferred = NULL; in unregister_shrinker()
708 struct shrinker *shrinker, int priority) in do_shrink_slab() argument
716 long batch_size = shrinker->batch ? shrinker->batch in do_shrink_slab()
720 freeable = shrinker->count_objects(shrinker, shrinkctl); in do_shrink_slab()
729 nr = xchg_nr_deferred(shrinker, shrinkctl); in do_shrink_slab()
731 if (shrinker->seeks) { in do_shrink_slab()
734 do_div(delta, shrinker->seeks); in do_shrink_slab()
748 trace_mm_shrink_slab_start(shrinker, shrinkctl, nr, in do_shrink_slab()
773 ret = shrinker->scan_objects(shrinker, shrinkctl); in do_shrink_slab()
798 new_nr = add_nr_deferred(next_deferred, shrinker, shrinkctl); in do_shrink_slab()
800 trace_mm_shrink_slab_end(shrinker, shrinkctl->nid, freed, nr, new_nr, total_scan); in do_shrink_slab()
828 struct shrinker *shrinker; in shrink_slab_memcg() local
830 shrinker = idr_find(&shrinker_idr, i); in shrink_slab_memcg()
831 if (unlikely(!shrinker || !(shrinker->flags & SHRINKER_REGISTERED))) { in shrink_slab_memcg()
832 if (!shrinker) in shrink_slab_memcg()
839 !(shrinker->flags & SHRINKER_NONSLAB)) in shrink_slab_memcg()
842 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab_memcg()
861 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab_memcg()
911 struct shrinker *shrinker; in shrink_slab() local
926 list_for_each_entry(shrinker, &shrinker_list, list) { in shrink_slab()
933 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab()