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#define MEMSERV_AFFINITY
27
28// appropriate size type for available RAM
29typedef genpaddr_t memsize_t;
30#define PRIuMEMSIZE PRIuGENPADDR
31
32/* parameters for size of supported RAM and thus required storage */
33
34// XXX: Even though we could manage an arbitrary amount of RAM on any
35// architecture, we use paddr_t as the type to represent region
36// limits, which limits us its size.
37#if defined(__x86_64__)
38#       define MAXSIZEBITS     38    ///< Max size of memory in allocator
39#elif defined(__i386__)
40#       define MAXSIZEBITS     32
41#elif defined(__arm__)
42/* XXX This is better if < 32! - but there were no compile time warnings! */
43#       define MAXSIZEBITS     31
44#elif defined(__aarch64__)
45#       define MAXSIZEBITS     32
46#else
47#       error Unknown architecture
48#endif
49
50#define OBJBITS_DISPATCHER 10
51#define MINALLOCBITS    17 /// HACK: Min bits to alloc from mem_serv for local
52			  /// percore memory. leaves some over for other uses
53#define MINSIZEBITS     OBJBITS_DISPATCHER ///< Min size of each allocation
54#define MAXCHILDBITS    4               ///< Max branching of BTree nodes
55
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
60
61
62/// Maximum depth of the BTree, assuming only branching by two at each level
63#define MAXDEPTH        (MAXSIZEBITS - MINSIZEBITS + 1)
64/// Maximum number of BTree nodes
65#define NNODES          ((1UL << MAXDEPTH) - 1)
66
67/* Parameters for static per-core memserv */
68#define PERCORE_BITS 27
69#define PERCORE_MEM ((memsize_t)1<<PERCORE_BITS)  ///< How much memory per-core
70
71// size of initial RAM cap to fill allocator
72#define SMALLCAP_BITS 20
73
74
75/**
76 * \brief Size of CNodes to be created by slot allocator.
77 *
78 * Must satisfy both:
79 *    #CNODE_BITS >= MAXCHILDBITS        (cnode enough for max branching factor)
80 *    (1UL << #CNODE_BITS) ** 2 >= #NNODES  (total number of slots is enough)
81 */
82#define CNODE_BITS      12
83#define NCNODES         (1UL << CNODE_BITS)     ///< Maximum number of CNodes
84
85/// Watermark at which we must refill the slab allocator used for nodes
86#define MINSPARENODES   (MAXDEPTH * 8) // XXX: FIXME: experimentally determined!
87
88extern memsize_t mem_total;
89extern memsize_t mem_avail;
90
91/// MM per-core allocator instance data: B-tree to manage mem regions
92extern struct mm mm_percore;
93
94/// MM local allocator instance data: B-tree to manage mem regions
95extern struct mm mm_local;
96
97/// Monitor's binding to this mem_serv
98extern struct mem_binding *monitor_mem_binding;
99
100errval_t slab_refill(struct slab_allocator *slabs);
101
102errval_t percore_free_handler_common(struct capref ramcap, genpaddr_t base,
103                                     uint8_t bits);
104memsize_t mem_available_handler_common(void);
105errval_t percore_alloc(struct capref *ret, uint8_t bits,
106                       genpaddr_t minbase, genpaddr_t maxlimit);
107errval_t percore_allocate_handler_common(uint8_t bits,
108                                         genpaddr_t minbase,
109                                         genpaddr_t maxlimit,
110                                         struct capref *retcap);
111
112errval_t initialize_percore_mem_serv(coreid_t core,
113                                     coreid_t *cores,
114                                     int len_cores,
115                                     memsize_t percore_mem);
116
117
118errval_t percore_mem_serv(coreid_t core, coreid_t *cores,
119                          int len_cores, memsize_t ram);
120
121errval_t set_local_spawnd_memserv(coreid_t coreid);
122
123int common_main(int argc, char **argv);
124
125#endif
126