Rename struct slab_alloc to struct slab_allocator.
[barrelfish] / usr / mem_serv_dist / mem_serv.h
1 /**
2  * \file
3  * \brief Distributed (percore) memory server
4  */
5
6 /*
7  * Copyright (c) 2007-2011, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef __MEM_SERV_H__
16 #define __MEM_SERV_H__
17
18 #ifndef MIN
19 #define MIN(a,b) ((a)<=(b)?(a):(b))
20 #endif
21
22 #define MEMSERV_DIST "mem_serv_dist"
23 #define NAME_LEN 20
24
25 #define MEMSERV_PERCORE_DYNAMIC
26 #ifndef __scc__
27 #       define MEMSERV_AFFINITY
28 #endif
29
30 // appropriate size type for available RAM
31 typedef genpaddr_t memsize_t;
32 #define PRIuMEMSIZE PRIuGENPADDR
33
34 /* parameters for size of supported RAM and thus required storage */
35
36 // XXX: Even though we could manage an arbitrary amount of RAM on any
37 // architecture, we use paddr_t as the type to represent region
38 // limits, which limits us its size.
39 #if defined(__x86_64__)
40 #       define MAXSIZEBITS     38    ///< Max size of memory in allocator
41 #elif defined(__i386__)
42 #       define MAXSIZEBITS     32
43 #elif defined(__arm__)
44 /* XXX This is better if < 32! - but there were no compile time warnings! */
45 #       define MAXSIZEBITS     31
46 #else
47 #       error Unknown architecture
48 #endif
49
50 #define MINALLOCBITS    17 /// HACK: Min bits to alloc from mem_serv for local
51                           /// percore memory. leaves some over for other uses
52 #define MINSIZEBITS     OBJBITS_DISPATCHER ///< Min size of each allocation
53 #define MAXCHILDBITS    4               ///< Max branching of BTree nodes
54
55 #ifndef __scc__
56 #       define LOCAL_MEMBITS     18     // amount of memory that we keep for 
57 #       define LOCAL_MEM ((genpaddr_t)1 << LOCAL_MEMBITS)
58                                    // internal use in each local server
59 #else
60 #       define LOCAL_MEMBITS     29
61 #       define LOCAL_MEM         EXTRA_SHARED_MEM_MIN
62 #endif
63
64
65
66 /// Maximum depth of the BTree, assuming only branching by two at each level
67 #define MAXDEPTH        (MAXSIZEBITS - MINSIZEBITS + 1)
68 /// Maximum number of BTree nodes
69 #define NNODES          ((1UL << MAXDEPTH) - 1)
70
71 /* Parameters for static per-core memserv */
72 #define PERCORE_BITS 27
73 #define PERCORE_MEM ((memsize_t)1<<PERCORE_BITS)  ///< How much memory per-core
74
75 // size of initial RAM cap to fill allocator
76 #define SMALLCAP_BITS 20
77
78
79 /**
80  * \brief Size of CNodes to be created by slot allocator.
81  *
82  * Must satisfy both:
83  *    #CNODE_BITS >= MAXCHILDBITS        (cnode enough for max branching factor)
84  *    (1UL << #CNODE_BITS) ** 2 >= #NNODES  (total number of slots is enough)
85  */
86 #define CNODE_BITS      12
87 #define NCNODES         (1UL << CNODE_BITS)     ///< Maximum number of CNodes
88
89 /// Watermark at which we must refill the slab allocator used for nodes
90 #define MINSPARENODES   (MAXDEPTH * 8) // XXX: FIXME: experimentally determined!
91
92 extern memsize_t mem_total;
93 extern memsize_t mem_avail;
94
95 /// MM per-core allocator instance data: B-tree to manage mem regions
96 extern struct mm mm_percore;
97
98 /// MM local allocator instance data: B-tree to manage mem regions
99 extern struct mm mm_local;
100
101 /// Monitor's binding to this mem_serv
102 extern struct mem_binding *monitor_mem_binding;
103
104 errval_t slab_refill(struct slab_allocator *slabs);
105
106 errval_t percore_free_handler_common(struct capref ramcap, genpaddr_t base,
107                                      uint8_t bits);
108 memsize_t mem_available_handler_common(void);
109 errval_t percore_alloc(struct capref *ret, uint8_t bits,
110                        genpaddr_t minbase, genpaddr_t maxlimit);
111 errval_t percore_allocate_handler_common(uint8_t bits,
112                                          genpaddr_t minbase, 
113                                          genpaddr_t maxlimit,
114                                          struct capref *retcap);
115
116 errval_t initialize_percore_mem_serv(coreid_t core, 
117                                      coreid_t *cores, 
118                                      int len_cores,
119                                      memsize_t percore_mem);
120
121
122 errval_t percore_mem_serv(coreid_t core, coreid_t *cores, 
123                           int len_cores, memsize_t ram);
124
125 errval_t set_local_spawnd_memserv(coreid_t coreid);
126
127 int common_main(int argc, char **argv);
128
129 #endif