Changes in kernel/generic/src/mm/frame.c [7e752b2:864b0dd] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r7e752b2 r864b0dd 45 45 #include <typedefs.h> 46 46 #include <mm/frame.h> 47 #include <mm/reserve.h> 47 48 #include <mm/as.h> 48 49 #include <panic.h> … … 472 473 * @param frame_idx Frame index relative to zone. 473 474 * 474 */ 475 NO_TRACE static void zone_frame_free(zone_t *zone, size_t frame_idx) 475 * @return Number of freed frames. 476 * 477 */ 478 NO_TRACE static size_t zone_frame_free(zone_t *zone, size_t frame_idx) 476 479 { 477 480 ASSERT(zone_flags_available(zone->flags)); 478 481 479 482 frame_t *frame = &zone->frames[frame_idx]; 480 481 /* Remember frame order */ 482 uint8_t order = frame->buddy_order; 483 size_t size = 0; 483 484 484 485 ASSERT(frame->refcount); 485 486 486 487 if (!--frame->refcount) { 487 buddy_system_free(zone->buddy_system, &frame->buddy_link);488 488 size = 1 << frame->buddy_order; 489 buddy_system_free(zone->buddy_system, &frame->buddy_link); 489 490 /* Update zone information. */ 490 zone->free_count += (1 << order); 491 zone->busy_count -= (1 << order); 492 } 491 zone->free_count += size; 492 zone->busy_count -= size; 493 } 494 495 return size; 493 496 } 494 497 … … 516 519 ASSERT(link); 517 520 zone->free_count--; 521 reserve_force_alloc(1); 518 522 } 519 523 … … 645 649 for (i = 0; i < cframes; i++) { 646 650 zones.info[znum].busy_count++; 647 zone_frame_free(&zones.info[znum],651 (void) zone_frame_free(&zones.info[znum], 648 652 pfn - zones.info[znum].base + i); 649 653 } … … 683 687 /* Free unneeded frames */ 684 688 for (i = count; i < (size_t) (1 << order); i++) 685 zone_frame_free(&zones.info[znum], i + frame_idx);689 (void) zone_frame_free(&zones.info[znum], i + frame_idx); 686 690 } 687 691 … … 695 699 * not to be 2^order size. Once the allocator is running it is no longer 696 700 * possible, merged configuration data occupies more space :-/ 697 *698 * The function uses699 701 * 700 702 */ … … 837 839 buddy_system_free(zone->buddy_system, &zone->frames[i].buddy_link); 838 840 } 841 842 /* "Unreserve" new frames. */ 843 reserve_free(count); 839 844 } else 840 845 zone->frames = NULL; … … 999 1004 size_t hint = pzone ? (*pzone) : 0; 1000 1005 1006 /* 1007 * If not told otherwise, we must first reserve the memory. 1008 */ 1009 if (!(flags & FRAME_NO_RESERVE)) 1010 reserve_force_alloc(size); 1011 1001 1012 loop: 1002 1013 irq_spinlock_lock(&zones.lock, true); … … 1033 1044 if (flags & FRAME_ATOMIC) { 1034 1045 irq_spinlock_unlock(&zones.lock, true); 1046 if (!(flags & FRAME_NO_RESERVE)) 1047 reserve_free(size); 1035 1048 return NULL; 1036 1049 } … … 1088 1101 } 1089 1102 1103 void *frame_alloc(uint8_t order, frame_flags_t flags) 1104 { 1105 return frame_alloc_generic(order, flags, NULL); 1106 } 1107 1108 void *frame_alloc_noreserve(uint8_t order, frame_flags_t flags) 1109 { 1110 return frame_alloc_generic(order, flags | FRAME_NO_RESERVE, NULL); 1111 } 1112 1090 1113 /** Free a frame. 1091 1114 * … … 1095 1118 * 1096 1119 * @param frame Physical Address of of the frame to be freed. 1097 * 1098 */ 1099 void frame_free(uintptr_t frame) 1100 { 1120 * @param flags Flags to control memory reservation. 1121 * 1122 */ 1123 void frame_free_generic(uintptr_t frame, frame_flags_t flags) 1124 { 1125 size_t size; 1126 1101 1127 irq_spinlock_lock(&zones.lock, true); 1102 1128 … … 1106 1132 pfn_t pfn = ADDR2PFN(frame); 1107 1133 size_t znum = find_zone(pfn, 1, 0); 1134 1108 1135 1109 1136 ASSERT(znum != (size_t) -1); 1110 1137 1111 zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);1138 size = zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base); 1112 1139 1113 1140 irq_spinlock_unlock(&zones.lock, true); … … 1118 1145 mutex_lock(&mem_avail_mtx); 1119 1146 if (mem_avail_req > 0) 1120 mem_avail_req --;1147 mem_avail_req -= min(mem_avail_req, size); 1121 1148 1122 1149 if (mem_avail_req == 0) { … … 1125 1152 } 1126 1153 mutex_unlock(&mem_avail_mtx); 1154 1155 if (!(flags & FRAME_NO_RESERVE)) 1156 reserve_free(size); 1157 } 1158 1159 void frame_free(uintptr_t frame) 1160 { 1161 frame_free_generic(frame, 0); 1162 } 1163 1164 void frame_free_noreserve(uintptr_t frame) 1165 { 1166 frame_free_generic(frame, FRAME_NO_RESERVE); 1127 1167 } 1128 1168
Note:
See TracChangeset
for help on using the changeset viewer.