]>
Commit | Line | Data |
---|---|---|
4b393c50 | 1 | /* |
716154c5 BB |
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. | |
716154c5 BB |
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/>. | |
4b393c50 | 22 | */ |
716154c5 | 23 | |
a9125891 BB |
24 | #ifndef _SPL_SHRINKER_H |
25 | #define _SPL_SHRINKER_H | |
baf2979e BB |
26 | |
27 | #include <linux/mm.h> | |
914b0631 | 28 | #include <linux/fs.h> |
baf2979e | 29 | |
a55bcaad | 30 | /* |
c3d9c0df RY |
31 | * Due to frequent changes in the shrinker API the following |
32 | * compatibility wrappers should be used. They are as follows: | |
33 | * | |
270ece24 | 34 | * SPL_SHRINKER_DECLARE(varname, countfunc, scanfunc, seek_cost); |
c3d9c0df | 35 | * |
270ece24 MA |
36 | * SPL_SHRINKER_DECLARE is used to declare a shrinker with the name varname, |
37 | * which is passed to spl_register_shrinker()/spl_unregister_shrinker(). | |
38 | * The countfunc returns the number of free-able objects. | |
39 | * The scanfunc returns the number of objects that were freed. | |
40 | * The callbacks can return SHRINK_STOP if further calls can't make any more | |
41 | * progress. Note that a return value of SHRINK_EMPTY is currently not | |
42 | * supported. | |
c3d9c0df RY |
43 | * |
44 | * Example: | |
45 | * | |
270ece24 MA |
46 | * static unsigned long |
47 | * my_count(struct shrinker *shrink, struct shrink_control *sc) | |
c3d9c0df | 48 | * { |
c3d9c0df RY |
49 | * ...calculate number of objects in the cache... |
50 | * | |
51 | * return (number of objects in the cache); | |
52 | * } | |
270ece24 MA |
53 | * |
54 | * static unsigned long | |
55 | * my_scan(struct shrinker *shrink, struct shrink_control *sc) | |
56 | * { | |
57 | * ...scan objects in the cache and reclaim them... | |
58 | * } | |
59 | * | |
60 | * SPL_SHRINKER_DECLARE(my_shrinker, my_count, my_scan, DEFAULT_SEEKS); | |
61 | * | |
62 | * void my_init_func(void) { | |
63 | * spl_register_shrinker(&my_shrinker); | |
64 | * } | |
a55bcaad | 65 | */ |
495bd532 | 66 | |
ad096763 CK |
67 | #ifdef HAVE_REGISTER_SHRINKER_VARARG |
68 | #define spl_register_shrinker(x) register_shrinker(x, "zfs-arc-shrinker") | |
69 | #else | |
c3d9c0df | 70 | #define spl_register_shrinker(x) register_shrinker(x) |
ad096763 | 71 | #endif |
c3d9c0df | 72 | #define spl_unregister_shrinker(x) unregister_shrinker(x) |
495bd532 | 73 | |
a55bcaad | 74 | /* |
c3d9c0df | 75 | * Linux 3.0 to 3.11 Shrinker API Compatibility. |
a55bcaad | 76 | */ |
066e8252 | 77 | #if defined(HAVE_SINGLE_SHRINKER_CALLBACK) |
270ece24 | 78 | #define SPL_SHRINKER_DECLARE(varname, countfunc, scanfunc, seek_cost) \ |
c3d9c0df | 79 | static int \ |
270ece24 | 80 | __ ## varname ## _wrapper(struct shrinker *shrink, struct shrink_control *sc)\ |
c3d9c0df | 81 | { \ |
270ece24 MA |
82 | if (sc->nr_to_scan != 0) { \ |
83 | (void) scanfunc(shrink, sc); \ | |
84 | } \ | |
85 | return (countfunc(shrink, sc)); \ | |
86 | } \ | |
87 | \ | |
88 | static struct shrinker varname = { \ | |
89 | .shrink = __ ## varname ## _wrapper, \ | |
3442c2a0 | 90 | .seeks = seek_cost, \ |
a55bcaad BB |
91 | } |
92 | ||
270ece24 MA |
93 | #define SHRINK_STOP (-1) |
94 | ||
a55bcaad | 95 | /* |
c3d9c0df | 96 | * Linux 3.12 and later Shrinker API Compatibility. |
a55bcaad | 97 | */ |
c3d9c0df | 98 | #elif defined(HAVE_SPLIT_SHRINKER_CALLBACK) |
270ece24 MA |
99 | #define SPL_SHRINKER_DECLARE(varname, countfunc, scanfunc, seek_cost) \ |
100 | static struct shrinker varname = { \ | |
101 | .count_objects = countfunc, \ | |
102 | .scan_objects = scanfunc, \ | |
3442c2a0 | 103 | .seeks = seek_cost, \ |
a55bcaad BB |
104 | } |
105 | ||
c3d9c0df RY |
106 | #else |
107 | /* | |
108 | * Linux 2.x to 2.6.22, or a newer shrinker API has been introduced. | |
109 | */ | |
110 | #error "Unknown shrinker callback" | |
111 | #endif | |
495bd532 | 112 | |
a9125891 | 113 | #endif /* SPL_SHRINKER_H */ |