increased the morecore heap size to 3.5GB
[barrelfish] / lib / barrelfish / morecore.c
1 /**
2  * \file
3  * \brief Morecore implementation for malloc
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 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 #include <barrelfish/barrelfish.h>
16 #include <barrelfish/core_state.h>
17 #include <barrelfish/morecore.h>
18 #include <stdio.h>
19
20 /// Amount of virtual space for malloc
21 #ifdef __x86_64__
22 #       define HEAP_REGION (3500UL * 1024 * 1024) /* 2GB */
23 #else
24 #       define HEAP_REGION (512UL * 1024 * 1024) /* 512MB */
25 #endif
26
27 typedef void *(*morecore_alloc_func_t)(size_t bytes, size_t *retbytes);
28 extern morecore_alloc_func_t sys_morecore_alloc;
29
30 typedef void (*morecore_free_func_t)(void *base, size_t bytes);
31 extern morecore_free_func_t sys_morecore_free;
32
33 /**
34  * \brief Allocate some memory for malloc to use
35  *
36  * This function will keep trying with smaller and smaller frames till
37  * it finds a set of frames that satisfy the requirement. retbytes can
38  * be smaller than bytes if we were able to allocate a smaller memory
39  * region than requested for.
40  */
41 static void *morecore_alloc(size_t bytes, size_t *retbytes)
42 {
43     errval_t err;
44     struct morecore_state *state = get_morecore_state();
45
46     void *buf = NULL;
47     size_t mapped = 0;
48     size_t step = bytes;
49     while (mapped < bytes) {
50         struct capref cap;
51         err = slot_alloc(&cap);
52         if (err_is_fail(err)) {
53             USER_PANIC_ERR(err, "slot_alloc failed");
54         }
55
56         void *mid_buf = NULL;
57         err = vspace_mmu_aware_map(&state->mmu_state, cap, step,
58                                    &mid_buf, &step);
59         if (err_is_ok(err)) {
60             if (buf == NULL) {
61                 buf = mid_buf;
62             }
63             mapped += step;
64         } else {
65             /*
66               vspace_mmu_aware_map failed probably because we asked
67               for a very large frame, will try asking for smaller one.
68              */
69             if (err_no(err) == LIB_ERR_FRAME_CREATE_MS_CONSTRAINTS) {
70                 err = slot_free(cap);
71                 if (err_is_fail(err)) {
72                     debug_err(__FILE__, __func__, __LINE__, err,
73                               "slot_free failed");
74                     return NULL;
75                 }
76                 if (step < BASE_PAGE_SIZE) {
77                     // Return whatever we have allocated until now
78                     break;
79                 }
80                 step /= 2;
81                 continue;
82             } else {
83                 debug_err(__FILE__, __func__, __LINE__, err,
84                           "vspace_mmu_aware_map fail");
85                 return NULL;
86             }
87         }
88     }
89
90     *retbytes = mapped;
91     return buf;
92 }
93
94 static void morecore_free(void *base, size_t bytes)
95 {
96     struct morecore_state *state = get_morecore_state();
97     errval_t err = vspace_mmu_aware_unmap(&state->mmu_state,
98                                           (lvaddr_t)base, bytes);
99     if(err_is_fail(err)) {
100         USER_PANIC_ERR(err, "vspace_mmu_aware_unmap");
101     }
102 }
103
104 Header *get_malloc_freep(void);
105 Header *get_malloc_freep(void)
106 {
107     return get_morecore_state()->header_freep;
108 }
109
110 errval_t morecore_init(void)
111 {
112     errval_t err;
113     struct morecore_state *state = get_morecore_state();
114
115     thread_mutex_init(&state->mutex);
116
117     err = vspace_mmu_aware_init(&state->mmu_state, HEAP_REGION);
118     if (err_is_fail(err)) {
119         return err_push(err, LIB_ERR_VSPACE_MMU_AWARE_INIT);
120     }
121
122     sys_morecore_alloc = morecore_alloc;
123     sys_morecore_free = morecore_free;
124
125     return SYS_ERR_OK;
126 }