summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/erl_alloc.c')
-rw-r--r--erts/emulator/beam/erl_alloc.c151
1 files changed, 55 insertions, 96 deletions
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c
index bbe0e90ae1..3ab9c9d1b6 100644
--- a/erts/emulator/beam/erl_alloc.c
+++ b/erts/emulator/beam/erl_alloc.c
@@ -38,7 +38,6 @@
#include "erl_db.h"
#include "erl_binary.h"
#include "erl_bits.h"
-#include "erl_mtrace.h"
#include "erl_mseg.h"
#include "erl_monitor_link.h"
#include "erl_hl_timer.h"
@@ -80,6 +79,9 @@
#define ERTS_ALC_DEFAULT_ACUL_EHEAP_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_EHEAP_ALLOC
#define ERTS_ALC_DEFAULT_ACUL_LL_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_LL_ALLOC
+#define ERTS_ALC_DEFAULT_ENABLED_ACFUL ERTS_ALC_DEFAULT_ENABLED_ACUL - 20
+#define ERTS_ALC_DEFAULT_ENABLED_ACFUL_EHEAP_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_EHEAP_ALLOC - 20
+#define ERTS_ALC_DEFAULT_ENABLED_ACFUL_LL_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_LL_ALLOC - 20
#ifdef DEBUG
static Uint install_debug_functions(void);
@@ -191,10 +193,6 @@ typedef struct {
int top_pad;
int dirty_alloc_insts;
AlcUInit_t alloc_util;
- struct {
- char *mtrace;
- char *nodename;
- } instr;
struct au_init sl_alloc;
struct au_init std_alloc;
struct au_init ll_alloc;
@@ -315,6 +313,7 @@ set_default_literal_alloc_opts(struct au_init *ip)
ip->init.util.rsbcmt = 0;
ip->init.util.rmbcmt = 0;
ip->init.util.acul = 0;
+ ip->init.util.acful = 0;
#if defined(ARCH_32)
# if HAVE_ERTS_MSEG
@@ -597,6 +596,9 @@ adjust_carrier_migration_support(struct au_init *auip)
auip->init.aoff.blk_order = FF_BF;
}
}
+ if (auip->init.util.acful > auip->init.util.acul) {
+ auip->init.util.acful = auip->init.util.acul;
+ }
}
void
@@ -644,6 +646,8 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
= ERTS_MAGIC_BIN_UNALIGNED_SIZE(sizeof(ErtsMagicIndirectionWord));
fix_type_sizes[ERTS_ALC_FIX_TYPE_IX(ERTS_ALC_T_RECV_MARK_BLK)]
= sizeof(ErtsRecvMarkerBlock);
+ fix_type_sizes[ERTS_ALC_FIX_TYPE_IX(ERTS_ALC_T_SIGQ_BUFFERS)]
+ = sizeof(ErtsSignalInQueueBufferArray);
#ifdef HARD_DEBUG
hdbg_init();
@@ -657,9 +661,6 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
if (ncpu < 1)
ncpu = 1;
- erts_tsd_key_create(&erts_allctr_prelock_tsd_key,
- "erts_allctr_prelock_tsd_key");
-
erts_sys_alloc_init();
erts_init_utils_mem();
@@ -697,6 +698,7 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
/* Make adjustments for carrier migration support */
init.temp_alloc.init.util.acul = 0;
+ init.temp_alloc.init.util.acful = 0;
adjust_carrier_migration_support(&init.sl_alloc);
adjust_carrier_migration_support(&init.std_alloc);
adjust_carrier_migration_support(&init.ll_alloc);
@@ -733,6 +735,16 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
init.driver_alloc.init.util.acul = 0;
init.fix_alloc.init.util.acul = 0;
init.literal_alloc.init.util.acul = 0;
+ init.temp_alloc.init.util.acful = 0;
+ init.sl_alloc.init.util.acful = 0;
+ init.std_alloc.init.util.acful = 0;
+ init.ll_alloc.init.util.acful = 0;
+ init.eheap_alloc.init.util.acful = 0;
+ init.binary_alloc.init.util.acful = 0;
+ init.ets_alloc.init.util.acful = 0;
+ init.driver_alloc.init.util.acful = 0;
+ init.fix_alloc.init.util.acful = 0;
+ init.literal_alloc.init.util.acful = 0;
}
/* Only temp_alloc can use thread specific interface */
@@ -770,7 +782,6 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
if (!init.temp_alloc.thr_spec)
refuse_af_strategy(&init.temp_alloc);
- erts_mtrace_pre_init();
#if HAVE_ERTS_MSEG
init.mseg.nos = erts_no_schedulers;
init.mseg.ndai = init.dirty_alloc_insts;
@@ -826,8 +837,6 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
sys_alloc_opt(SYS_ALLOC_OPT_TRIM_THRESHOLD, init.trim_threshold);
sys_alloc_opt(SYS_ALLOC_OPT_TOP_PAD, init.top_pad);
- erts_mtrace_init(init.instr.mtrace, init.instr.nodename);
-
start_au_allocator(ERTS_ALC_A_TEMPORARY,
&init.temp_alloc,
&temp_alloc_state);
@@ -869,8 +878,6 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop)
&init.test_alloc,
&test_alloc_state);
- erts_mtrace_install_wrapper_functions();
-
init_aireq_alloc();
#ifdef DEBUG
@@ -1286,6 +1293,30 @@ get_acul_value(struct au_init *auip, char *param_end, char** argv, int* ip)
return (Uint) tmp;
}
+static Uint
+get_acful_value(struct au_init *auip, char *param_end, char** argv, int* ip)
+{
+ Sint tmp;
+ char *rest;
+ char *param = argv[*ip]+1;
+ char *value = get_value(param_end, argv, ip);
+ if (sys_strcmp(value, "de") == 0) {
+ switch (auip->init.util.alloc_no) {
+ case ERTS_ALC_A_LONG_LIVED:
+ return ERTS_ALC_DEFAULT_ENABLED_ACFUL_LL_ALLOC;
+ case ERTS_ALC_A_EHEAP:
+ return ERTS_ALC_DEFAULT_ENABLED_ACFUL_EHEAP_ALLOC;
+ default:
+ return ERTS_ALC_DEFAULT_ENABLED_ACFUL;
+ }
+ }
+ errno = 0;
+ tmp = (Sint) ErtsStrToSint(value, &rest, 10);
+ if (errno != 0 || rest == value || tmp < 0 || 100 < tmp)
+ bad_value(param, param_end, value);
+ return (Uint) tmp;
+}
+
static void
handle_au_arg(struct au_init *auip,
char* sub_param,
@@ -1315,6 +1346,10 @@ handle_au_arg(struct au_init *auip,
value = get_amount_value(sub_param + 5, argv, ip);
wp = &auip->init.util.acfml;
}
+ else if (has_prefix("acful", sub_param)) {
+ value = get_acful_value(auip, sub_param + 5, argv, ip);
+ wp = &auip->init.util.acful;
+ }
else
goto bad_switch;
@@ -1381,8 +1416,10 @@ handle_au_arg(struct au_init *auip,
bad_value(param, sub_param + 1, alg);
}
}
- if (!strategy_support_carrier_migration(auip))
+ if (!strategy_support_carrier_migration(auip)) {
auip->init.util.acul = 0;
+ auip->init.util.acful = 0;
+ }
} else if (has_prefix("atags", sub_param)) {
auip->init.util.atags = get_bool_value(sub_param + 5, argv, ip);
}
@@ -1514,6 +1551,7 @@ handle_au_arg(struct au_init *auip,
else if (res == 0) {
auip->thr_spec = 0;
auip->init.util.acul = 0;
+ auip->init.util.acful = 0;
break;
}
goto bad_switch;
@@ -1725,6 +1763,7 @@ handle_args(int *argc, char **argv, erts_alc_hndl_args_init_t *init)
for (a = 0; a < aui_sz; a++) {
aui[a]->thr_spec = 0;
aui[a]->init.util.acul = 0;
+ aui[a]->init.util.acful = 0;
aui[a]->init.util.ramv = 0;
aui[a]->init.util.lmbcs = 5*1024*1024;
}
@@ -1738,15 +1777,6 @@ handle_args(int *argc, char **argv, erts_alc_hndl_args_init_t *init)
bad_param(param, param+1);
}
break;
- case 'i':
- switch (argv[i][3]) {
- case 't':
- init->instr.mtrace = get_value(argv[i]+4, argv, &i);
- break;
- default:
- bad_param(param, param+2);
- }
- break;
case 'l':
if (has_prefix("pm", param+2)) {
arg = get_value(argv[i]+5, argv, &i);
@@ -1816,18 +1846,6 @@ handle_args(int *argc, char **argv, erts_alc_hndl_args_init_t *init)
case '-':
if (argv[i][2] == '\0') {
/* End of system flags reached */
- if (init->instr.mtrace) {
- while (i < *argc) {
- if(sys_strcmp(argv[i], "-sname") == 0
- || sys_strcmp(argv[i], "-name") == 0) {
- if (i + 1 <*argc) {
- init->instr.nodename = argv[i+1];
- break;
- }
- }
- i++;
- }
- }
goto args_parsed;
}
break;
@@ -2202,7 +2220,7 @@ erts_memory(fmtfn_t *print_to_p, void *print_to_arg, void *proc, Eterm earg)
ERTS_LC_ASSERT(erts_thr_progress_is_blocking());
- /* Figure out whats wanted... */
+ /* Figure out what's wanted... */
length = 0;
if (is_non_value(earg)) { /* i.e. wants all */
@@ -2870,9 +2888,6 @@ erts_allocator_info(fmtfn_t to, void *arg)
erts_print(to, arg, "=allocator:instr\n");
- erts_print(to, arg, "option t: %s\n",
- erts_mtrace_enabled ? "true" : "false");
-
}
Eterm
@@ -2974,14 +2989,6 @@ erts_allocator_options(void *proc)
terms[length++] = erts_mmap_info_options(&erts_dflt_mmapper, NULL, NULL,
NULL, hpp, szp);
#endif
- {
- Eterm o[1], v[1];
- o[0] = ERTS_MAKE_AM("t");
- v[0] = erts_mtrace_enabled ? am_true : am_false;
-
- atoms[length] = ERTS_MAKE_AM("instr");
- terms[length++] = erts_bld_2tup_list(hpp, szp, 1, o, v);
- }
atoms[length] = ERTS_MAKE_AM("lock_physical_memory");
terms[length++] = (lock_all_physical_memory ? am_all : am_no);
@@ -3139,7 +3146,7 @@ reply_alloc_info(void *vair)
if (hpp)
sys_alloc_stat(&sas);
if (szp) {
- /* ensure ehough heap */
+ /* ensure enough heap */
sas.top_pad = INT_MAX;
sas.trim_threshold = INT_MAX;
}
@@ -3480,54 +3487,6 @@ badarg:
return res;
}
-/*
- * The allocator wrapper prelocking stuff below is about the locking order.
- * It only affects wrappers (erl_mtrace.c) that keep locks during
- * alloc/realloc/free.
- *
- * Some query functions in erl_alloc_util.c lock the allocator mutex and then
- * use erts_printf that in turn may call the sys allocator through the wrappers.
- * To avoid breaking locking order these query functions first "pre-locks" all
- * allocator wrappers.
- */
-ErtsAllocatorWrapper_t *erts_allctr_wrappers;
-int erts_allctr_wrapper_prelocked = 0;
-erts_tsd_key_t erts_allctr_prelock_tsd_key;
-
-void erts_allctr_wrapper_prelock_init(ErtsAllocatorWrapper_t* wrapper)
-{
- ASSERT(wrapper->lock && wrapper->unlock);
- wrapper->next = erts_allctr_wrappers;
- erts_allctr_wrappers = wrapper;
-}
-
-void erts_allctr_wrapper_pre_lock(void)
-{
- if (erts_allctr_wrappers) {
- ErtsAllocatorWrapper_t* wrapper = erts_allctr_wrappers;
- for ( ; wrapper; wrapper = wrapper->next) {
- wrapper->lock();
- }
- ASSERT(!erts_allctr_wrapper_prelocked);
- erts_allctr_wrapper_prelocked = 1;
- erts_tsd_set(erts_allctr_prelock_tsd_key, (void*)1);
- }
-}
-
-void erts_allctr_wrapper_pre_unlock(void)
-{
- if (erts_allctr_wrappers) {
- ErtsAllocatorWrapper_t* wrapper = erts_allctr_wrappers;
-
- erts_allctr_wrapper_prelocked = 0;
- erts_tsd_set(erts_allctr_prelock_tsd_key, (void*)0);
- for ( ; wrapper; wrapper = wrapper->next) {
- wrapper->unlock();
- }
- }
-}
-
-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* NOTE: erts_alc_test() is only supposed to be used for testing. *
* *