dmm_adaptor.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright 2011 Institute of Communication and Computer Systems (ICCS)
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. *
  16. */
  17. #include "dmm_adaptor.h"
  18. void update_frag_params(heap_t *heap) {
  19. switch(heap->dmm_knobs.frag_state) {
  20. default :
  21. heap->dmm_knobs.percentage = 0;
  22. heap->dmm_knobs.max_coalesce_size = (size_t) -1;
  23. heap->dmm_knobs.min_split_size = 0;
  24. heap->dmm_knobs.empty_threshold = 1.5;
  25. break;
  26. case 1 :
  27. heap->dmm_knobs.percentage = 20;
  28. heap->dmm_knobs.max_coalesce_size = 400;
  29. heap->dmm_knobs.min_split_size = 1200;
  30. break;
  31. case 2 :
  32. heap->dmm_knobs.percentage = 40;
  33. heap->dmm_knobs.max_coalesce_size = 800;
  34. heap->dmm_knobs.min_split_size = 1000;
  35. break;
  36. case 3 :
  37. heap->dmm_knobs.percentage = 60;
  38. heap->dmm_knobs.max_coalesce_size = 1200;
  39. heap->dmm_knobs.min_split_size = 800;
  40. break;
  41. case 4 :
  42. heap->dmm_knobs.percentage = 80;
  43. heap->dmm_knobs.max_coalesce_size = 1600;
  44. heap->dmm_knobs.min_split_size = 600;
  45. break;
  46. case 5 :
  47. heap->dmm_knobs.percentage = 100;
  48. heap->dmm_knobs.max_coalesce_size = 2000;
  49. heap->dmm_knobs.min_split_size = 300;
  50. break;
  51. }
  52. }
  53. void update_foot_params(heap_t *heap) {
  54. switch(heap->dmm_knobs.foot_state) {
  55. default :
  56. heap->dmm_knobs.empty_threshold = 0.8f;
  57. break;
  58. case 2 :
  59. heap->dmm_knobs.empty_threshold = 0.6f;
  60. break;
  61. case 3 :
  62. heap->dmm_knobs.empty_threshold = 0.4f;
  63. break;
  64. case 4 :
  65. heap->dmm_knobs.empty_threshold = 0.2f;
  66. break;
  67. case 5 :
  68. heap->dmm_knobs.empty_threshold = 0.0f;
  69. break;
  70. }
  71. }
  72. float get_current_fragmentation(heap_t *heap) {
  73. float fragmentation;
  74. fragmentation = (float) heap->dmm_stats.mem_allocated /
  75. (float) heap->dmm_stats.mem_requested - 1.0f;
  76. if(fragmentation <= MIN_FRAG_THRESHOLD &&
  77. heap->dmm_stats.mem_allocated < heap->dmm_knobs.mem_threshold) {
  78. heap->dmm_knobs.frag_state = 0;
  79. heap->dmm_knobs.foot_state = 0;
  80. update_frag_params(heap);
  81. }
  82. return fragmentation;
  83. }
  84. void check_footprint(heap_t *heap) {
  85. if(heap->dmm_stats.mem_allocated > heap->dmm_knobs.mem_threshold) {
  86. if(heap->dmm_knobs.frag_state > heap->dmm_knobs.foot_state) {
  87. heap->dmm_knobs.foot_state = heap->dmm_knobs.frag_state;
  88. } else {
  89. heap->dmm_knobs.foot_state++;
  90. }
  91. update_foot_params(heap);
  92. }
  93. }
  94. void malloc_state_refresh(heap_t *heap) {
  95. float fragmentation;
  96. fragmentation = get_current_fragmentation(heap);
  97. /* Check fragmentation */
  98. if(fragmentation >= heap->dmm_knobs.frag_threshold &&
  99. heap->dmm_stats.mem_requested != 0) {
  100. if(heap->dmm_knobs.foot_state > heap->dmm_knobs.frag_state) {
  101. heap->dmm_knobs.frag_state = heap->dmm_knobs.foot_state;
  102. } else {
  103. heap->dmm_knobs.frag_state++;
  104. }
  105. update_frag_params(heap);
  106. }
  107. check_footprint(heap);
  108. }
  109. void free_state_refresh(heap_t *heap) {
  110. float fragmentation;
  111. fragmentation = get_current_fragmentation(heap);
  112. check_footprint(heap);
  113. }