author | johansen |
Tue, 19 Dec 2006 23:13:06 -0800 | |
changeset 3290 | 256464cbb73c |
parent 2241 | 592fbc504a44 |
child 3351 | 853fb8df244a |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
2241 | 5 |
* Common Development and Distribution License (the "License"). |
6 |
* You may not use this file except in compliance with the License. |
|
0 | 7 |
* |
8 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
9 |
* or http://www.opensolaris.org/os/licensing. |
|
10 |
* See the License for the specific language governing permissions |
|
11 |
* and limitations under the License. |
|
12 |
* |
|
13 |
* When distributing Covered Code, include this CDDL HEADER in each |
|
14 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
15 |
* If applicable, add the following below this CDDL HEADER, with the |
|
16 |
* fields enclosed by brackets "[]" replaced with your own identifying |
|
17 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
|
18 |
* |
|
19 |
* CDDL HEADER END |
|
20 |
*/ |
|
21 |
/* |
|
2241 | 22 |
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. |
0 | 23 |
* Use is subject to license terms. |
24 |
*/ |
|
25 |
||
26 |
#ifndef _VM_SEG_KMEM_H |
|
27 |
#define _VM_SEG_KMEM_H |
|
28 |
||
29 |
#pragma ident "%Z%%M% %I% %E% SMI" |
|
30 |
||
31 |
#ifdef __cplusplus |
|
32 |
extern "C" { |
|
33 |
#endif |
|
34 |
||
35 |
#include <sys/types.h> |
|
36 |
#include <sys/vnode.h> |
|
37 |
#include <sys/vmem.h> |
|
38 |
#include <vm/as.h> |
|
39 |
#include <vm/seg.h> |
|
40 |
#include <vm/page.h> |
|
41 |
||
42 |
/* |
|
43 |
* VM - Kernel Segment Driver |
|
44 |
*/ |
|
45 |
||
46 |
#if defined(_KERNEL) |
|
47 |
||
48 |
extern char *kernelheap; /* start of primary kernel heap */ |
|
49 |
extern char *ekernelheap; /* end of primary kernel heap */ |
|
50 |
extern char *heap_lp_base; /* start of kernel large page heap arena */ |
|
51 |
extern char *heap_lp_end; /* end of kernel large page heap arena */ |
|
52 |
extern struct seg kvseg; /* primary kernel heap segment */ |
|
53 |
extern struct seg kvseg_core; /* "core" kernel heap segment */ |
|
3290 | 54 |
extern struct seg kzioseg; /* Segment for zio mappings */ |
5
3fb270f22f8d
6282875 large page kernel heap slows down mdb ::kgrep command
eg155566
parents:
0
diff
changeset
|
55 |
extern vmem_t *heap_lp_arena; /* kernel large page heap arena */ |
0 | 56 |
extern vmem_t *heap_arena; /* primary kernel heap arena */ |
57 |
extern vmem_t *hat_memload_arena; /* HAT translation arena */ |
|
58 |
extern struct seg kvseg32; /* 32-bit kernel heap segment */ |
|
59 |
extern vmem_t *heap32_arena; /* 32-bit kernel heap arena */ |
|
60 |
extern vmem_t *heaptext_arena; /* kernel text arena, from heap */ |
|
61 |
extern struct as kas; /* kernel address space */ |
|
62 |
extern struct vnode kvp; /* vnode for all segkmem pages */ |
|
3290 | 63 |
extern struct vnode zvp; /* vnode for all segkmem pages for zfs */ |
0 | 64 |
extern int segkmem_reloc; /* enable/disable segkmem relocatable pages */ |
65 |
extern vmem_t *static_arena; /* arena for caches to import static memory */ |
|
66 |
extern vmem_t *static_alloc_arena; /* arena for allocating static memory */ |
|
3290 | 67 |
extern vmem_t *zio_arena; /* arena for zio caches */ |
68 |
extern vmem_t *zio_alloc_arena; /* arena for zio caches */ |
|
0 | 69 |
|
70 |
extern int segkmem_create(struct seg *); |
|
71 |
extern page_t *segkmem_page_create(void *, size_t, int, void *); |
|
72 |
extern void *segkmem_xalloc(vmem_t *, void *, size_t, int, uint_t, |
|
73 |
page_t *(*page_create_func)(void *, size_t, int, void *), void *); |
|
74 |
extern void *segkmem_alloc(vmem_t *, size_t, int); |
|
75 |
extern void *segkmem_alloc_permanent(vmem_t *, size_t, int); |
|
76 |
extern void segkmem_free(vmem_t *, void *, size_t); |
|
77 |
||
78 |
extern void *boot_alloc(void *, size_t, uint_t); |
|
79 |
extern void boot_mapin(caddr_t addr, size_t size); |
|
80 |
extern void kernelheap_init(void *, void *, char *, void *, void *); |
|
81 |
extern void kernelheap_extend(void *, void *); |
|
82 |
extern void segkmem_gc(void); |
|
83 |
||
3290 | 84 |
extern void *segkmem_zio_alloc(vmem_t *, size_t, int); |
85 |
extern int segkmem_zio_create(struct seg *); |
|
86 |
extern void segkmem_zio_free(vmem_t *, void *, size_t); |
|
87 |
extern void segkmem_zio_init(void *, size_t); |
|
88 |
||
0 | 89 |
/* |
90 |
* Flags for segkmem_xalloc(). |
|
91 |
* |
|
92 |
* SEGKMEM_SHARELOCKED requests pages which are locked SE_SHARED to be |
|
93 |
* returned rather than unlocked which is now the default. Note that |
|
94 |
* memory returned by SEGKMEM_SHARELOCKED cannot be freed by segkmem_free(). |
|
95 |
* This is a hack for seg_dev that should be cleaned up in the future. |
|
96 |
*/ |
|
97 |
#define SEGKMEM_SHARELOCKED 0x20000 |
|
98 |
||
99 |
/* |
|
100 |
* Large page for kmem caches support |
|
101 |
*/ |
|
102 |
typedef struct segkmem_lpcb { |
|
103 |
kmutex_t lp_lock; |
|
104 |
kcondvar_t lp_cv; |
|
105 |
uint_t lp_wait; |
|
106 |
uint_t lp_uselp; |
|
107 |
ulong_t lp_throttle; |
|
108 |
||
109 |
/* stats */ |
|
110 |
uint64_t sleep_allocs_failed; |
|
111 |
uint64_t nosleep_allocs_failed; |
|
112 |
uint64_t allocs_throttled; |
|
113 |
uint64_t allocs_limited; |
|
114 |
uint64_t alloc_bytes_failed; |
|
115 |
} segkmem_lpcb_t; |
|
116 |
||
117 |
extern void *segkmem_alloc_lp(vmem_t *, size_t *, int); |
|
118 |
extern void segkmem_free_lp(vmem_t *, void *, size_t); |
|
119 |
extern int segkmem_lpsetup(); |
|
120 |
extern void segkmem_heap_lp_init(void); |
|
121 |
||
122 |
extern size_t segkmem_lpsize; |
|
123 |
extern size_t segkmem_heaplp_quantum; |
|
124 |
extern size_t segkmem_kmemlp_max; |
|
125 |
||
126 |
#define SEGKMEM_USE_LARGEPAGES (segkmem_lpsize > PAGESIZE) |
|
127 |
||
128 |
#define IS_KMEM_VA_LARGEPAGE(vaddr) \ |
|
129 |
(((vaddr) >= heap_lp_base) && ((vaddr) < heap_lp_end)) |
|
130 |
||
131 |
#endif /* _KERNEL */ |
|
132 |
||
133 |
#ifdef __cplusplus |
|
134 |
} |
|
135 |
#endif |
|
136 |
||
137 |
#endif /* _VM_SEG_KMEM_H */ |