Lines Matching refs:shrinker

353 static int prealloc_memcg_shrinker(struct shrinker *shrinker)  in prealloc_memcg_shrinker()  argument
362 id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL); in prealloc_memcg_shrinker()
372 shrinker->id = id; in prealloc_memcg_shrinker()
379 static void unregister_memcg_shrinker(struct shrinker *shrinker) in unregister_memcg_shrinker() argument
381 int id = shrinker->id; in unregister_memcg_shrinker()
390 static long xchg_nr_deferred_memcg(int nid, struct shrinker *shrinker, in xchg_nr_deferred_memcg() argument
396 return atomic_long_xchg(&info->nr_deferred[shrinker->id], 0); in xchg_nr_deferred_memcg()
399 static long add_nr_deferred_memcg(long nr, int nid, struct shrinker *shrinker, in add_nr_deferred_memcg() argument
405 return atomic_long_add_return(nr, &info->nr_deferred[shrinker->id]); in add_nr_deferred_memcg()
471 static int prealloc_memcg_shrinker(struct shrinker *shrinker) in prealloc_memcg_shrinker() argument
476 static void unregister_memcg_shrinker(struct shrinker *shrinker) in unregister_memcg_shrinker() argument
480 static long xchg_nr_deferred_memcg(int nid, struct shrinker *shrinker, in xchg_nr_deferred_memcg() argument
486 static long add_nr_deferred_memcg(long nr, int nid, struct shrinker *shrinker, in add_nr_deferred_memcg() argument
560 static long xchg_nr_deferred(struct shrinker *shrinker, in xchg_nr_deferred() argument
565 if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) in xchg_nr_deferred()
569 (shrinker->flags & SHRINKER_MEMCG_AWARE)) in xchg_nr_deferred()
570 return xchg_nr_deferred_memcg(nid, shrinker, in xchg_nr_deferred()
573 return atomic_long_xchg(&shrinker->nr_deferred[nid], 0); in xchg_nr_deferred()
577 static long add_nr_deferred(long nr, struct shrinker *shrinker, in add_nr_deferred() argument
582 if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) in add_nr_deferred()
586 (shrinker->flags & SHRINKER_MEMCG_AWARE)) in add_nr_deferred()
587 return add_nr_deferred_memcg(nr, nid, shrinker, in add_nr_deferred()
590 return atomic_long_add_return(nr, &shrinker->nr_deferred[nid]); in add_nr_deferred()
677 static int __prealloc_shrinker(struct shrinker *shrinker) in __prealloc_shrinker() argument
682 if (shrinker->flags & SHRINKER_MEMCG_AWARE) { in __prealloc_shrinker()
683 err = prealloc_memcg_shrinker(shrinker); in __prealloc_shrinker()
687 shrinker->flags &= ~SHRINKER_MEMCG_AWARE; in __prealloc_shrinker()
690 size = sizeof(*shrinker->nr_deferred); in __prealloc_shrinker()
691 if (shrinker->flags & SHRINKER_NUMA_AWARE) in __prealloc_shrinker()
694 shrinker->nr_deferred = kzalloc(size, GFP_KERNEL); in __prealloc_shrinker()
695 if (!shrinker->nr_deferred) in __prealloc_shrinker()
702 int prealloc_shrinker(struct shrinker *shrinker, const char *fmt, ...) in prealloc_shrinker() argument
708 shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap); in prealloc_shrinker()
710 if (!shrinker->name) in prealloc_shrinker()
713 err = __prealloc_shrinker(shrinker); in prealloc_shrinker()
715 kfree_const(shrinker->name); in prealloc_shrinker()
716 shrinker->name = NULL; in prealloc_shrinker()
722 int prealloc_shrinker(struct shrinker *shrinker, const char *fmt, ...) in prealloc_shrinker() argument
724 return __prealloc_shrinker(shrinker); in prealloc_shrinker()
728 void free_prealloced_shrinker(struct shrinker *shrinker) in free_prealloced_shrinker() argument
731 kfree_const(shrinker->name); in free_prealloced_shrinker()
732 shrinker->name = NULL; in free_prealloced_shrinker()
734 if (shrinker->flags & SHRINKER_MEMCG_AWARE) { in free_prealloced_shrinker()
736 unregister_memcg_shrinker(shrinker); in free_prealloced_shrinker()
741 kfree(shrinker->nr_deferred); in free_prealloced_shrinker()
742 shrinker->nr_deferred = NULL; in free_prealloced_shrinker()
745 void register_shrinker_prepared(struct shrinker *shrinker) in register_shrinker_prepared() argument
748 list_add_tail(&shrinker->list, &shrinker_list); in register_shrinker_prepared()
749 shrinker->flags |= SHRINKER_REGISTERED; in register_shrinker_prepared()
750 shrinker_debugfs_add(shrinker); in register_shrinker_prepared()
754 static int __register_shrinker(struct shrinker *shrinker) in __register_shrinker() argument
756 int err = __prealloc_shrinker(shrinker); in __register_shrinker()
760 register_shrinker_prepared(shrinker); in __register_shrinker()
765 int register_shrinker(struct shrinker *shrinker, const char *fmt, ...) in register_shrinker() argument
771 shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap); in register_shrinker()
773 if (!shrinker->name) in register_shrinker()
776 err = __register_shrinker(shrinker); in register_shrinker()
778 kfree_const(shrinker->name); in register_shrinker()
779 shrinker->name = NULL; in register_shrinker()
784 int register_shrinker(struct shrinker *shrinker, const char *fmt, ...) in register_shrinker() argument
786 return __register_shrinker(shrinker); in register_shrinker()
794 void unregister_shrinker(struct shrinker *shrinker) in unregister_shrinker() argument
799 if (!(shrinker->flags & SHRINKER_REGISTERED)) in unregister_shrinker()
803 list_del(&shrinker->list); in unregister_shrinker()
804 shrinker->flags &= ~SHRINKER_REGISTERED; in unregister_shrinker()
805 if (shrinker->flags & SHRINKER_MEMCG_AWARE) in unregister_shrinker()
806 unregister_memcg_shrinker(shrinker); in unregister_shrinker()
807 debugfs_entry = shrinker_debugfs_detach(shrinker, &debugfs_id); in unregister_shrinker()
812 kfree(shrinker->nr_deferred); in unregister_shrinker()
813 shrinker->nr_deferred = NULL; in unregister_shrinker()
835 struct shrinker *shrinker, int priority) in do_shrink_slab() argument
843 long batch_size = shrinker->batch ? shrinker->batch in do_shrink_slab()
847 freeable = shrinker->count_objects(shrinker, shrinkctl); in do_shrink_slab()
856 nr = xchg_nr_deferred(shrinker, shrinkctl); in do_shrink_slab()
858 if (shrinker->seeks) { in do_shrink_slab()
861 do_div(delta, shrinker->seeks); in do_shrink_slab()
875 trace_mm_shrink_slab_start(shrinker, shrinkctl, nr, in do_shrink_slab()
900 ret = shrinker->scan_objects(shrinker, shrinkctl); in do_shrink_slab()
925 new_nr = add_nr_deferred(next_deferred, shrinker, shrinkctl); in do_shrink_slab()
927 trace_mm_shrink_slab_end(shrinker, shrinkctl->nid, freed, nr, new_nr, total_scan); in do_shrink_slab()
955 struct shrinker *shrinker; in shrink_slab_memcg() local
957 shrinker = idr_find(&shrinker_idr, i); in shrink_slab_memcg()
958 if (unlikely(!shrinker || !(shrinker->flags & SHRINKER_REGISTERED))) { in shrink_slab_memcg()
959 if (!shrinker) in shrink_slab_memcg()
966 !(shrinker->flags & SHRINKER_NONSLAB)) in shrink_slab_memcg()
969 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab_memcg()
988 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab_memcg()
1038 struct shrinker *shrinker; in shrink_slab() local
1053 list_for_each_entry(shrinker, &shrinker_list, list) { in shrink_slab()
1060 ret = do_shrink_slab(&sc, shrinker, priority); in shrink_slab()