Changes in / [7da90cd:c7bbf029] in mainline
- Location:
- kernel/generic/src/mm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r7da90cd rc7bbf029 481 481 482 482 frame_t *frame = &zone->frames[frame_idx]; 483 size_t size = 0;483 size_t size = 1 << frame->buddy_order; 484 484 485 485 ASSERT(frame->refcount); 486 486 487 487 if (!--frame->refcount) { 488 size = 1 << frame->buddy_order;489 buddy_system_free(zone->buddy_system, &frame->buddy_link);488 buddy_system_free(zone->buddy_system, &frame->buddy_link); 489 490 490 /* Update zone information. */ 491 491 zone->free_count += size; … … 1007 1007 * If not told otherwise, we must first reserve the memory. 1008 1008 */ 1009 if (!(flags & FRAME_NO_RESERVE)) 1010 reserve_force_alloc(size); 1011 1009 if (!(flags & FRAME_NO_RESERVE)) { 1010 if (flags & FRAME_ATOMIC) { 1011 if (!reserve_try_alloc(size)) 1012 return NULL; 1013 } else { 1014 reserve_force_alloc(size); 1015 } 1016 } 1017 1012 1018 loop: 1013 1019 irq_spinlock_lock(&zones.lock, true); -
kernel/generic/src/mm/reserve.c
r7da90cd rc7bbf029 38 38 #include <mm/reserve.h> 39 39 #include <mm/frame.h> 40 #include <mm/slab.h>41 40 #include <synch/spinlock.h> 42 41 #include <typedefs.h> … … 46 45 static ssize_t reserve = 0; 47 46 48 /** Try to reserve memory.49 *50 * This function may not be called from contexts that do not allow memory51 * reclaiming, such as some invocations of frame_alloc_generic().52 *53 * @param size Number of frames to reserve.54 * @return True on success or false otherwise.55 */56 47 bool reserve_try_alloc(size_t size) 57 48 { … … 62 53 reserve -= size; 63 54 reserved = true; 64 } else {65 /*66 * Some reservable frames may be cached by the slab allocator.67 * Try to reclaim some reservable memory. Try to be gentle for68 * the first time. If it does not help, try to reclaim69 * everything.70 */71 irq_spinlock_unlock(&reserve_lock, true);72 slab_reclaim(0);73 irq_spinlock_lock(&reserve_lock, true);74 if (reserve >= 0 && (size_t) reserve >= size) {75 reserve -= size;76 reserved = true;77 } else {78 irq_spinlock_unlock(&reserve_lock, true);79 slab_reclaim(SLAB_RECLAIM_ALL);80 irq_spinlock_lock(&reserve_lock, true);81 if (reserve >= 0 && (size_t) reserve >= size) {82 reserve -= size;83 reserved = true;84 }85 }86 55 } 87 56 irq_spinlock_unlock(&reserve_lock, true); … … 90 59 } 91 60 92 /** Reserve memory.93 *94 * This function simply marks the respective amount of memory frames reserved.95 * It does not implement any sort of blocking for the case there is not enough96 * reservable memory. It will simply take the reserve into negative numbers and97 * leave the blocking up to the allocation phase.98 *99 * @param size Number of frames to reserve.100 */101 61 void reserve_force_alloc(size_t size) 102 62 { … … 106 66 } 107 67 108 /** Unreserve memory.109 *110 * @param size Number of frames to unreserve.111 */112 68 void reserve_free(size_t size) 113 69 {
Note:
See TracChangeset
for help on using the changeset viewer.