Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/frame.c

    r8d308b9 r7e752b2  
    4545#include <typedefs.h>
    4646#include <mm/frame.h>
    47 #include <mm/reserve.h>
    4847#include <mm/as.h>
    4948#include <panic.h>
     
    6059#include <macros.h>
    6160#include <config.h>
    62 #include <str.h>
    6361
    6462zones_t zones;
     
    182180 *
    183181 */
    184 NO_TRACE static size_t frame_total_free_get_internal(void)
     182#ifdef CONFIG_DEBUG
     183NO_TRACE static size_t total_frames_free(void)
    185184{
    186185        size_t total = 0;
    187186        size_t i;
    188 
    189187        for (i = 0; i < zones.count; i++)
    190188                total += zones.info[i].free_count;
     
    192190        return total;
    193191}
    194 
    195 NO_TRACE size_t frame_total_free_get(void)
    196 {
    197         size_t total;
    198 
    199         irq_spinlock_lock(&zones.lock, true);
    200         total = frame_total_free_get_internal();
    201         irq_spinlock_unlock(&zones.lock, true);
    202 
    203         return total;
    204 }
    205 
     192#endif /* CONFIG_DEBUG */
    206193
    207194/** Find a zone with a given frames.
     
    485472 * @param frame_idx Frame index relative to zone.
    486473 *
    487  * @return          Number of freed frames.
    488  *
    489  */
    490 NO_TRACE static size_t zone_frame_free(zone_t *zone, size_t frame_idx)
     474 */
     475NO_TRACE static void zone_frame_free(zone_t *zone, size_t frame_idx)
    491476{
    492477        ASSERT(zone_flags_available(zone->flags));
    493478       
    494479        frame_t *frame = &zone->frames[frame_idx];
    495         size_t size = 0;
     480       
     481        /* Remember frame order */
     482        uint8_t order = frame->buddy_order;
    496483       
    497484        ASSERT(frame->refcount);
    498485       
    499486        if (!--frame->refcount) {
    500                 size = 1 << frame->buddy_order;
    501                 buddy_system_free(zone->buddy_system, &frame->buddy_link);             
     487                buddy_system_free(zone->buddy_system, &frame->buddy_link);
     488               
    502489                /* Update zone information. */
    503                 zone->free_count += size;
    504                 zone->busy_count -= size;
    505         }
    506        
    507         return size;
     490                zone->free_count += (1 << order);
     491                zone->busy_count -= (1 << order);
     492        }
    508493}
    509494
     
    531516        ASSERT(link);
    532517        zone->free_count--;
    533         reserve_force_alloc(1);
    534518}
    535519
     
    661645        for (i = 0; i < cframes; i++) {
    662646                zones.info[znum].busy_count++;
    663                 (void) zone_frame_free(&zones.info[znum],
     647                zone_frame_free(&zones.info[znum],
    664648                    pfn - zones.info[znum].base + i);
    665649        }
     
    699683        /* Free unneeded frames */
    700684        for (i = count; i < (size_t) (1 << order); i++)
    701                 (void) zone_frame_free(&zones.info[znum], i + frame_idx);
     685                zone_frame_free(&zones.info[znum], i + frame_idx);
    702686}
    703687
     
    711695 * not to be 2^order size. Once the allocator is running it is no longer
    712696 * possible, merged configuration data occupies more space :-/
     697 *
     698 * The function uses
    713699 *
    714700 */
     
    1013999        size_t hint = pzone ? (*pzone) : 0;
    10141000       
    1015         /*
    1016          * If not told otherwise, we must first reserve the memory.
    1017          */
    1018         if (!(flags & FRAME_NO_RESERVE))
    1019                 reserve_force_alloc(size);
    1020 
    10211001loop:
    10221002        irq_spinlock_lock(&zones.lock, true);
     
    10531033                if (flags & FRAME_ATOMIC) {
    10541034                        irq_spinlock_unlock(&zones.lock, true);
    1055                         if (!(flags & FRAME_NO_RESERVE))
    1056                                 reserve_free(size);
    10571035                        return NULL;
    10581036                }
    10591037               
    10601038#ifdef CONFIG_DEBUG
    1061                 size_t avail = frame_total_free_get_internal();
     1039                size_t avail = total_frames_free();
    10621040#endif
    10631041               
     
    11101088}
    11111089
    1112 void *frame_alloc(uint8_t order, frame_flags_t flags)
    1113 {
    1114         return frame_alloc_generic(order, flags, NULL);
    1115 }
    1116 
    1117 void *frame_alloc_noreserve(uint8_t order, frame_flags_t flags)
    1118 {
    1119         return frame_alloc_generic(order, flags | FRAME_NO_RESERVE, NULL);
    1120 }
    1121 
    11221090/** Free a frame.
    11231091 *
     
    11271095 *
    11281096 * @param frame Physical Address of of the frame to be freed.
    1129  * @param flags Flags to control memory reservation.
    1130  *
    1131  */
    1132 void frame_free_generic(uintptr_t frame, frame_flags_t flags)
    1133 {
    1134         size_t size;
    1135        
     1097 *
     1098 */
     1099void frame_free(uintptr_t frame)
     1100{
    11361101        irq_spinlock_lock(&zones.lock, true);
    11371102       
     
    11411106        pfn_t pfn = ADDR2PFN(frame);
    11421107        size_t znum = find_zone(pfn, 1, 0);
    1143 
    11441108       
    11451109        ASSERT(znum != (size_t) -1);
    11461110       
    1147         size = zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);
     1111        zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);
    11481112       
    11491113        irq_spinlock_unlock(&zones.lock, true);
     
    11541118        mutex_lock(&mem_avail_mtx);
    11551119        if (mem_avail_req > 0)
    1156                 mem_avail_req -= min(mem_avail_req, size);
     1120                mem_avail_req--;
    11571121       
    11581122        if (mem_avail_req == 0) {
     
    11611125        }
    11621126        mutex_unlock(&mem_avail_mtx);
    1163        
    1164         if (!(flags & FRAME_NO_RESERVE))
    1165                 reserve_free(size);
    1166 }
    1167 
    1168 void frame_free(uintptr_t frame)
    1169 {
    1170         frame_free_generic(frame, 0);
    1171 }
    1172 
    1173 void frame_free_noreserve(uintptr_t frame)
    1174 {
    1175         frame_free_generic(frame, FRAME_NO_RESERVE);
    11761127}
    11771128
     
    14041355        bool available = zone_flags_available(flags);
    14051356       
    1406         uint64_t size;
    1407         const char *size_suffix;
    1408         bin_order_suffix(FRAMES2SIZE(count), &size, &size_suffix, false);
    1409        
    14101357        printf("Zone number:       %zu\n", znum);
    14111358        printf("Zone base address: %p\n", (void *) base);
    1412         printf("Zone size:         %zu frames (%" PRIu64 " %s)\n", count,
    1413             size, size_suffix);
     1359        printf("Zone size:         %zu frames (%zu KiB)\n", count,
     1360            SIZE2KB(FRAMES2SIZE(count)));
    14141361        printf("Zone flags:        %c%c%c\n",
    14151362            available ? 'A' : ' ',
     
    14181365       
    14191366        if (available) {
    1420                 bin_order_suffix(FRAMES2SIZE(busy_count), &size, &size_suffix,
    1421                     false);
    1422                 printf("Allocated space:   %zu frames (%" PRIu64 " %s)\n",
    1423                     busy_count, size, size_suffix);
    1424                 bin_order_suffix(FRAMES2SIZE(free_count), &size, &size_suffix,
    1425                     false);
    1426                 printf("Available space:   %zu frames (%" PRIu64 " %s)\n",
    1427                     free_count, size, size_suffix);
     1367                printf("Allocated space:   %zu frames (%zu KiB)\n",
     1368                    busy_count, SIZE2KB(FRAMES2SIZE(busy_count)));
     1369                printf("Available space:   %zu frames (%zu KiB)\n",
     1370                    free_count, SIZE2KB(FRAMES2SIZE(free_count)));
    14281371        }
    14291372}
Note: See TracChangeset for help on using the changeset viewer.