kmem.h revision 331017
113546Sjulian/*-
235509Sjb * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
313546Sjulian * All rights reserved.
413546Sjulian *
513546Sjulian * Redistribution and use in source and binary forms, with or without
613546Sjulian * modification, are permitted provided that the following conditions
713546Sjulian * are met:
813546Sjulian * 1. Redistributions of source code must retain the above copyright
913546Sjulian *    notice, this list of conditions and the following disclaimer.
1013546Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1113546Sjulian *    notice, this list of conditions and the following disclaimer in the
1213546Sjulian *    documentation and/or other materials provided with the distribution.
1313546Sjulian *
1413546Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
1513546Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1613546Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1713546Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
1813546Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1913546Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2013546Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2113546Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2213546Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2349439Sdeischen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2413546Sjulian * SUCH DAMAGE.
2513546Sjulian *
2613546Sjulian * $FreeBSD: stable/11/sys/cddl/compat/opensolaris/sys/kmem.h 331017 2018-03-15 19:08:33Z kevans $
2713546Sjulian */
2813546Sjulian
2913546Sjulian#ifndef _OPENSOLARIS_SYS_KMEM_H_
3013546Sjulian#define	_OPENSOLARIS_SYS_KMEM_H_
3113546Sjulian
3250476Speter#include <sys/param.h>
3324518Sjb#include <sys/proc.h>
3413546Sjulian#include <sys/malloc.h>
3513546Sjulian#include <sys/vmem.h>
3613546Sjulian#include <sys/vmmeter.h>
3713546Sjulian
3813546Sjulian#include <vm/uma.h>
3913546Sjulian#include <vm/vm.h>
4013546Sjulian#include <vm/vm_extern.h>
41103388Smini
4213546SjulianMALLOC_DECLARE(M_SOLARIS);
4395948Sarchie
4471581Sdeischen#define	POINTER_IS_VALID(p)	(!((uintptr_t)(p) & 0x3))
4513546Sjulian#define	POINTER_INVALIDATE(pp)	(*(pp) = (void *)((uintptr_t)(*(pp)) | 0x1))
4695948Sarchie
4795948Sarchie#define	KM_SLEEP		M_WAITOK
48113658Sdeischen#define	KM_PUSHPAGE		M_WAITOK
4995948Sarchie#define	KM_NOSLEEP		M_NOWAIT
5095948Sarchie#define	KM_NODEBUG		M_NODUMP
51123312Sdavidxu#define	KM_NORMALPRI		0
52103419Smini#define	KMC_NODEBUG		UMA_ZONE_NODUMP
53123312Sdavidxu#define	KMC_NOTOUCH		0
5495948Sarchie
5595948Sarchietypedef struct kmem_cache {
5695948Sarchie	char		kc_name[32];
57#if defined(_KERNEL) && !defined(KMEM_DEBUG)
58	uma_zone_t	kc_zone;
59#else
60	size_t		kc_size;
61#endif
62	int		(*kc_constructor)(void *, void *, int);
63	void		(*kc_destructor)(void *, void *);
64	void		*kc_private;
65} kmem_cache_t;
66
67void *zfs_kmem_alloc(size_t size, int kmflags);
68void zfs_kmem_free(void *buf, size_t size);
69uint64_t kmem_size(void);
70kmem_cache_t *kmem_cache_create(char *name, size_t bufsize, size_t align,
71    int (*constructor)(void *, void *, int), void (*destructor)(void *, void *),
72    void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags);
73void kmem_cache_destroy(kmem_cache_t *cache);
74void *kmem_cache_alloc(kmem_cache_t *cache, int flags);
75void kmem_cache_free(kmem_cache_t *cache, void *buf);
76void kmem_cache_reap_now(kmem_cache_t *cache);
77void kmem_reap(void);
78int kmem_debugging(void);
79void *calloc(size_t n, size_t s);
80
81#define	freemem				vm_cnt.v_free_count
82#define	minfree				vm_cnt.v_free_min
83#define	heap_arena			kmem_arena
84#define	kmem_alloc(size, kmflags)	zfs_kmem_alloc((size), (kmflags))
85#define	kmem_zalloc(size, kmflags)	zfs_kmem_alloc((size), (kmflags) | M_ZERO)
86#define	kmem_free(buf, size)		zfs_kmem_free((buf), (size))
87
88#define	kmem_cache_set_move(cache, movefunc)	do { } while (0)
89
90#endif	/* _OPENSOLARIS_SYS_KMEM_H_ */
91