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>.
8 * This file is part of the SPL, Solaris Porting Layer.
9 * For details, see <http://zfsonlinux.org/>.
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.
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
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 \*****************************************************************************/
25 #ifndef _SPL_VMSYSTM_H
26 #define _SPL_VMSYSTM_H
28 #include <linux/mmzone.h>
30 #include <linux/swap.h>
31 #include <linux/highmem.h>
32 #include <sys/types.h>
33 #include <asm/uaccess.h>
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.
42 #define membar_producer() smp_wmb()
44 #define physmem num_physpages
45 #define freemem nr_free_pages()
46 #define availrmem spl_kmem_availrmem()
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 */
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 */
59 extern pgcnt_t
spl_kmem_availrmem(void);
60 extern size_t vmem_size(vmem_t
*vmp
, int typemask
);
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.
73 /* Source linux/fs/proc/mmu.c */
74 #ifndef HAVE_GET_VMALLOC_INFO
79 unsigned long largest_chunk
;
82 typedef void (*get_vmalloc_info_t
)(struct vmalloc_info
*);
83 extern get_vmalloc_info_t get_vmalloc_info_fn
;
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)
90 # error "CONFIG_MMU must be defined"
91 #endif /* CONFIG_MMU */
92 #endif /* HAVE_GET_VMALLOC_INFO */
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 */
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 */
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 */
114 #else /* HAVE_PGDAT_HELPERS */
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 */
121 #endif /* HAVE_PGDAT_HELPERS */
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 *,
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 */
131 typedef enum spl_zone_stat_item
{
135 SPL_NR_ZONE_STAT_ITEMS
136 } spl_zone_stat_item_t
;
138 extern unsigned long spl_global_page_state(spl_zone_stat_item_t
);
140 #define xcopyin(from, to, size) copy_from_user(to, from, size)
141 #define xcopyout(from, to, size) copy_to_user(to, from, size)
143 static __inline__
int
144 copyin(const void *from
, void *to
, size_t len
)
146 /* On error copyin routine returns -1 */
147 if (xcopyin(from
, to
, len
))
153 static __inline__
int
154 copyout(const void *from
, void *to
, size_t len
)
156 /* On error copyout routine returns -1 */
157 if (xcopyout(from
, to
, len
))
163 static __inline__
int
164 copyinstr(const void *from
, void *to
, size_t len
, size_t *done
)
169 return -ENAMETOOLONG
;
171 /* XXX: Should return ENAMETOOLONG if 'strlen(from) > len' */
174 rc
= copyin(from
, to
, len
- 1);
181 #endif /* SPL_VMSYSTM_H */