dmm_adaptor.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "dmm_adaptor.h"
  2. void update_frag_params(heap_t *heap) {
  3. switch(heap->dmm_knobs.frag_state) {
  4. default :
  5. heap->dmm_knobs.percentage = 0;
  6. heap->dmm_knobs.max_coalesce_size = -1;
  7. heap->dmm_knobs.min_split_size = 0;
  8. heap->dmm_knobs.empty_threshold = 1.5;
  9. break;
  10. case 1 :
  11. heap->dmm_knobs.percentage = 20;
  12. heap->dmm_knobs.max_coalesce_size = 400;
  13. heap->dmm_knobs.min_split_size = 1200;
  14. break;
  15. case 2 :
  16. heap->dmm_knobs.percentage = 40;
  17. heap->dmm_knobs.max_coalesce_size = 800;
  18. heap->dmm_knobs.min_split_size = 1000;
  19. break;
  20. case 3 :
  21. heap->dmm_knobs.percentage = 60;
  22. heap->dmm_knobs.max_coalesce_size = 1200;
  23. heap->dmm_knobs.min_split_size = 800;
  24. break;
  25. case 4 :
  26. heap->dmm_knobs.percentage = 80;
  27. heap->dmm_knobs.max_coalesce_size = 1600;
  28. heap->dmm_knobs.min_split_size = 600;
  29. break;
  30. case 5 :
  31. heap->dmm_knobs.percentage = 100;
  32. heap->dmm_knobs.max_coalesce_size = 2000;
  33. heap->dmm_knobs.min_split_size = 300;
  34. break;
  35. }
  36. }
  37. void update_foot_params(heap_t *heap) {
  38. switch(heap->dmm_knobs.foot_state) {
  39. default :
  40. heap->dmm_knobs.empty_threshold = 0.8;
  41. break;
  42. case 2 :
  43. heap->dmm_knobs.empty_threshold = 0.6;
  44. break;
  45. case 3 :
  46. heap->dmm_knobs.empty_threshold = 0.4;
  47. break;
  48. case 4 :
  49. heap->dmm_knobs.empty_threshold = 0.2;
  50. break;
  51. case 5 :
  52. heap->dmm_knobs.empty_threshold = 0.0;
  53. break;
  54. }
  55. }
  56. float get_current_fragmentation(heap_t *heap) {
  57. float fragmentation;
  58. fragmentation = (float) heap->dmm_stats.mem_allocated /
  59. (float) heap->dmm_stats.mem_requested - 1.0;
  60. if(fragmentation <= MIN_FRAG_THRESHOLD &&
  61. heap->dmm_stats.mem_reserved < heap->dmm_knobs.mem_threshold) {
  62. heap->dmm_knobs.frag_state = 0;
  63. heap->dmm_knobs.foot_state = 0;
  64. update_frag_params(heap);
  65. }
  66. return fragmentation;
  67. }
  68. void check_footprint(heap_t *heap) {
  69. if(heap->dmm_stats.mem_allocated > heap->dmm_knobs.mem_threshold) {
  70. if(heap->dmm_knobs.frag_state > heap->dmm_knobs.foot_state) {
  71. heap->dmm_knobs.foot_state = heap->dmm_knobs.frag_state;
  72. } else {
  73. heap->dmm_knobs.foot_state++;
  74. }
  75. update_foot_params(heap);
  76. }
  77. }
  78. void malloc_state_refresh(heap_t *heap) {
  79. float fragmentation;
  80. fragmentation = get_current_fragmentation(heap);
  81. /* Check fragmentation */
  82. if(fragmentation >= heap->dmm_knobs.frag_threshold &&
  83. heap->dmm_stats.mem_requested != 0) {
  84. if(heap->dmm_knobs.foot_state > heap->dmm_knobs.frag_state) {
  85. heap->dmm_knobs.frag_state = heap->dmm_knobs.foot_state;
  86. } else {
  87. heap->dmm_knobs.frag_state++;
  88. }
  89. update_frag_params(heap);
  90. }
  91. check_footprint(heap);
  92. }
  93. void free_state_refresh(heap_t *heap) {
  94. float fragmentation;
  95. fragmentation = get_current_fragmentation(heap);
  96. check_footprint(heap);
  97. }