Rev 2048 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2048 | Rev 2059 | ||
|---|---|---|---|
| Line 81... | Line 81... | ||
| 81 | 81 | ||
| 82 | frame_t *frames; /**< array of frame_t structures in this zone */ |
82 | frame_t *frames; /**< array of frame_t structures in this zone */ |
| 83 | count_t free_count; /**< number of free frame_t structures */ |
83 | count_t free_count; /**< number of free frame_t structures */ |
| 84 | count_t busy_count; /**< number of busy frame_t structures */ |
84 | count_t busy_count; /**< number of busy frame_t structures */ |
| 85 | 85 | ||
| 86 | buddy_system_t * buddy_system; /**< buddy system for the zone */ |
86 | buddy_system_t *buddy_system; /**< buddy system for the zone */ |
| 87 | int flags; |
87 | int flags; |
| 88 | } zone_t; |
88 | } zone_t; |
| 89 | 89 | ||
| 90 | /* |
90 | /* |
| 91 | * The zoneinfo.lock must be locked when accessing zoneinfo structure. |
91 | * The zoneinfo.lock must be locked when accessing zoneinfo structure. |
| Line 174... | Line 174... | ||
| 174 | return i; |
174 | return i; |
| 175 | } |
175 | } |
| 176 | 176 | ||
| 177 | /** |
177 | /** |
| 178 | * Try to find a zone where can we find the frame |
178 | * Try to find a zone where can we find the frame |
| - | 179 | |
|
| - | 180 | * Assume interrupts are disabled. |
|
| 179 | * |
181 | |
| 180 | * @param frame Frame number contained in zone |
182 | * @param frame Frame number contained in zone |
| 181 | * @param pzone If not null, it is used as zone hint. Zone index |
183 | * @param pzone If not null, it is used as zone hint. Zone index |
| 182 | * is filled into the variable on success. |
184 | * is filled into the variable on success. |
| 183 | * @return Pointer to LOCKED zone containing frame |
185 | * @return Pointer to locked zone containing frame |
| 184 | * |
- | |
| 185 | * Assume interrupts disable |
- | |
| 186 | */ |
186 | */ |
| 187 | static zone_t * find_zone_and_lock(pfn_t frame, int *pzone) |
187 | static zone_t * find_zone_and_lock(pfn_t frame, int *pzone) |
| 188 | { |
188 | { |
| 189 | int i; |
189 | int i; |
| 190 | int hint = pzone ? *pzone : 0; |
190 | int hint = pzone ? *pzone : 0; |
| Line 220... | Line 220... | ||
| 220 | static int zone_can_alloc(zone_t *z, uint8_t order) |
220 | static int zone_can_alloc(zone_t *z, uint8_t order) |
| 221 | { |
221 | { |
| 222 | return buddy_system_can_alloc(z->buddy_system, order); |
222 | return buddy_system_can_alloc(z->buddy_system, order); |
| 223 | } |
223 | } |
| 224 | 224 | ||
| 225 | /** |
- | |
| 226 | * Find AND LOCK zone that can allocate order frames |
225 | /** Find and lock zone that can allocate order frames. |
| 227 | * |
226 | * |
| 228 | * Assume interrupts are disabled!! |
227 | * Assume interrupts are disabled. |
| 229 | * |
228 | * |
| 230 | * @param order Size (2^order) of free space we are trying to find |
229 | * @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 |
230 | * @param pzone Pointer to preferred zone or NULL, on return contains zone number |
| 232 | */ |
231 | */ |
| 233 | static zone_t * find_free_zone_and_lock(uint8_t order, int *pzone) |
232 | static zone_t * find_free_zone_and_lock(uint8_t order, int *pzone) |
| Line 258... | Line 257... | ||
| 258 | } while(i != hint); |
257 | } while(i != hint); |
| 259 | spinlock_unlock(&zones.lock); |
258 | spinlock_unlock(&zones.lock); |
| 260 | return NULL; |
259 | return NULL; |
| 261 | } |
260 | } |
| 262 | 261 | ||
| 263 | /********************************************/ |
262 | /**************************/ |
| 264 | /* Buddy system functions */ |
263 | /* Buddy system functions */ |
| - | 264 | /**************************/ |
|
| 265 | 265 | ||
| 266 | /** Buddy system find_block implementation |
266 | /** Buddy system find_block implementation |
| 267 | * |
267 | * |
| 268 | * Find block that is parent of current list. |
268 | * Find block that is parent of current list. |
| 269 | * That means go to lower addresses, until such block is found |
269 | * That means go to lower addresses, until such block is found |
| Line 434... | Line 434... | ||
| 434 | .mark_available = zone_buddy_mark_available, |
434 | .mark_available = zone_buddy_mark_available, |
| 435 | .find_block = zone_buddy_find_block, |
435 | .find_block = zone_buddy_find_block, |
| 436 | .print_id = zone_buddy_print_id |
436 | .print_id = zone_buddy_print_id |
| 437 | }; |
437 | }; |
| 438 | 438 | ||
| 439 | /*************************************/ |
439 | /******************/ |
| 440 | /* Zone functions */ |
440 | /* Zone functions */ |
| - | 441 | /******************/ |
|
| 441 | 442 | ||
| 442 | /** Allocate frame in particular zone |
443 | /** Allocate frame in particular zone |
| 443 | * |
444 | * |
| 444 | * Assume zone is locked |
445 | * Assume zone is locked |
| 445 | * Panics if allocation is impossible. |
446 | * Panics if allocation is impossible. |
| Line 532... | Line 533... | ||
| 532 | * |
533 | * |
| 533 | * @param z Target zone structure pointer |
534 | * @param z Target zone structure pointer |
| 534 | * @param z1 Zone to merge |
535 | * @param z1 Zone to merge |
| 535 | * @param z2 Zone to merge |
536 | * @param z2 Zone to merge |
| 536 | */ |
537 | */ |
| 537 | - | ||
| 538 | static void _zone_merge(zone_t *z, zone_t *z1, zone_t *z2) |
538 | static void _zone_merge(zone_t *z, zone_t *z1, zone_t *z2) |
| 539 | { |
539 | { |
| 540 | uint8_t max_order; |
540 | uint8_t max_order; |
| 541 | int i, z2idx; |
541 | int i, z2idx; |
| 542 | pfn_t frame_idx; |
542 | pfn_t frame_idx; |