diff options
Diffstat (limited to 'erts/emulator/beam/erl_alloc.c')
-rw-r--r-- | erts/emulator/beam/erl_alloc.c | 151 |
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. * * * |