summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm/seg_kmem.h
blob: 3ad4202e91c3bea3d4f3d572ba37881a159b1a55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 * Copyright 2016 Joyent, Inc.
 */

#ifndef _VM_SEG_KMEM_H
#define	_VM_SEG_KMEM_H


#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/vnode.h>
#include <sys/vmem.h>
#include <vm/as.h>
#include <vm/seg.h>
#include <vm/page.h>

/*
 * VM - Kernel Segment Driver
 */

#if defined(_KERNEL)

extern char *kernelheap;	/* start of primary kernel heap */
extern char *ekernelheap;	/* end of primary kernel heap */
extern char *heap_lp_base;	/* start of kernel large page heap arena */
extern char *heap_lp_end;	/* end of kernel large page heap arena */
extern struct seg kvseg;	/* primary kernel heap segment */
extern struct seg kvseg_core;	/* "core" kernel heap segment */
extern struct seg kzioseg;	/* Segment for zio mappings */
extern vmem_t *heap_lp_arena;	/* kernel large page heap arena */
extern vmem_t *heap_arena;	/* primary kernel heap arena */
extern vmem_t *hat_memload_arena; /* HAT translation arena */
extern struct seg kvseg32;	/* 32-bit kernel heap segment */
extern vmem_t *heap32_arena;	/* 32-bit kernel heap arena */
extern vmem_t *heaptext_arena;	/* kernel text arena, from heap */
extern struct as kas;		/* kernel address space */
extern int segkmem_reloc;	/* enable/disable segkmem relocatable pages */
extern vmem_t *static_arena;	/* arena for caches to import static memory */
extern vmem_t *static_alloc_arena;	/* arena for allocating static memory */
extern vmem_t *zio_arena;	/* arena for zio caches */
extern vmem_t *zio_alloc_arena;	/* arena for zio caches */
extern struct vnode kvps[];
/*
 * segkmem page vnodes
 */
#define	kvp		(kvps[KV_KVP])
#define	zvp		(kvps[KV_ZVP])
#if defined(__sparc)
#define	mpvp		(kvps[KV_MPVP])
#define	promvp		(kvps[KV_PROMVP])
#endif	/* __sparc */

extern int segkmem_create(struct seg *);
extern page_t *segkmem_page_create(void *, size_t, int, void *);
extern void *segkmem_xalloc(vmem_t *, void *, size_t, int, uint_t,
	page_t *(*page_create_func)(void *, size_t, int, void *), void *);
extern void *segkmem_alloc(vmem_t *, size_t, int);
extern void *segkmem_alloc_permanent(vmem_t *, size_t, int);
extern void segkmem_free(vmem_t *, void *, size_t);
extern void segkmem_xfree(vmem_t *, void *, size_t, void (*)(page_t *));

extern void *boot_alloc(void *, size_t, uint_t);
extern void boot_mapin(caddr_t addr, size_t size);
extern void kernelheap_init(void *, void *, char *, void *, void *);
extern void segkmem_gc(void);

extern void *segkmem_zio_alloc(vmem_t *, size_t, int);
extern int segkmem_zio_create(struct seg *);
extern void segkmem_zio_free(vmem_t *, void *, size_t);
extern void segkmem_zio_init(void *, size_t);

/*
 * Flags for segkmem_xalloc().
 *
 * SEGKMEM_SHARELOCKED requests pages which are locked SE_SHARED to be
 * returned rather than unlocked which is now the default.  Note that
 * memory returned by SEGKMEM_SHARELOCKED cannot be freed by segkmem_free().
 * This is a hack for seg_dev that should be cleaned up in the future.
 */
#define	SEGKMEM_SHARELOCKED	0x20000

/*
 * Large page for kmem caches support
 */
typedef struct segkmem_lpcb {
	kmutex_t	lp_lock;
	kcondvar_t	lp_cv;
	uint_t		lp_wait;
	uint_t		lp_uselp;
	ulong_t		lp_throttle;

	/* stats */
	uint64_t	sleep_allocs_failed;
	uint64_t	nosleep_allocs_failed;
	uint64_t	allocs_throttled;
	uint64_t	allocs_limited;
	uint64_t	alloc_bytes_failed;
} segkmem_lpcb_t;

extern void	*segkmem_alloc_lp(vmem_t *, size_t *, size_t, int);
extern void	segkmem_free_lp(vmem_t *, void *, size_t);
extern int	segkmem_lpsetup();
extern void	segkmem_heap_lp_init(void);

extern size_t	segkmem_lpsize;
extern int	segkmem_lpszc;
extern size_t	segkmem_heaplp_quantum;
extern size_t	segkmem_kmemlp_max;

#define	SEGKMEM_USE_LARGEPAGES (segkmem_lpsize > PAGESIZE)

#define	IS_KMEM_VA_LARGEPAGE(vaddr)				        \
	(((vaddr) >= heap_lp_base) && ((vaddr) < heap_lp_end))

extern struct seg_ops segkmem_ops;

#endif	/* _KERNEL */

#ifdef	__cplusplus
}
#endif

#endif	/* _VM_SEG_KMEM_H */