xref: /freebsd/sys/contrib/openzfs/module/os/linux/spl/spl-shrinker.c (revision 7a7741af18d6c8a804cc643cb7ecda9d730c6aa6)
1 /*
2  *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
3  *  Copyright (C) 2007 The Regents of the University of California.
4  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
5  *  Written by Brian Behlendorf <behlendorf1@llnl.gov>.
6  *  UCRL-CODE-235197
7  *
8  *  This file is part of the SPL, Solaris Porting Layer.
9  *
10  *  The SPL is free software; you can redistribute it and/or modify it
11  *  under the terms of the GNU General Public License as published by the
12  *  Free Software Foundation; either version 2 of the License, or (at your
13  *  option) any later version.
14  *
15  *  The SPL is distributed in the hope that it will be useful, but WITHOUT
16  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18  *  for more details.
19  *
20  *  You should have received a copy of the GNU General Public License along
21  *  with the SPL.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  *  Solaris Porting Layer (SPL) Shrinker Implementation.
24  */
25 
26 #include <sys/kmem.h>
27 #include <sys/shrinker.h>
28 
29 struct shrinker *
spl_register_shrinker(const char * name,spl_shrinker_cb countfunc,spl_shrinker_cb scanfunc,int seek_cost)30 spl_register_shrinker(const char *name, spl_shrinker_cb countfunc,
31     spl_shrinker_cb scanfunc, int seek_cost)
32 {
33 	struct shrinker *shrinker;
34 
35 	/* allocate shrinker */
36 #ifdef HAVE_SHRINKER_REGISTER
37 	/* 6.7: kernel will allocate the shrinker for us */
38 	shrinker = shrinker_alloc(0, name);
39 #else
40 	/* 4.4-6.6: we allocate the shrinker  */
41 	shrinker = kmem_zalloc(sizeof (struct shrinker), KM_SLEEP);
42 #endif
43 
44 	if (shrinker == NULL)
45 		return (NULL);
46 
47 	/* set callbacks */
48 	shrinker->count_objects = countfunc;
49 	shrinker->scan_objects = scanfunc;
50 
51 	/* set params */
52 	shrinker->seeks = seek_cost;
53 
54 	/* register with kernel */
55 #if defined(HAVE_SHRINKER_REGISTER)
56 	shrinker_register(shrinker);
57 #elif defined(HAVE_REGISTER_SHRINKER_VARARG)
58 	register_shrinker(shrinker, name);
59 #else
60 	register_shrinker(shrinker);
61 #endif
62 
63 	return (shrinker);
64 }
65 EXPORT_SYMBOL(spl_register_shrinker);
66 
67 void
spl_unregister_shrinker(struct shrinker * shrinker)68 spl_unregister_shrinker(struct shrinker *shrinker)
69 {
70 #if defined(HAVE_SHRINKER_REGISTER)
71 	shrinker_free(shrinker);
72 #else
73 	unregister_shrinker(shrinker);
74 	kmem_free(shrinker, sizeof (struct shrinker));
75 #endif
76 }
77 EXPORT_SYMBOL(spl_unregister_shrinker);
78