Changeset 98000fb in mainline for kernel/generic/src/mm/frame.c
- Timestamp:
- 2009-06-03T19:34:45Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 301ff30
- Parents:
- 69e68e3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r69e68e3 r98000fb 68 68 mutex_t mem_avail_mtx; 69 69 condvar_t mem_avail_cv; 70 count_t mem_avail_req = 0; /**< Number of frames requested. */71 count_t mem_avail_gen = 0; /**< Generation counter. */70 size_t mem_avail_req = 0; /**< Number of frames requested. */ 71 size_t mem_avail_gen = 0; /**< Generation counter. */ 72 72 73 73 /********************/ … … 75 75 /********************/ 76 76 77 static inline index_t frame_index(zone_t *zone, frame_t *frame)78 { 79 return ( index_t) (frame - zone->frames);80 } 81 82 static inline index_t frame_index_abs(zone_t *zone, frame_t *frame)83 { 84 return ( index_t) (frame - zone->frames) + zone->base;85 } 86 87 static inline bool frame_index_valid(zone_t *zone, index_t index)77 static inline size_t frame_index(zone_t *zone, frame_t *frame) 78 { 79 return (size_t) (frame - zone->frames); 80 } 81 82 static inline size_t frame_index_abs(zone_t *zone, frame_t *frame) 83 { 84 return (size_t) (frame - zone->frames) + zone->base; 85 } 86 87 static inline bool frame_index_valid(zone_t *zone, size_t index) 88 88 { 89 89 return (index < zone->count); 90 90 } 91 91 92 static inline index_t make_frame_index(zone_t *zone, frame_t *frame)92 static inline size_t make_frame_index(zone_t *zone, frame_t *frame) 93 93 { 94 94 return (frame - zone->frames); … … 121 121 * 122 122 */ 123 static count_t zones_insert_zone(pfn_t base, count_t count)123 static size_t zones_insert_zone(pfn_t base, size_t count) 124 124 { 125 125 if (zones.count + 1 == ZONES_MAX) { 126 126 printf("Maximum zone count %u exceeded!\n", ZONES_MAX); 127 return ( count_t) -1;128 } 129 130 count_t i;127 return (size_t) -1; 128 } 129 130 size_t i; 131 131 for (i = 0; i < zones.count; i++) { 132 132 /* Check for overlap */ … … 134 134 zones.info[i].base, zones.info[i].count)) { 135 135 printf("Zones overlap!\n"); 136 return ( count_t) -1;136 return (size_t) -1; 137 137 } 138 138 if (base < zones.info[i].base) … … 141 141 142 142 /* Move other zones up */ 143 count_t j;143 size_t j; 144 144 for (j = zones.count; j > i; j--) { 145 145 zones.info[j] = zones.info[j - 1]; … … 162 162 */ 163 163 #ifdef CONFIG_DEBUG 164 static count_t total_frames_free(void)165 { 166 count_t total = 0;167 count_t i;164 static size_t total_frames_free(void) 165 { 166 size_t total = 0; 167 size_t i; 168 168 for (i = 0; i < zones.count; i++) 169 169 total += zones.info[i].free_count; … … 185 185 * 186 186 */ 187 count_t find_zone(pfn_t frame, count_t count, count_t hint)187 size_t find_zone(pfn_t frame, size_t count, size_t hint) 188 188 { 189 189 if (hint >= zones.count) 190 190 hint = 0; 191 191 192 count_t i = hint;192 size_t i = hint; 193 193 do { 194 194 if ((zones.info[i].base <= frame) … … 201 201 } while (i != hint); 202 202 203 return ( count_t) -1;203 return (size_t) -1; 204 204 } 205 205 … … 221 221 * 222 222 */ 223 static count_t find_free_zone(uint8_t order, zone_flags_t flags, count_t hint)223 static size_t find_free_zone(uint8_t order, zone_flags_t flags, size_t hint) 224 224 { 225 225 if (hint >= zones.count) 226 226 hint = 0; 227 227 228 count_t i = hint;228 size_t i = hint; 229 229 do { 230 230 /* … … 244 244 } while (i != hint); 245 245 246 return ( count_t) -1;246 return (size_t) -1; 247 247 } 248 248 … … 266 266 zone_t *zone = (zone_t *) buddy->data; 267 267 268 index_t index = frame_index(zone, frame);268 size_t index = frame_index(zone, frame); 269 269 do { 270 270 if (zone->frames[index].buddy_order != order) … … 292 292 bool is_left = IS_BUDDY_LEFT_BLOCK_ABS(zone, frame); 293 293 294 index_t index;294 size_t index; 295 295 if (is_left) { 296 296 index = (frame_index(zone, frame)) + … … 447 447 * 448 448 */ 449 static void zone_frame_free(zone_t *zone, index_t frame_idx)449 static void zone_frame_free(zone_t *zone, size_t frame_idx) 450 450 { 451 451 ASSERT(zone_flags_available(zone->flags)); … … 468 468 469 469 /** Return frame from zone. */ 470 static frame_t *zone_get_frame(zone_t *zone, index_t frame_idx)470 static frame_t *zone_get_frame(zone_t *zone, size_t frame_idx) 471 471 { 472 472 ASSERT(frame_idx < zone->count); … … 475 475 476 476 /** Mark frame in zone unavailable to allocation. */ 477 static void zone_mark_unavailable(zone_t *zone, index_t frame_idx)477 static void zone_mark_unavailable(zone_t *zone, size_t frame_idx) 478 478 { 479 479 ASSERT(zone_flags_available(zone->flags)); … … 504 504 * 505 505 */ 506 static void zone_merge_internal( count_t z1, count_t z2, zone_t *old_z1, buddy_system_t *buddy)506 static void zone_merge_internal(size_t z1, size_t z2, zone_t *old_z1, buddy_system_t *buddy) 507 507 { 508 508 ASSERT(zone_flags_available(zones.info[z1].flags)); … … 530 530 531 531 /* This marks all frames busy */ 532 count_t i;532 size_t i; 533 533 for (i = 0; i < zones.info[z1].count; i++) 534 534 frame_initialize(&zones.info[z1].frames[i]); … … 600 600 * 601 601 */ 602 static void return_config_frames( count_t znum, pfn_t pfn, count_t count)602 static void return_config_frames(size_t znum, pfn_t pfn, size_t count) 603 603 { 604 604 ASSERT(zone_flags_available(zones.info[znum].flags)); 605 605 606 count_t cframes = SIZE2FRAMES(zone_conf_size(count));606 size_t cframes = SIZE2FRAMES(zone_conf_size(count)); 607 607 608 608 if ((pfn < zones.info[znum].base) … … 615 615 ASSERT(!frame->buddy_order); 616 616 617 count_t i;617 size_t i; 618 618 for (i = 0; i < cframes; i++) { 619 619 zones.info[znum].busy_count++; … … 635 635 * 636 636 */ 637 static void zone_reduce_region( count_t znum, pfn_t frame_idx, count_t count)637 static void zone_reduce_region(size_t znum, pfn_t frame_idx, size_t count) 638 638 { 639 639 ASSERT(zone_flags_available(zones.info[znum].flags)); … … 641 641 642 642 uint8_t order = zones.info[znum].frames[frame_idx].buddy_order; 643 ASSERT(( count_t) (1 << order) >= count);643 ASSERT((size_t) (1 << order) >= count); 644 644 645 645 /* Reduce all blocks to order 0 */ 646 count_t i;647 for (i = 0; i < ( count_t) (1 << order); i++) {646 size_t i; 647 for (i = 0; i < (size_t) (1 << order); i++) { 648 648 frame_t *frame = &zones.info[znum].frames[i + frame_idx]; 649 649 frame->buddy_order = 0; … … 654 654 655 655 /* Free unneeded frames */ 656 for (i = count; i < ( count_t) (1 << order); i++)656 for (i = count; i < (size_t) (1 << order); i++) 657 657 zone_frame_free(&zones.info[znum], i + frame_idx); 658 658 } … … 671 671 * 672 672 */ 673 bool zone_merge( count_t z1, count_t z2)673 bool zone_merge(size_t z1, size_t z2) 674 674 { 675 675 ipl_t ipl = interrupts_disable(); … … 734 734 735 735 /* Move zones down */ 736 count_t i;736 size_t i; 737 737 for (i = z2 + 1; i < zones.count; i++) { 738 738 zones.info[i - 1] = zones.info[i]; … … 759 759 void zone_merge_all(void) 760 760 { 761 count_t i = 0;761 size_t i = 0; 762 762 while (i < zones.count) { 763 763 if (!zone_merge(i, i + 1)) … … 777 777 * 778 778 */ 779 static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start, count_t count, zone_flags_t flags)779 static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start, size_t count, zone_flags_t flags) 780 780 { 781 781 zone->base = start; … … 800 800 buddy_conf_size(order)); 801 801 802 count_t i;802 size_t i; 803 803 for (i = 0; i < count; i++) 804 804 frame_initialize(&zone->frames[i]); … … 820 820 * 821 821 */ 822 uintptr_t zone_conf_size( count_t count)822 uintptr_t zone_conf_size(size_t count) 823 823 { 824 824 return (count * sizeof(frame_t) + buddy_conf_size(fnzb(count))); … … 841 841 * 842 842 */ 843 count_t zone_create(pfn_t start, count_t count, pfn_t confframe, zone_flags_t flags)843 size_t zone_create(pfn_t start, size_t count, pfn_t confframe, zone_flags_t flags) 844 844 { 845 845 ipl_t ipl = interrupts_disable(); … … 856 856 * it does not span kernel & init 857 857 */ 858 count_t confcount = SIZE2FRAMES(zone_conf_size(count));858 size_t confcount = SIZE2FRAMES(zone_conf_size(count)); 859 859 if ((confframe >= start) && (confframe < start + count)) { 860 860 for (; confframe < start + count; confframe++) { … … 869 869 870 870 bool overlap = false; 871 count_t i;871 size_t i; 872 872 for (i = 0; i < init.cnt; i++) 873 873 if (overlaps(addr, PFN2ADDR(confcount), … … 887 887 } 888 888 889 count_t znum = zones_insert_zone(start, count);890 if (znum == ( count_t) -1) {889 size_t znum = zones_insert_zone(start, count); 890 if (znum == (size_t) -1) { 891 891 spinlock_unlock(&zones.lock); 892 892 interrupts_restore(ipl); 893 return ( count_t) -1;893 return (size_t) -1; 894 894 } 895 895 … … 899 899 /* If confdata in zone, mark as unavailable */ 900 900 if ((confframe >= start) && (confframe < start + count)) { 901 count_t i;901 size_t i; 902 902 for (i = confframe; i < confframe + confcount; i++) 903 903 zone_mark_unavailable(&zones.info[znum], … … 912 912 913 913 /* Non-available zone */ 914 count_t znum = zones_insert_zone(start, count);915 if (znum == ( count_t) -1) {914 size_t znum = zones_insert_zone(start, count); 915 if (znum == (size_t) -1) { 916 916 spinlock_unlock(&zones.lock); 917 917 interrupts_restore(ipl); 918 return ( count_t) -1;918 return (size_t) -1; 919 919 } 920 920 zone_construct(&zones.info[znum], NULL, start, count, flags); … … 931 931 932 932 /** Set parent of frame. */ 933 void frame_set_parent(pfn_t pfn, void *data, count_t hint)933 void frame_set_parent(pfn_t pfn, void *data, size_t hint) 934 934 { 935 935 ipl_t ipl = interrupts_disable(); 936 936 spinlock_lock(&zones.lock); 937 937 938 count_t znum = find_zone(pfn, 1, hint);939 940 ASSERT(znum != ( count_t) -1);938 size_t znum = find_zone(pfn, 1, hint); 939 940 ASSERT(znum != (size_t) -1); 941 941 942 942 zone_get_frame(&zones.info[znum], … … 947 947 } 948 948 949 void *frame_get_parent(pfn_t pfn, count_t hint)949 void *frame_get_parent(pfn_t pfn, size_t hint) 950 950 { 951 951 ipl_t ipl = interrupts_disable(); 952 952 spinlock_lock(&zones.lock); 953 953 954 count_t znum = find_zone(pfn, 1, hint);955 956 ASSERT(znum != ( count_t) -1);954 size_t znum = find_zone(pfn, 1, hint); 955 956 ASSERT(znum != (size_t) -1); 957 957 958 958 void *res = zone_get_frame(&zones.info[znum], … … 974 974 * 975 975 */ 976 void *frame_alloc_generic(uint8_t order, frame_flags_t flags, count_t *pzone)977 { 978 count_t size = ((count_t) 1) << order;976 void *frame_alloc_generic(uint8_t order, frame_flags_t flags, size_t *pzone) 977 { 978 size_t size = ((size_t) 1) << order; 979 979 ipl_t ipl; 980 count_t hint = pzone ? (*pzone) : 0;980 size_t hint = pzone ? (*pzone) : 0; 981 981 982 982 loop: … … 987 987 * First, find suitable frame zone. 988 988 */ 989 count_t znum = find_free_zone(order,989 size_t znum = find_free_zone(order, 990 990 FRAME_TO_ZONE_FLAGS(flags), hint); 991 991 992 992 /* If no memory, reclaim some slab memory, 993 993 if it does not help, reclaim all */ 994 if ((znum == ( count_t) -1) && (!(flags & FRAME_NO_RECLAIM))) {994 if ((znum == (size_t) -1) && (!(flags & FRAME_NO_RECLAIM))) { 995 995 spinlock_unlock(&zones.lock); 996 996 interrupts_restore(ipl); 997 997 998 count_t freed = slab_reclaim(0);998 size_t freed = slab_reclaim(0); 999 999 1000 1000 ipl = interrupts_disable(); … … 1005 1005 FRAME_TO_ZONE_FLAGS(flags), hint); 1006 1006 1007 if (znum == ( count_t) -1) {1007 if (znum == (size_t) -1) { 1008 1008 spinlock_unlock(&zones.lock); 1009 1009 interrupts_restore(ipl); … … 1020 1020 } 1021 1021 1022 if (znum == ( count_t) -1) {1022 if (znum == (size_t) -1) { 1023 1023 if (flags & FRAME_ATOMIC) { 1024 1024 spinlock_unlock(&zones.lock); … … 1028 1028 1029 1029 #ifdef CONFIG_DEBUG 1030 count_t avail = total_frames_free();1030 size_t avail = total_frames_free(); 1031 1031 #endif 1032 1032 … … 1039 1039 1040 1040 #ifdef CONFIG_DEBUG 1041 printf("Thread %" PRIu64 " waiting for %" PRI c" frames, "1042 "%" PRI c" available.\n", THREAD->tid, size, avail);1041 printf("Thread %" PRIu64 " waiting for %" PRIs " frames, " 1042 "%" PRIs " available.\n", THREAD->tid, size, avail); 1043 1043 #endif 1044 1044 … … 1049 1049 else 1050 1050 mem_avail_req = size; 1051 count_t gen = mem_avail_gen;1051 size_t gen = mem_avail_gen; 1052 1052 1053 1053 while (gen == mem_avail_gen) … … 1096 1096 */ 1097 1097 pfn_t pfn = ADDR2PFN(frame); 1098 count_t znum = find_zone(pfn, 1, NULL);1099 1100 ASSERT(znum != ( count_t) -1);1098 size_t znum = find_zone(pfn, 1, NULL); 1099 1100 ASSERT(znum != (size_t) -1); 1101 1101 1102 1102 zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base); … … 1135 1135 * First, find host frame zone for addr. 1136 1136 */ 1137 count_t znum = find_zone(pfn, 1, NULL);1138 1139 ASSERT(znum != ( count_t) -1);1137 size_t znum = find_zone(pfn, 1, NULL); 1138 1139 ASSERT(znum != (size_t) -1); 1140 1140 1141 1141 zones.info[znum].frames[pfn - zones.info[znum].base].refcount++; … … 1146 1146 1147 1147 /** Mark given range unavailable in frame zones. */ 1148 void frame_mark_unavailable(pfn_t start, count_t count)1148 void frame_mark_unavailable(pfn_t start, size_t count) 1149 1149 { 1150 1150 ipl_t ipl = interrupts_disable(); 1151 1151 spinlock_lock(&zones.lock); 1152 1152 1153 count_t i;1153 size_t i; 1154 1154 for (i = 0; i < count; i++) { 1155 count_t znum = find_zone(start + i, 1, 0);1156 if (znum == ( count_t) -1) /* PFN not found */1155 size_t znum = find_zone(start + i, 1, 0); 1156 if (znum == (size_t) -1) /* PFN not found */ 1157 1157 continue; 1158 1158 … … 1183 1183 SIZE2FRAMES(config.stack_size)); 1184 1184 1185 count_t i;1185 size_t i; 1186 1186 for (i = 0; i < init.cnt; i++) { 1187 1187 pfn_t pfn = ADDR2PFN(KA2PA(init.tasks[i].addr)); … … 1208 1208 1209 1209 uint64_t total = 0; 1210 count_t i;1210 size_t i; 1211 1211 for (i = 0; i < zones.count; i++) 1212 1212 total += (uint64_t) FRAMES2SIZE(zones.info[i].count); … … 1242 1242 */ 1243 1243 1244 count_t i;1244 size_t i; 1245 1245 for (i = 0;; i++) { 1246 1246 ipl_t ipl = interrupts_disable(); … … 1254 1254 1255 1255 uintptr_t base = PFN2ADDR(zones.info[i].base); 1256 count_t count = zones.info[i].count;1256 size_t count = zones.info[i].count; 1257 1257 zone_flags_t flags = zones.info[i].flags; 1258 count_t free_count = zones.info[i].free_count;1259 count_t busy_count = zones.info[i].busy_count;1258 size_t free_count = zones.info[i].free_count; 1259 size_t busy_count = zones.info[i].busy_count; 1260 1260 1261 1261 spinlock_unlock(&zones.lock); … … 1264 1264 bool available = zone_flags_available(flags); 1265 1265 1266 printf("%-2" PRI c, i);1266 printf("%-2" PRIs, i); 1267 1267 1268 1268 #ifdef __32_BITS__ … … 1274 1274 #endif 1275 1275 1276 printf(" %12" PRI c" %c%c%c ", count,1276 printf(" %12" PRIs " %c%c%c ", count, 1277 1277 available ? 'A' : ' ', 1278 1278 (flags & ZONE_RESERVED) ? 'R' : ' ', … … 1280 1280 1281 1281 if (available) 1282 printf("%12" PRI c " %12" PRIc,1282 printf("%12" PRIs " %12" PRIs, 1283 1283 free_count, busy_count); 1284 1284 … … 1292 1292 * 1293 1293 */ 1294 void zone_print_one( count_t num)1294 void zone_print_one(size_t num) 1295 1295 { 1296 1296 ipl_t ipl = interrupts_disable(); 1297 1297 spinlock_lock(&zones.lock); 1298 count_t znum = (count_t) -1;1299 1300 count_t i;1298 size_t znum = (size_t) -1; 1299 1300 size_t i; 1301 1301 for (i = 0; i < zones.count; i++) { 1302 1302 if ((i == num) || (PFN2ADDR(zones.info[i].base) == num)) { … … 1306 1306 } 1307 1307 1308 if (znum == ( count_t) -1) {1308 if (znum == (size_t) -1) { 1309 1309 spinlock_unlock(&zones.lock); 1310 1310 interrupts_restore(ipl); … … 1315 1315 uintptr_t base = PFN2ADDR(zones.info[i].base); 1316 1316 zone_flags_t flags = zones.info[i].flags; 1317 count_t count = zones.info[i].count;1318 count_t free_count = zones.info[i].free_count;1319 count_t busy_count = zones.info[i].busy_count;1317 size_t count = zones.info[i].count; 1318 size_t free_count = zones.info[i].free_count; 1319 size_t busy_count = zones.info[i].busy_count; 1320 1320 1321 1321 spinlock_unlock(&zones.lock); … … 1324 1324 bool available = zone_flags_available(flags); 1325 1325 1326 printf("Zone number: %" PRI c"\n", znum);1326 printf("Zone number: %" PRIs "\n", znum); 1327 1327 printf("Zone base address: %p\n", base); 1328 printf("Zone size: %" PRI c" frames (%" PRIs " KiB)\n", count,1328 printf("Zone size: %" PRIs " frames (%" PRIs " KiB)\n", count, 1329 1329 SIZE2KB(FRAMES2SIZE(count))); 1330 1330 printf("Zone flags: %c%c%c\n", … … 1334 1334 1335 1335 if (available) { 1336 printf("Allocated space: %" PRI c" frames (%" PRIs " KiB)\n",1336 printf("Allocated space: %" PRIs " frames (%" PRIs " KiB)\n", 1337 1337 busy_count, SIZE2KB(FRAMES2SIZE(busy_count))); 1338 printf("Available space: %" PRI c" frames (%" PRIs " KiB)\n",1338 printf("Available space: %" PRIs " frames (%" PRIs " KiB)\n", 1339 1339 free_count, SIZE2KB(FRAMES2SIZE(free_count))); 1340 1340 }
Note:
See TracChangeset
for help on using the changeset viewer.