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