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 * 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 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