Rev 1894 | Rev 2035 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1894 | Rev 1981 | ||
|---|---|---|---|
| Line 228... | Line 228... | ||
| 228 | * Assume interrupts are disabled!! |
228 | * Assume interrupts are disabled!! |
| 229 | * |
229 | * |
| 230 | * @param order Size (2^order) of free space we are trying to find |
230 | * @param order Size (2^order) of free space we are trying to find |
| 231 | * @param pzone Pointer to preferred zone or NULL, on return contains zone number |
231 | * @param pzone Pointer to preferred zone or NULL, on return contains zone number |
| 232 | */ |
232 | */ |
| 233 | static zone_t * find_free_zone_lock(uint8_t order, int *pzone) |
233 | static zone_t * find_free_zone_and_lock(uint8_t order, int *pzone) |
| 234 | { |
234 | { |
| 235 | int i; |
235 | int i; |
| 236 | zone_t *z; |
236 | zone_t *z; |
| 237 | int hint = pzone ? *pzone : 0; |
237 | int hint = pzone ? *pzone : 0; |
| 238 | 238 | ||
| Line 323... | Line 323... | ||
| 323 | is_right = IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame); |
323 | is_right = IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame); |
| 324 | 324 | ||
| 325 | ASSERT(is_left ^ is_right); |
325 | ASSERT(is_left ^ is_right); |
| 326 | if (is_left) { |
326 | if (is_left) { |
| 327 | index = (frame_index(zone, frame)) + (1 << frame->buddy_order); |
327 | index = (frame_index(zone, frame)) + (1 << frame->buddy_order); |
| 328 | } else { // if (is_right) |
328 | } else { /* if (is_right) */ |
| 329 | index = (frame_index(zone, frame)) - (1 << frame->buddy_order); |
329 | index = (frame_index(zone, frame)) - (1 << frame->buddy_order); |
| 330 | } |
330 | } |
| 331 | 331 | ||
| 332 | if (frame_index_valid(zone, index)) { |
332 | if (frame_index_valid(zone, index)) { |
| 333 | if (zone->frames[index].buddy_order == frame->buddy_order && |
333 | if (zone->frames[index].buddy_order == frame->buddy_order && |
| Line 944... | Line 944... | ||
| 944 | ipl = interrupts_disable(); |
944 | ipl = interrupts_disable(); |
| 945 | 945 | ||
| 946 | /* |
946 | /* |
| 947 | * First, find suitable frame zone. |
947 | * First, find suitable frame zone. |
| 948 | */ |
948 | */ |
| 949 | zone = find_free_zone_lock(order, pzone); |
949 | zone = find_free_zone_and_lock(order, pzone); |
| 950 | 950 | ||
| 951 | /* If no memory, reclaim some slab memory, |
951 | /* If no memory, reclaim some slab memory, |
| 952 | if it does not help, reclaim all */ |
952 | if it does not help, reclaim all */ |
| 953 | if (!zone && !(flags & FRAME_NO_RECLAIM)) { |
953 | if (!zone && !(flags & FRAME_NO_RECLAIM)) { |
| 954 | freed = slab_reclaim(0); |
954 | freed = slab_reclaim(0); |
| 955 | if (freed) |
955 | if (freed) |
| 956 | zone = find_free_zone_lock(order, pzone); |
956 | zone = find_free_zone_and_lock(order, pzone); |
| 957 | if (!zone) { |
957 | if (!zone) { |
| 958 | freed = slab_reclaim(SLAB_RECLAIM_ALL); |
958 | freed = slab_reclaim(SLAB_RECLAIM_ALL); |
| 959 | if (freed) |
959 | if (freed) |
| 960 | zone = find_free_zone_lock(order, pzone); |
960 | zone = find_free_zone_and_lock(order, pzone); |
| 961 | } |
961 | } |
| 962 | } |
962 | } |
| 963 | if (!zone) { |
963 | if (!zone) { |
| 964 | /* |
964 | /* |
| 965 | * TODO: Sleep until frames are available again. |
965 | * TODO: Sleep until frames are available again. |
| Line 1046... | Line 1046... | ||
| 1046 | int i; |
1046 | int i; |
| 1047 | zone_t *zone; |
1047 | zone_t *zone; |
| 1048 | int prefzone = 0; |
1048 | int prefzone = 0; |
| 1049 | 1049 | ||
| 1050 | for (i=0; i < count; i++) { |
1050 | for (i=0; i < count; i++) { |
| 1051 | zone = find_zone_and_lock(start+i,&prefzone); |
1051 | zone = find_zone_and_lock(start + i, &prefzone); |
| 1052 | if (!zone) /* PFN not found */ |
1052 | if (!zone) /* PFN not found */ |
| 1053 | continue; |
1053 | continue; |
| 1054 | zone_mark_unavailable(zone, start+i-zone->base); |
1054 | zone_mark_unavailable(zone, start + i - zone->base); |
| 1055 | 1055 | ||
| 1056 | spinlock_unlock(&zone->lock); |
1056 | spinlock_unlock(&zone->lock); |
| 1057 | } |
1057 | } |
| 1058 | } |
1058 | } |
| 1059 | 1059 | ||
| Line 1063... | Line 1063... | ||
| 1063 | */ |
1063 | */ |
| 1064 | void frame_init(void) |
1064 | void frame_init(void) |
| 1065 | { |
1065 | { |
| 1066 | if (config.cpu_active == 1) { |
1066 | if (config.cpu_active == 1) { |
| 1067 | zones.count = 0; |
1067 | zones.count = 0; |
| 1068 | spinlock_initialize(&zones.lock,"zones_glob_lock"); |
1068 | spinlock_initialize(&zones.lock, "zones.lock"); |
| 1069 | } |
1069 | } |
| 1070 | /* Tell the architecture to create some memory */ |
1070 | /* Tell the architecture to create some memory */ |
| 1071 | frame_arch_init(); |
1071 | frame_arch_init(); |
| 1072 | if (config.cpu_active == 1) { |
1072 | if (config.cpu_active == 1) { |
| 1073 | frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)), SIZE2FRAMES(config.kernel_size)); |
1073 | frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)), SIZE2FRAMES(config.kernel_size)); |