]>
Commit | Line | Data |
---|---|---|
715f6251 | 1 | /* |
2 | * This file is part of the SPL: Solaris Porting Layer. | |
3 | * | |
4 | * Copyright (c) 2008 Lawrence Livermore National Security, LLC. | |
5 | * Produced at Lawrence Livermore National Laboratory | |
6 | * Written by: | |
7 | * Brian Behlendorf <behlendorf1@llnl.gov>, | |
8 | * Herb Wartens <wartens2@llnl.gov>, | |
9 | * Jim Garlick <garlick@llnl.gov> | |
10 | * UCRL-CODE-235197 | |
11 | * | |
12 | * This is free software; you can redistribute it and/or modify it | |
13 | * under the terms of the GNU General Public License as published by | |
14 | * the Free Software Foundation; either version 2 of the License, or | |
15 | * (at your option) any later version. | |
16 | * | |
17 | * This is distributed in the hope that it will be useful, but WITHOUT | |
18 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
19 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
20 | * for more details. | |
21 | * | |
22 | * You should have received a copy of the GNU General Public License along | |
23 | * with this program; if not, write to the Free Software Foundation, Inc., | |
24 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
25 | */ | |
26 | ||
a713518f | 27 | #ifndef _SPL_VMSYSTM_H |
28 | #define _SPL_VMSYSTM_H | |
29 | ||
36b313da | 30 | #include <linux/mmzone.h> |
a713518f | 31 | #include <linux/mm.h> |
6ab69573 | 32 | #include <linux/swap.h> |
af828292 | 33 | #include <sys/types.h> |
2bdb28fb | 34 | #include <asm/uaccess.h> |
af828292 | 35 | |
36b313da BB |
36 | /* These values are loosely coupled with the the VM page reclaim. |
37 | * Linux uses its own heuristics to trigger page reclamation, and | |
38 | * because those interface are difficult to interface with. These | |
39 | * values should only be considered as a rough guide to the system | |
40 | * memory state and not as direct evidence that page reclaimation | |
41 | * is or is not currently in progress. | |
42 | */ | |
43 | #define ptob(pages) (pages * PAGE_SIZE) | |
44 | #define membar_producer() smp_wmb() | |
a713518f | 45 | |
46 | #define physmem num_physpages | |
ea3e6ca9 | 47 | #define freemem nr_free_pages() |
4ab13d3b | 48 | #define availrmem spl_kmem_availrmem() |
36b313da BB |
49 | |
50 | extern pgcnt_t minfree; /* Sum of zone->pages_min */ | |
51 | extern pgcnt_t desfree; /* Sum of zone->pages_low */ | |
52 | extern pgcnt_t lotsfree; /* Sum of zone->pages_high */ | |
4ab13d3b BB |
53 | extern pgcnt_t needfree; /* Always 0 unused in new Solaris */ |
54 | extern pgcnt_t swapfs_minfree; /* Solaris default value */ | |
55 | extern pgcnt_t swapfs_reserve; /* Solaris default value */ | |
36b313da BB |
56 | |
57 | extern vmem_t *heap_arena; /* primary kernel heap arena */ | |
58 | extern vmem_t *zio_alloc_arena; /* arena for zio caches */ | |
59 | extern vmem_t *zio_arena; /* arena for allocating zio memory */ | |
60 | ||
4ab13d3b BB |
61 | extern pgcnt_t spl_kmem_availrmem(void); |
62 | extern size_t vmem_size(vmem_t *vmp, int typemask); | |
77b1fe8f | 63 | |
d1ff2312 BB |
64 | /* |
65 | * The following symbols are available for use within the kernel | |
66 | * itself, and they used to be available in older kernels. But it | |
67 | * looks like they have been removed perhaps due to lack of use. | |
68 | * For our purposes we need them to access the global memory state | |
69 | * of the system, which is even available to user space process | |
70 | * in /proc/meminfo. It's odd to me that there is no kernel API | |
71 | * to get the same information, minimally the proc handler for | |
72 | * the above mentioned /proc/meminfo file would make use of it. | |
73 | */ | |
74 | ||
75 | /* Source linux/fs/proc/mmu.c */ | |
76 | #ifndef HAVE_GET_VMALLOC_INFO | |
77 | #ifdef CONFIG_MMU | |
78 | ||
79 | struct vmalloc_info { | |
80 | unsigned long used; | |
81 | unsigned long largest_chunk; | |
82 | }; | |
83 | ||
84 | typedef void (*get_vmalloc_info_t)(struct vmalloc_info *); | |
85 | extern get_vmalloc_info_t get_vmalloc_info_fn; | |
86 | ||
87 | # define VMEM_ALLOC 0x01 | |
88 | # define VMEM_FREE 0x02 | |
89 | # define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) | |
90 | # define get_vmalloc_info(vmi) get_vmalloc_info_fn(vmi) | |
91 | #else | |
92 | # error "CONFIG_MMU must be defined" | |
93 | #endif /* CONFIG_MMU */ | |
94 | #endif /* HAVE_GET_VMALLOC_INFO */ | |
95 | ||
96 | /* Source linux/mm/mmzone.c */ | |
97 | #ifndef HAVE_FIRST_ONLINE_PGDAT | |
98 | typedef struct pglist_data *(*first_online_pgdat_t)(void); | |
99 | extern first_online_pgdat_t first_online_pgdat_fn; | |
100 | #define first_online_pgdat() first_online_pgdat_fn() | |
101 | #endif /* HAVE_FIRST_ONLINE_PGDAT */ | |
102 | ||
103 | /* Source linux/mm/mmzone.c */ | |
104 | #ifndef HAVE_NEXT_ONLINE_PGDAT | |
105 | typedef struct pglist_data *(*next_online_pgdat_t)(struct pglist_data *); | |
106 | extern next_online_pgdat_t next_online_pgdat_fn; | |
107 | #define next_online_pgdat(pgd) next_online_pgdat_fn(pgd) | |
108 | #endif /* HAVE_NEXT_ONLINE_PGDAT */ | |
109 | ||
110 | /* Source linux/mm/mmzone.c */ | |
111 | #ifndef HAVE_NEXT_ZONE | |
112 | typedef struct zone *(*next_zone_t)(struct zone *); | |
113 | extern next_zone_t next_zone_fn; | |
114 | #define next_zone(zone) next_zone_fn(zone) | |
115 | #endif /* HAVE_NEXT_ZONE */ | |
116 | ||
117 | /* Source linux/mm/vmstat.c */ | |
118 | #ifndef HAVE_GET_ZONE_COUNTS | |
119 | typedef void (*get_zone_counts_t)(unsigned long *, unsigned long *, | |
120 | unsigned long *); | |
121 | extern get_zone_counts_t get_zone_counts_fn; | |
122 | #define get_zone_counts(a,i,f) get_zone_counts_fn(a,i,f) | |
123 | #endif /* HAVE_GET_ZONE_COUNTS */ | |
124 | ||
125 | ||
2bdb28fb | 126 | #define xcopyin(from, to, size) copy_from_user(to, from, size) |
127 | #define xcopyout(from, to, size) copy_to_user(to, from, size) | |
128 | ||
129 | static __inline__ int | |
130 | copyin(const void *from, void *to, size_t len) | |
131 | { | |
132 | /* On error copyin routine returns -1 */ | |
133 | if (xcopyin(from, to, len)) | |
134 | return -1; | |
135 | ||
136 | return 0; | |
137 | } | |
138 | ||
139 | static __inline__ int | |
140 | copyout(const void *from, void *to, size_t len) | |
141 | { | |
142 | /* On error copyout routine returns -1 */ | |
143 | if (xcopyout(from, to, len)) | |
144 | return -1; | |
145 | ||
146 | return 0; | |
147 | } | |
148 | ||
149 | static __inline__ int | |
150 | copyinstr(const void *from, void *to, size_t len, size_t *done) | |
151 | { | |
0998fdd6 | 152 | size_t rc; |
153 | ||
2bdb28fb | 154 | if (len == 0) |
155 | return -ENAMETOOLONG; | |
156 | ||
2bdb28fb | 157 | /* XXX: Should return ENAMETOOLONG if 'strlen(from) > len' */ |
158 | ||
159 | memset(to, 0, len); | |
0998fdd6 | 160 | rc = copyin(from, to, len - 1); |
161 | if (done != NULL) | |
162 | *done = rc; | |
2bdb28fb | 163 | |
164 | return 0; | |
165 | } | |
2f5d55aa | 166 | |
a713518f | 167 | #endif /* SPL_VMSYSTM_H */ |