#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>
#if defined(_KERNEL) || defined(_FAKE_KERNEL)
extern char *kernelheap;
extern char *ekernelheap;
extern char *heap_lp_base;
extern char *heap_lp_end;
extern struct seg kvseg;
extern struct seg kvseg_core;
extern struct seg kzioseg;
extern vmem_t *heap_lp_arena;
extern vmem_t *heap_arena;
extern vmem_t *hat_memload_arena;
extern struct seg kvseg32;
extern vmem_t *heap32_arena;
extern vmem_t *heaptext_arena;
extern struct as kas;
extern int segkmem_reloc;
extern vmem_t *static_arena;
extern vmem_t *static_alloc_arena;
extern vmem_t *zio_arena;
extern vmem_t *zio_alloc_arena;
#if defined(__amd64)
extern struct seg kvmmseg;
extern vmem_t *kvmm_arena;
extern void segkmem_kvmm_init(void *, size_t);
#endif
extern struct vnode kvps[];
#define kvp (kvps[KV_KVP])
#if defined(__sparc)
#define mpvp (kvps[KV_MPVP])
#define promvp (kvps[KV_PROMVP])
#endif
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,
struct vnode *, 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_init(void *, size_t);
#define SEGKMEM_SHARELOCKED 0x20000
typedef struct segkmem_lpcb {
kmutex_t lp_lock;
kcondvar_t lp_cv;
uint_t lp_wait;
uint_t lp_uselp;
ulong_t lp_throttle;
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
#ifdef __cplusplus
}
#endif
#endif