diff options
-rw-r--r-- | erts/emulator/beam/erl_alloc.c | 17 | ||||
-rw-r--r-- | erts/emulator/sys/common/erl_mseg.c | 18 | ||||
-rw-r--r-- | erts/emulator/sys/common/erl_mseg.h | 6 |
3 files changed, 38 insertions, 3 deletions
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c index b9c3b43498..1fc36fbd26 100644 --- a/erts/emulator/beam/erl_alloc.c +++ b/erts/emulator/beam/erl_alloc.c @@ -1326,12 +1326,25 @@ handle_args(int *argc, char **argv, erts_alc_hndl_args_init_t *init) handle_au_arg(&init->ll_alloc, &argv[i][3], argv, &i); break; case 'M': - if (has_prefix("mcs", argv[i]+3)) { + if (has_prefix("amcbf", argv[i]+3)) { +#if HAVE_ERTS_MSEG + init->mseg.amcbf = +#endif + get_kb_value(argv[i]+8, argv, &i); + } + else if (has_prefix("rmcbf", argv[i]+3)) { +#if HAVE_ERTS_MSEG + init->mseg.rmcbf = +#endif + get_amount_value(argv[i]+8, argv, &i); + } + else if (has_prefix("mcs", argv[i]+3)) { #if HAVE_ERTS_MSEG init->mseg.mcs = #endif get_amount_value(argv[i]+6, argv, &i); - } else { + } + else { bad_param(param, param+2); } break; diff --git a/erts/emulator/sys/common/erl_mseg.c b/erts/emulator/sys/common/erl_mseg.c index 7d03116daa..c8dd50bf7a 100644 --- a/erts/emulator/sys/common/erl_mseg.c +++ b/erts/emulator/sys/common/erl_mseg.c @@ -229,6 +229,9 @@ struct ErtsMsegAllctr_t_ { #endif Uint max_cache_size; + Uint abs_max_cache_bad_fit; + Uint rel_max_cache_bad_fit; + ErtsMsegCalls calls; #if CAN_PARTLY_DESTROY @@ -924,6 +927,8 @@ static struct { Eterm version; Eterm options; + Eterm amcbf; + Eterm rmcbf; Eterm mcs; Eterm memkind; @@ -982,6 +987,8 @@ init_atoms(ErtsMsegAllctr_t *ma) AM_INIT(name); AM_INIT(options); + AM_INIT(amcbf); + AM_INIT(rmcbf); AM_INIT(mcs); AM_INIT(status); @@ -1079,6 +1086,8 @@ info_options(ErtsMsegAllctr_t *ma, if (print_to_p) { int to = *print_to_p; void *arg = print_to_arg; + erts_print(to, arg, "%samcbf: %beu\n", prefix, ma->abs_max_cache_bad_fit); + erts_print(to, arg, "%srmcbf: %beu\n", prefix, ma->rel_max_cache_bad_fit); erts_print(to, arg, "%smcs: %beu\n", prefix, ma->max_cache_size); } @@ -1091,6 +1100,13 @@ info_options(ErtsMsegAllctr_t *ma, add_2tup(hpp, szp, &res, am.mcs, bld_uint(hpp, szp, ma->max_cache_size)); + add_2tup(hpp, szp, &res, + am.rmcbf, + bld_uint(hpp, szp, ma->rel_max_cache_bad_fit)); + add_2tup(hpp, szp, &res, + am.amcbf, + bld_uint(hpp, szp, ma->abs_max_cache_bad_fit)); + } return res; @@ -1519,6 +1535,8 @@ erts_mseg_init(ErtsMsegInit_t *init) /* Options ... */ + ma->abs_max_cache_bad_fit = init->amcbf; + ma->rel_max_cache_bad_fit = init->rmcbf; ma->max_cache_size = init->mcs; if (ma->max_cache_size > MAX_CACHE_SIZE) diff --git a/erts/emulator/sys/common/erl_mseg.h b/erts/emulator/sys/common/erl_mseg.h index 80a6c42741..8f8cb0e121 100644 --- a/erts/emulator/sys/common/erl_mseg.h +++ b/erts/emulator/sys/common/erl_mseg.h @@ -60,15 +60,19 @@ #define ERTS_MSEG_FLG_2POW ((Uint)(1 << 0)) -#define ERTS_MSEG_VSN_STR "0.10" +#define ERTS_MSEG_VSN_STR "0.9" typedef struct { + Uint amcbf; + Uint rmcbf; Uint mcs; Uint nos; } ErtsMsegInit_t; #define ERTS_MSEG_INIT_DEFAULT_INITIALIZER \ { \ + 4*1024*1024, /* amcbf: Absolute max cache bad fit */ \ + 20, /* rmcbf: Relative max cache bad fit */ \ 5, /* mcs: Max cache size */ \ 1000 /* cci: Cache check interval */ \ } |