aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--erts/emulator/beam/erl_alloc.c17
-rw-r--r--erts/emulator/sys/common/erl_mseg.c18
-rw-r--r--erts/emulator/sys/common/erl_mseg.h6
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 */ \
}