Whamcloud - gitweb
LU-8648 all: remove all Sun license and URL references
[fs/lustre-release.git] / libcfs / include / libcfs / linux / linux-mem.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2014, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  *
32  * libcfs/include/libcfs/linux/linux-mem.h
33  *
34  * Basic library routines.
35  */
36
37 #ifndef __LIBCFS_LINUX_CFS_MEM_H__
38 #define __LIBCFS_LINUX_CFS_MEM_H__
39
40 #ifndef __LIBCFS_LIBCFS_H__
41 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
42 #endif
43
44 #ifndef __KERNEL__
45 #error This include is only for kernel use.
46 #endif
47
48 #include <linux/mm.h>
49 #include <linux/vmalloc.h>
50 #include <linux/pagemap.h>
51 #include <linux/slab.h>
52 #ifdef HAVE_MM_INLINE
53 # include <linux/mm_inline.h>
54 #endif
55
56 /*
57  * Shrinker
58  */
59 #ifdef HAVE_SHRINK_CONTROL
60 # define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)  \
61                        struct shrinker *shrinker, \
62                        struct shrink_control *sc
63 # define shrink_param(sc, var) ((sc)->var)
64 #else
65 struct shrink_control {
66         gfp_t gfp_mask;
67         unsigned long nr_to_scan;
68 };
69 # ifdef HAVE_SHRINKER_WANT_SHRINK_PTR
70 #  define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)  \
71                         struct shrinker *shrinker, \
72                         int nr_to_scan, gfp_t gfp_mask
73 # else
74 #  define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)  \
75                         int nr_to_scan, gfp_t gfp_mask
76 # endif
77         /* avoid conflict with spl mm_compat.h */
78 # define HAVE_SHRINK_CONTROL_STRUCT 1
79 # define shrink_param(sc, var) (var)
80 #endif
81
82 #ifdef HAVE_SHRINKER_COUNT
83 struct shrinker_var {
84         unsigned long (*count)(struct shrinker *,
85                                struct shrink_control *sc);
86         unsigned long (*scan)(struct shrinker *,
87                               struct shrink_control *sc);
88 };
89 # define DEF_SHRINKER_VAR(name, shrink, count_obj, scan_obj) \
90             struct shrinker_var name = { .count = count_obj, .scan = scan_obj }
91 #else
92 struct shrinker_var {
93         int (*shrink)(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask));
94 };
95 # define DEF_SHRINKER_VAR(name, shrinker, count, scan) \
96             struct shrinker_var name = { .shrink = shrinker }
97 # define SHRINK_STOP (~0UL)
98 #endif
99
100 static inline
101 struct shrinker *set_shrinker(int seek, struct shrinker_var *var)
102 {
103         struct shrinker *s;
104
105         s = kzalloc(sizeof(*s), GFP_KERNEL);
106         if (s == NULL)
107                 return (NULL);
108
109 #ifdef HAVE_SHRINKER_COUNT
110         s->count_objects = var->count;
111         s->scan_objects = var->scan;
112 #else
113         s->shrink = var->shrink;
114 #endif
115         s->seeks = seek;
116
117         register_shrinker(s);
118
119         return s;
120 }
121
122 static inline
123 void remove_shrinker(struct shrinker *shrinker)
124 {
125         if (shrinker == NULL)
126                 return;
127
128         unregister_shrinker(shrinker);
129         kfree(shrinker);
130 }
131
132 #endif /* __LINUX_CFS_MEM_H__ */