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