Changeset e49e234 in mainline for kernel/generic/src/mm/frame.c
- Timestamp:
- 2009-02-27T11:32:31Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c1f7f6ea
- Parents:
- 5f0f29ce
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r5f0f29ce re49e234 49 49 #include <debug.h> 50 50 #include <adt/list.h> 51 #include <synch/spinlock.h>52 51 #include <synch/mutex.h> 53 52 #include <synch/condvar.h> … … 61 60 #include <config.h> 62 61 63 typedef struct { 64 count_t refcount; /**< Tracking of shared frames */ 65 uint8_t buddy_order; /**< Buddy system block order */ 66 link_t buddy_link; /**< Link to the next free block inside 67 one order */ 68 void *parent; /**< If allocated by slab, this points there */ 69 } frame_t; 70 71 typedef struct { 72 pfn_t base; /**< Frame_no of the first frame 73 in the frames array */ 74 count_t count; /**< Size of zone */ 75 count_t free_count; /**< Number of free frame_t 76 structures */ 77 count_t busy_count; /**< Number of busy frame_t 78 structures */ 79 zone_flags_t flags; /**< Type of the zone */ 80 81 frame_t *frames; /**< Array of frame_t structures 82 in this zone */ 83 buddy_system_t *buddy_system; /**< Buddy system for the zone */ 84 } zone_t; 85 86 /* 87 * The zoneinfo.lock must be locked when accessing zoneinfo structure. 88 * Some of the attributes in zone_t structures are 'read-only' 89 */ 90 typedef struct { 91 SPINLOCK_DECLARE(lock); 92 count_t count; 93 zone_t info[ZONES_MAX]; 94 } zones_t; 95 96 static zones_t zones; 62 zones_t zones; 97 63 98 64 /* … … 127 93 { 128 94 return (frame - zone->frames); 129 }130 131 static inline bool zone_flags_available(zone_flags_t flags)132 {133 return ((flags & (ZONE_RESERVED | ZONE_FIRMWARE)) == 0);134 95 } 135 96 … … 181 142 /* Move other zones up */ 182 143 count_t j; 183 for (j = i; j < zones.count; j++) 184 zones.info[j + 1] = zones.info[j]; 144 for (j = zones.count; j > i; j--) { 145 zones.info[j] = zones.info[j - 1]; 146 zones.info[j].buddy_system->data = 147 (void *) &zones.info[j - 1]; 148 } 185 149 186 150 zones.count++; … … 207 171 } 208 172 209 /** Find a zone with a given frame .173 /** Find a zone with a given frames. 210 174 * 211 175 * Assume interrupts are disabled and zones lock is … … 213 177 * 214 178 * @param frame Frame number contained in zone. 179 * @param count Number of frames to look for. 215 180 * @param hint Used as zone hint. 216 181 * … … 218 183 * 219 184 */ 220 static count_t find_zone(pfn_t frame, count_t hint)185 count_t find_zone(pfn_t frame, count_t count, count_t hint) 221 186 { 222 187 if (hint >= zones.count) … … 226 191 do { 227 192 if ((zones.info[i].base <= frame) 228 && (zones.info[i].base + zones.info[i].count > frame))193 && (zones.info[i].base + zones.info[i].count >= frame + count)) 229 194 return i; 230 195 … … 766 731 zones.info[z2].count); 767 732 768 /* Shift existing zones*/733 /* Move zones down */ 769 734 count_t i; 770 for (i = z2 + 1; i < zones.count; i++) 735 for (i = z2 + 1; i < zones.count; i++) { 771 736 zones.info[i - 1] = zones.info[i]; 737 zones.info[i - 1].buddy_system->data = 738 (void *) &zones.info[i - 1]; 739 } 740 772 741 zones.count--; 773 742 … … 965 934 spinlock_lock(&zones.lock); 966 935 967 count_t znum = find_zone(pfn, hint);936 count_t znum = find_zone(pfn, 1, hint); 968 937 969 938 ASSERT(znum != (count_t) -1); … … 981 950 spinlock_lock(&zones.lock); 982 951 983 count_t znum = find_zone(pfn, hint);952 count_t znum = find_zone(pfn, 1, hint); 984 953 985 954 ASSERT(znum != (count_t) -1); … … 1112 1081 */ 1113 1082 pfn_t pfn = ADDR2PFN(frame); 1114 count_t znum = find_zone(pfn, NULL);1083 count_t znum = find_zone(pfn, 1, NULL); 1115 1084 1116 1085 ASSERT(znum != (count_t) -1); … … 1151 1120 * First, find host frame zone for addr. 1152 1121 */ 1153 count_t znum = find_zone(pfn, NULL);1122 count_t znum = find_zone(pfn, 1, NULL); 1154 1123 1155 1124 ASSERT(znum != (count_t) -1); … … 1169 1138 count_t i; 1170 1139 for (i = 0; i < count; i++) { 1171 count_t znum = find_zone(start + i, 0);1140 count_t znum = find_zone(start + i, 1, 0); 1172 1141 if (znum == (count_t) -1) /* PFN not found */ 1173 1142 continue; … … 1238 1207 { 1239 1208 #ifdef __32_BITS__ 1240 printf("# base address f lags free frames busy frames\n");1241 printf("-- ------------ -------- ------------ ------------\n");1209 printf("# base address frames flags free frames busy frames\n"); 1210 printf("-- ------------ ------------ -------- ------------ ------------\n"); 1242 1211 #endif 1243 1212 1244 1213 #ifdef __64_BITS__ 1245 printf("# base address flags free frames busy frames\n");1246 printf("-- -------------------- -------- ------------ ------------\n");1214 printf("# base address frames flags free frames busy frames\n"); 1215 printf("-- -------------------- ------------ -------- ------------ ------------\n"); 1247 1216 #endif 1248 1217 … … 1270 1239 1271 1240 uintptr_t base = PFN2ADDR(zones.info[i].base); 1241 count_t count = zones.info[i].count; 1272 1242 zone_flags_t flags = zones.info[i].flags; 1273 1243 count_t free_count = zones.info[i].free_count; … … 1279 1249 bool available = zone_flags_available(flags); 1280 1250 1251 printf("%-2" PRIc, i); 1252 1281 1253 #ifdef __32_BITS__ 1282 printf("%-2" PRIc " %10p %c%c%c ", i, base, 1254 printf(" %10p", base); 1255 #endif 1256 1257 #ifdef __64_BITS__ 1258 printf(" %18p", base); 1259 #endif 1260 1261 printf(" %12" PRIc " %c%c%c ", count, 1283 1262 available ? 'A' : ' ', 1284 1263 (flags & ZONE_RESERVED) ? 'R' : ' ', 1285 1264 (flags & ZONE_FIRMWARE) ? 'F' : ' '); 1286 #endif1287 1288 #ifdef __64_BITS__1289 printf("%-2" PRIc " %18p %c%c%c ", i, base,1290 available ? 'A' : ' ',1291 (flags & ZONE_RESERVED) ? 'R' : ' ',1292 (flags & ZONE_FIRMWARE) ? 'F' : ' ');1293 #endif1294 1265 1295 1266 if (available) 1296 1267 printf("%12" PRIc " %12" PRIc, 1297 1268 free_count, busy_count); 1269 1298 1270 printf("\n"); 1299 1271 }
Note:
See TracChangeset
for help on using the changeset viewer.