usr/src/uts/common/sys/kmem.h
author Joshua M. Clulow <jmc@joyent.com>
Mon, 04 Mar 2013 23:52:56 +0000
changeset 14188 afe390b9f1e0
parent 14028 bcbb822da4dd
permissions -rw-r--r--
4020 Make ldi_ev_remove_callbacks safe to use in LDI callbacks Reviewed by: Robert Mustacchi <[email protected]> Approved by: Dan McDonald <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
     5
 * Common Development and Distribution License (the "License").
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
12093
fa0c0f5bf466 6538954 kmem_cache_alloc() doesn't scale for anon structure allocations when cache magazines are empty
David Valin <David.Valin@Sun.COM>
parents: 11178
diff changeset
    23
 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
14028
bcbb822da4dd 3630 NFS server should not allocate oversized buffers
Sebastien Roy <seb@delphix.com>
parents: 12684
diff changeset
    24
 * Copyright (c) 2012 by Delphix. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#ifndef _SYS_KMEM_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#define	_SYS_KMEM_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/vmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * Kernel memory allocator: DDI interfaces.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * See kmem_alloc(9F) for details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#define	KM_SLEEP	0x0000	/* can block for memory; success guaranteed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#define	KM_NOSLEEP	0x0001	/* cannot block for memory; may fail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#define	KM_PANIC	0x0002	/* if memory cannot be allocated, panic */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#define	KM_PUSHPAGE	0x0004	/* can block for memory; may use reserve */
12156
3c537b2a7425 6675738 KM_NOSLEEP may still try too hard for some allocations
Stan Studzinski <Stan.Studzinski@Sun.COM>
parents: 12093
diff changeset
    49
#define	KM_NORMALPRI	0x0008  /* with KM_NOSLEEP, lower priority allocation */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#define	KM_VMFLAGS	0x00ff	/* flags that must match VM_* flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	KM_FLAGS	0xffff	/* all settable kmem flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
extern void *kmem_alloc(size_t size, int kmflags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
extern void *kmem_zalloc(size_t size, int kmflags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
extern void kmem_free(void *buf, size_t size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
extern void *kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags);
11178
d671c0911ce4 6898505 kmem_verify oddities around Fast Crash Dump integration
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6712
diff changeset
    60
extern void kmem_dump_init(size_t);
d671c0911ce4 6898505 kmem_verify oddities around Fast Crash Dump integration
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6712
diff changeset
    61
extern void kmem_dump_begin(void);
d671c0911ce4 6898505 kmem_verify oddities around Fast Crash Dump integration
Dave Plauger <Dave.Plauger@Sun.COM>
parents: 6712
diff changeset
    62
extern size_t kmem_dump_finish(char *buf, size_t size);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#endif	/* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 * Kernel memory allocator: private interfaces.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * These interfaces are still evolving.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 * Do not use them in unbundled drivers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 * Flags for kmem_cache_create()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#define	KMC_NOTOUCH	0x00010000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#define	KMC_NODEBUG	0x00020000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#define	KMC_NOMAGAZINE	0x00040000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#define	KMC_NOHASH	0x00080000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#define	KMC_QCACHE	0x00100000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#define	KMC_KMEM_ALLOC	0x00200000	/* internal use only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#define	KMC_IDENTIFIER	0x00400000	/* internal use only */
12093
fa0c0f5bf466 6538954 kmem_cache_alloc() doesn't scale for anon structure allocations when cache magazines are empty
David Valin <David.Valin@Sun.COM>
parents: 11178
diff changeset
    82
#define	KMC_PREFILL	0x00800000
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
struct kmem_cache;		/* cache structure is opaque to kmem clients */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
typedef struct kmem_cache kmem_cache_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    88
/* Client response to kmem move callback */
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    89
typedef enum kmem_cbrc {
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    90
	KMEM_CBRC_YES,
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    91
	KMEM_CBRC_NO,
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    92
	KMEM_CBRC_LATER,
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    93
	KMEM_CBRC_DONT_NEED,
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    94
	KMEM_CBRC_DONT_KNOW
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    95
} kmem_cbrc_t;
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
    96
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
    99
/*
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   100
 * Helps clients implementing the move() callback to recognize known objects by
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   101
 * testing a client-designated pointer member. Takes advantage of the fact that
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   102
 * any scribbling to freed memory done by kmem is guaranteed to set one of the
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   103
 * two low order bits.
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   104
 */
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   105
#define	POINTER_IS_VALID(p)	(!((uintptr_t)(p) & 0x3))
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   106
#define	POINTER_INVALIDATE(pp)	(*(pp) = (void *)((uintptr_t)(*(pp)) | 0x1))
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12156
diff changeset
   107
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
extern int kmem_ready;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
extern pgcnt_t kmem_reapahead;
14028
bcbb822da4dd 3630 NFS server should not allocate oversized buffers
Sebastien Roy <seb@delphix.com>
parents: 12684
diff changeset
   110
extern size_t kmem_max_cached;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
extern void kmem_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
extern void kmem_thread_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
extern void kmem_mp_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
extern void kmem_reap(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
extern void kmem_reap_idspace(void);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   117
extern int kmem_debugging(void);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
extern size_t kmem_avail(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
extern size_t kmem_maxavail(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
extern kmem_cache_t *kmem_cache_create(char *, size_t, size_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	int (*)(void *, void *, int), void (*)(void *, void *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	void (*)(void *), void *, vmem_t *, int);
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
   124
extern void kmem_cache_set_move(kmem_cache_t *,
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
   125
	kmem_cbrc_t (*)(void *, void *, size_t, void *));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
extern void kmem_cache_destroy(kmem_cache_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
extern void *kmem_cache_alloc(kmem_cache_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
extern void kmem_cache_free(kmem_cache_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
extern uint64_t kmem_cache_stat(kmem_cache_t *, char *);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   130
extern void kmem_cache_reap_now(kmem_cache_t *);
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 789
diff changeset
   131
extern void kmem_cache_move_notify(kmem_cache_t *, void *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#endif	/* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
#endif	/* _SYS_KMEM_H */