source: mainline/kernel/generic/include/mm/slab.h@ 26a6ed4

Last change on this file since 26a6ed4 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 8 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup genericmm
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_SLAB_H_
36#define KERN_SLAB_H_
37
38#include <adt/list.h>
39#include <synch/spinlock.h>
40#include <atomic.h>
41#include <mm/frame.h>
42
43/** Minimum size to be allocated by malloc */
44#define SLAB_MIN_MALLOC_W 4
45
46/** Maximum size to be allocated by malloc */
47#define SLAB_MAX_MALLOC_W 22
48
49/** Initial Magazine size (TODO: dynamically growing magazines) */
50#define SLAB_MAG_SIZE 4
51
52/** If object size is less, store control structure inside SLAB */
53#define SLAB_INSIDE_SIZE (PAGE_SIZE >> 3)
54
55/** Maximum wasted space we allow for cache */
56#define SLAB_MAX_BADNESS(cache) \
57 (FRAMES2SIZE((cache)->frames) >> 2)
58
59/* slab_reclaim constants */
60
61/** Reclaim all possible memory, because we are in memory stress */
62#define SLAB_RECLAIM_ALL 0x01
63
64/* cache_create flags */
65
66/** Do not use per-cpu cache */
67#define SLAB_CACHE_NOMAGAZINE 0x01
68/** Have control structure inside SLAB */
69#define SLAB_CACHE_SLINSIDE 0x02
70/** We add magazine cache later, if we have this flag */
71#define SLAB_CACHE_MAGDEFERRED (0x04 | SLAB_CACHE_NOMAGAZINE)
72
73typedef struct {
74 link_t link;
75 size_t busy; /**< Count of full slots in magazine */
76 size_t size; /**< Number of slots in magazine */
77 void *objs[]; /**< Slots in magazine */
78} slab_magazine_t;
79
80typedef struct {
81 slab_magazine_t *current;
82 slab_magazine_t *last;
83 IRQ_SPINLOCK_DECLARE(lock);
84} slab_mag_cache_t;
85
86typedef struct {
87 const char *name;
88
89 link_t link;
90
91 /* Configuration */
92
93 /** Size of slab position - align_up(sizeof(obj)) */
94 size_t size;
95
96 errno_t (*constructor)(void *obj, unsigned int kmflag);
97 size_t (*destructor)(void *obj);
98
99 /** Flags changing behaviour of cache */
100 unsigned int flags;
101
102 /* Computed values */
103 size_t frames; /**< Number of frames to be allocated */
104 size_t objects; /**< Number of objects that fit in */
105
106 /* Statistics */
107 atomic_t allocated_slabs;
108 atomic_t allocated_objs;
109 atomic_t cached_objs;
110 /** How many magazines in magazines list */
111 atomic_t magazine_counter;
112
113 /* Slabs */
114 list_t full_slabs; /**< List of full slabs */
115 list_t partial_slabs; /**< List of partial slabs */
116 IRQ_SPINLOCK_DECLARE(slablock);
117 /* Magazines */
118 list_t magazines; /**< List o full magazines */
119 IRQ_SPINLOCK_DECLARE(maglock);
120
121 /** CPU cache */
122 slab_mag_cache_t *mag_cache;
123} slab_cache_t;
124
125extern slab_cache_t *slab_cache_create(const char *, size_t, size_t,
126 errno_t (*)(void *, unsigned int), size_t (*)(void *), unsigned int);
127extern void slab_cache_destroy(slab_cache_t *);
128
129extern void *slab_alloc(slab_cache_t *, unsigned int)
130 __attribute__((malloc));
131extern void slab_free(slab_cache_t *, void *);
132extern size_t slab_reclaim(unsigned int);
133
134/* slab subsytem initialization */
135extern void slab_cache_init(void);
136extern void slab_enable_cpucache(void);
137
138/* kconsole debug */
139extern void slab_print_list(void);
140
141/* malloc support */
142extern void *malloc(size_t, unsigned int)
143 __attribute__((malloc));
144extern void *realloc(void *, size_t, unsigned int)
145 __attribute__((warn_unused_result));
146extern void free(void *);
147
148#endif
149
150/** @}
151 */
Note: See TracBrowser for help on using the repository browser.