]> git.proxmox.com Git - mirror_spl-debian.git/blob - include/sys/vmsystm.h
b8191f3aca9679f9a9b9f47a1ce9ae4834dfd80a
[mirror_spl-debian.git] / include / sys / vmsystm.h
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 * For details, see <http://github.com/behlendorf/spl/>.
10 *
11 * The SPL is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
15 *
16 * The SPL is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 * for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with the SPL. If not, see <http://www.gnu.org/licenses/>.
23 \*****************************************************************************/
24
25 #ifndef _SPL_VMSYSTM_H
26 #define _SPL_VMSYSTM_H
27
28 #include <linux/mmzone.h>
29 #include <linux/mm.h>
30 #include <linux/swap.h>
31 #include <linux/highmem.h>
32 #include <sys/types.h>
33 #include <asm/uaccess.h>
34
35 /* These values are loosely coupled with the VM page reclaim.
36 * Linux uses its own heuristics to trigger page reclamation, and
37 * because those interface are difficult to interface with. These
38 * values should only be considered as a rough guide to the system
39 * memory state and not as direct evidence that page reclamation.
40 * is or is not currently in progress.
41 */
42 #define membar_producer() smp_wmb()
43
44 #define physmem num_physpages
45 #define freemem nr_free_pages()
46 #define availrmem spl_kmem_availrmem()
47
48 extern pgcnt_t minfree; /* Sum of zone->pages_min */
49 extern pgcnt_t desfree; /* Sum of zone->pages_low */
50 extern pgcnt_t lotsfree; /* Sum of zone->pages_high */
51 extern pgcnt_t needfree; /* Always 0 unused in new Solaris */
52 extern pgcnt_t swapfs_minfree; /* Solaris default value */
53 extern pgcnt_t swapfs_reserve; /* Solaris default value */
54
55 extern vmem_t *heap_arena; /* primary kernel heap arena */
56 extern vmem_t *zio_alloc_arena; /* arena for zio caches */
57 extern vmem_t *zio_arena; /* arena for allocating zio memory */
58
59 extern pgcnt_t spl_kmem_availrmem(void);
60 extern size_t vmem_size(vmem_t *vmp, int typemask);
61
62 /*
63 * The following symbols are available for use within the kernel
64 * itself, and they used to be available in older kernels. But it
65 * looks like they have been removed perhaps due to lack of use.
66 * For our purposes we need them to access the global memory state
67 * of the system, which is even available to user space process
68 * in /proc/meminfo. It's odd to me that there is no kernel API
69 * to get the same information, minimally the proc handler for
70 * the above mentioned /proc/meminfo file would make use of it.
71 */
72
73 /* Source linux/fs/proc/mmu.c */
74 #ifndef HAVE_GET_VMALLOC_INFO
75 #ifdef CONFIG_MMU
76
77 struct vmalloc_info {
78 unsigned long used;
79 unsigned long largest_chunk;
80 };
81
82 typedef void (*get_vmalloc_info_t)(struct vmalloc_info *);
83 extern get_vmalloc_info_t get_vmalloc_info_fn;
84
85 # define VMEM_ALLOC 0x01
86 # define VMEM_FREE 0x02
87 # define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
88 # define get_vmalloc_info(vmi) get_vmalloc_info_fn(vmi)
89 #else
90 # error "CONFIG_MMU must be defined"
91 #endif /* CONFIG_MMU */
92 #endif /* HAVE_GET_VMALLOC_INFO */
93
94 #ifdef HAVE_PGDAT_HELPERS
95 /* Source linux/mm/mmzone.c */
96 # ifndef HAVE_FIRST_ONLINE_PGDAT
97 typedef struct pglist_data *(*first_online_pgdat_t)(void);
98 extern first_online_pgdat_t first_online_pgdat_fn;
99 # define first_online_pgdat() first_online_pgdat_fn()
100 # endif /* HAVE_FIRST_ONLINE_PGDAT */
101
102 # ifndef HAVE_NEXT_ONLINE_PGDAT
103 typedef struct pglist_data *(*next_online_pgdat_t)(struct pglist_data *);
104 extern next_online_pgdat_t next_online_pgdat_fn;
105 # define next_online_pgdat(pgd) next_online_pgdat_fn(pgd)
106 # endif /* HAVE_NEXT_ONLINE_PGDAT */
107
108 # ifndef HAVE_NEXT_ZONE
109 typedef struct zone *(*next_zone_t)(struct zone *);
110 extern next_zone_t next_zone_fn;
111 # define next_zone(zone) next_zone_fn(zone)
112 # endif /* HAVE_NEXT_ZONE */
113
114 #else /* HAVE_PGDAT_HELPERS */
115
116 # ifndef HAVE_PGDAT_LIST
117 extern struct pglist_data *pgdat_list_addr;
118 # define pgdat_list pgdat_list_addr
119 # endif /* HAVE_PGDAT_LIST */
120
121 #endif /* HAVE_PGDAT_HELPERS */
122
123 /* Source linux/mm/vmstat.c */
124 #if defined(NEED_GET_ZONE_COUNTS) && !defined(HAVE_GET_ZONE_COUNTS)
125 typedef void (*get_zone_counts_t)(unsigned long *, unsigned long *,
126 unsigned long *);
127 extern get_zone_counts_t get_zone_counts_fn;
128 # define get_zone_counts(a,i,f) get_zone_counts_fn(a,i,f)
129 #endif /* NEED_GET_ZONE_COUNTS && !HAVE_GET_ZONE_COUNTS */
130
131 typedef enum spl_zone_stat_item {
132 SPL_NR_FREE_PAGES,
133 SPL_NR_INACTIVE,
134 SPL_NR_ACTIVE,
135 SPL_NR_ZONE_STAT_ITEMS
136 } spl_zone_stat_item_t;
137
138 extern unsigned long spl_global_page_state(spl_zone_stat_item_t);
139
140 #define xcopyin(from, to, size) copy_from_user(to, from, size)
141 #define xcopyout(from, to, size) copy_to_user(to, from, size)
142
143 static __inline__ int
144 copyin(const void *from, void *to, size_t len)
145 {
146 /* On error copyin routine returns -1 */
147 if (xcopyin(from, to, len))
148 return -1;
149
150 return 0;
151 }
152
153 static __inline__ int
154 copyout(const void *from, void *to, size_t len)
155 {
156 /* On error copyout routine returns -1 */
157 if (xcopyout(from, to, len))
158 return -1;
159
160 return 0;
161 }
162
163 static __inline__ int
164 copyinstr(const void *from, void *to, size_t len, size_t *done)
165 {
166 size_t rc;
167
168 if (len == 0)
169 return -ENAMETOOLONG;
170
171 /* XXX: Should return ENAMETOOLONG if 'strlen(from) > len' */
172
173 memset(to, 0, len);
174 rc = copyin(from, to, len - 1);
175 if (done != NULL)
176 *done = rc;
177
178 return 0;
179 }
180
181 #endif /* SPL_VMSYSTM_H */