|
@@ -0,0 +1,53 @@
|
|
|
+#include "dmm_adaptor.h"
|
|
|
+#include "heap.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) {
|
|
|
+ default :
|
|
|
+ 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;
|
|
|
+ break;
|
|
|
+ case 2 :
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 40;
|
|
|
+ heap->dmm_knobs.min_split_size = 800;
|
|
|
+ heap->dmm_knobs.empty_threshold = 1000;
|
|
|
+ break;
|
|
|
+ case 3 :
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 60;
|
|
|
+ heap->dmm_knobs.min_split_size = 1200;
|
|
|
+ heap->dmm_knobs.empty_threshold = 800;
|
|
|
+ break;
|
|
|
+ case 4 :
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 80;
|
|
|
+ heap->dmm_knobs.min_split_size = 1600;
|
|
|
+ heap->dmm_knobs.empty_threshold = 600;
|
|
|
+ break;
|
|
|
+ case 5 :
|
|
|
+ heap->dmm_knobs.max_coalesce_size = 100;
|
|
|
+ heap->dmm_knobs.min_split_size = 2000;
|
|
|
+ heap->dmm_knobs.empty_threshold = 300;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|