|
@@ -1,51 +1,111 @@
|
|
|
#include "dmm_adaptor.h"
|
|
|
|
|
|
-void state_refresh(heap_t *heap) {
|
|
|
- float fragmentation;
|
|
|
- knob_state_t state;
|
|
|
-
|
|
|
- fragmentation = (float) heap->dmm_stats.mem_allocated /
|
|
|
- (float) heap->dmm_stats.mem_requested - 1.0;
|
|
|
-
|
|
|
- // TODO Constant for the threshold, contraints for the memory threshold
|
|
|
- if(fragmentation <= 0.05) {
|
|
|
- state = 0;
|
|
|
- set_fragmentation_params(heap, state);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void set_fragmentation_params(heap_t *heap, knob_state_t state) {
|
|
|
- switch(state) {
|
|
|
+void update_frag_params(heap_t *heap) {
|
|
|
+ switch(heap->dmm_knobs.frag_state) {
|
|
|
default :
|
|
|
+ heap->dmm_knobs.percentage = 0;
|
|
|
heap->dmm_knobs.max_coalesce_size = -1;
|
|
|
heap->dmm_knobs.min_split_size = 0;
|
|
|
heap->dmm_knobs.empty_threshold = 1.5;
|
|
|
break;
|
|
|
case 1 :
|
|
|
- heap->dmm_knobs.max_coalesce_size = 20;
|
|
|
- heap->dmm_knobs.min_split_size = 400;
|
|
|
- heap->dmm_knobs.empty_threshold = 1200;
|
|
|
+ heap->dmm_knobs.percentage = 20;
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 400;
|
|
|
+ heap->dmm_knobs.min_split_size = 1200;
|
|
|
break;
|
|
|
case 2 :
|
|
|
- heap->dmm_knobs.max_coalesce_size = 40;
|
|
|
+ heap->dmm_knobs.percentage = 40;
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 800;
|
|
|
+ heap->dmm_knobs.min_split_size = 1000;
|
|
|
+ break;
|
|
|
+ case 3 :
|
|
|
+ heap->dmm_knobs.percentage = 60;
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 1200;
|
|
|
heap->dmm_knobs.min_split_size = 800;
|
|
|
- heap->dmm_knobs.empty_threshold = 1000;
|
|
|
+ break;
|
|
|
+ case 4 :
|
|
|
+ heap->dmm_knobs.percentage = 80;
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 1600;
|
|
|
+ heap->dmm_knobs.min_split_size = 600;
|
|
|
+ break;
|
|
|
+ case 5 :
|
|
|
+ heap->dmm_knobs.percentage = 100;
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 2000;
|
|
|
+ heap->dmm_knobs.min_split_size = 300;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void update_foot_params(heap_t *heap) {
|
|
|
+ switch(heap->dmm_knobs.foot_state) {
|
|
|
+ default :
|
|
|
+ heap->dmm_knobs.empty_threshold = 0.8;
|
|
|
+ break;
|
|
|
+ case 2 :
|
|
|
+ heap->dmm_knobs.empty_threshold = 0.6;
|
|
|
break;
|
|
|
case 3 :
|
|
|
- heap->dmm_knobs.max_coalesce_size = 60;
|
|
|
- heap->dmm_knobs.min_split_size = 1200;
|
|
|
- heap->dmm_knobs.empty_threshold = 800;
|
|
|
+ heap->dmm_knobs.empty_threshold = 0.4;
|
|
|
break;
|
|
|
case 4 :
|
|
|
- heap->dmm_knobs.max_coalesce_size = 80;
|
|
|
- heap->dmm_knobs.min_split_size = 1600;
|
|
|
- heap->dmm_knobs.empty_threshold = 600;
|
|
|
+ heap->dmm_knobs.empty_threshold = 0.2;
|
|
|
break;
|
|
|
case 5 :
|
|
|
- heap->dmm_knobs.max_coalesce_size = 100;
|
|
|
- heap->dmm_knobs.min_split_size = 2000;
|
|
|
- heap->dmm_knobs.empty_threshold = 300;
|
|
|
+ heap->dmm_knobs.empty_threshold = 0.0;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+float get_current_fragmentation(heap_t *heap) {
|
|
|
+ float fragmentation;
|
|
|
+
|
|
|
+ fragmentation = (float) heap->dmm_stats.mem_allocated /
|
|
|
+ (float) heap->dmm_stats.mem_requested - 1.0;
|
|
|
+
|
|
|
+ if(fragmentation <= MIN_FRAG_THRESHOLD &&
|
|
|
+ heap->dmm_stats.mem_reserved < heap->dmm_knobs.mem_threshold) {
|
|
|
+ heap->dmm_knobs.frag_state = 0;
|
|
|
+ heap->dmm_knobs.foot_state = 0;
|
|
|
+ update_frag_params(heap);
|
|
|
+ }
|
|
|
+
|
|
|
+ return fragmentation;
|
|
|
+}
|
|
|
+
|
|
|
+void check_footprint(heap_t *heap) {
|
|
|
+ if(heap->dmm_stats.mem_allocated > heap->dmm_knobs.mem_threshold) {
|
|
|
+ if(heap->dmm_knobs.frag_state > heap->dmm_knobs.foot_state) {
|
|
|
+ heap->dmm_knobs.foot_state = heap->dmm_knobs.frag_state;
|
|
|
+ } else {
|
|
|
+ heap->dmm_knobs.foot_state++;
|
|
|
+ }
|
|
|
+ update_foot_params(heap);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void malloc_state_refresh(heap_t *heap) {
|
|
|
+ float fragmentation;
|
|
|
+
|
|
|
+ fragmentation = get_current_fragmentation(heap);
|
|
|
+
|
|
|
+ /* Check fragmentation */
|
|
|
+ if(fragmentation >= heap->dmm_knobs.frag_threshold &&
|
|
|
+ heap->dmm_stats.mem_requested != 0) {
|
|
|
+ if(heap->dmm_knobs.foot_state > heap->dmm_knobs.frag_state) {
|
|
|
+ heap->dmm_knobs.frag_state = heap->dmm_knobs.foot_state;
|
|
|
+ } else {
|
|
|
+ heap->dmm_knobs.frag_state++;
|
|
|
+ }
|
|
|
+ update_frag_params(heap);
|
|
|
+ }
|
|
|
+
|
|
|
+ check_footprint(heap);
|
|
|
+}
|
|
|
+
|
|
|
+void free_state_refresh(heap_t *heap) {
|
|
|
+ float fragmentation;
|
|
|
+
|
|
|
+ fragmentation = get_current_fragmentation(heap);
|
|
|
+
|
|
|
+ check_footprint(heap);
|
|
|
+}
|