Ignore:
File:
1 edited

Legend:

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

    r933cadf raf96dd57  
    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;
     
    147145                            (!iswithin(zones.info[i].base, zones.info[i].count,
    148146                            base, count))) {
    149                                 printf("Zone (%p, %p) overlaps "
    150                                     "with previous zone (%p %p)!\n",
    151                                     (void *) PFN2ADDR(base), (void *) PFN2ADDR(count),
    152                                     (void *) PFN2ADDR(zones.info[i].base),
    153                                     (void *) PFN2ADDR(zones.info[i].count));
     147                                printf("Zone (%p, %p) overlaps with previous zone (%p, %p)!\n",
     148                                    PFN2ADDR(base), PFN2ADDR(count),
     149                                    PFN2ADDR(zones.info[i].base),
     150                                    PFN2ADDR(zones.info[i].count));
    154151                        }
    155152                       
     
    474471 * @param frame_idx Frame index relative to zone.
    475472 *
    476  * @return          Number of freed frames.
    477  *
    478  */
    479 NO_TRACE static size_t zone_frame_free(zone_t *zone, size_t frame_idx)
     473 */
     474NO_TRACE static void zone_frame_free(zone_t *zone, size_t frame_idx)
    480475{
    481476        ASSERT(zone_flags_available(zone->flags));
    482477       
    483478        frame_t *frame = &zone->frames[frame_idx];
    484         size_t size = 0;
     479       
     480        /* Remember frame order */
     481        uint8_t order = frame->buddy_order;
    485482       
    486483        ASSERT(frame->refcount);
    487484       
    488485        if (!--frame->refcount) {
    489                 size = 1 << frame->buddy_order;
    490                 buddy_system_free(zone->buddy_system, &frame->buddy_link);             
     486                buddy_system_free(zone->buddy_system, &frame->buddy_link);
     487               
    491488                /* Update zone information. */
    492                 zone->free_count += size;
    493                 zone->busy_count -= size;
    494         }
    495        
    496         return size;
     489                zone->free_count += (1 << order);
     490                zone->busy_count -= (1 << order);
     491        }
    497492}
    498493
     
    520515        ASSERT(link);
    521516        zone->free_count--;
    522         reserve_force_alloc(1);
    523517}
    524518
     
    650644        for (i = 0; i < cframes; i++) {
    651645                zones.info[znum].busy_count++;
    652                 (void) zone_frame_free(&zones.info[znum],
     646                zone_frame_free(&zones.info[znum],
    653647                    pfn - zones.info[znum].base + i);
    654648        }
     
    688682        /* Free unneeded frames */
    689683        for (i = count; i < (size_t) (1 << order); i++)
    690                 (void) zone_frame_free(&zones.info[znum], i + frame_idx);
     684                zone_frame_free(&zones.info[znum], i + frame_idx);
    691685}
    692686
     
    700694 * not to be 2^order size. Once the allocator is running it is no longer
    701695 * possible, merged configuration data occupies more space :-/
     696 *
     697 * The function uses
    702698 *
    703699 */
     
    840836                        buddy_system_free(zone->buddy_system, &zone->frames[i].buddy_link);
    841837                }
    842 
    843                 /* "Unreserve" new frames. */
    844                 reserve_free(count);
    845838        } else
    846839                zone->frames = NULL;
     
    885878                 * the assert
    886879                 */
    887                 ASSERT(confframe != ADDR2PFN((uintptr_t ) NULL));
     880                ASSERT(confframe != NULL);
    888881               
    889882                /* If confframe is supposed to be inside our zone, then make sure
     
    1005998        size_t hint = pzone ? (*pzone) : 0;
    1006999       
    1007         /*
    1008          * If not told otherwise, we must first reserve the memory.
    1009          */
    1010         if (!(flags & FRAME_NO_RESERVE))
    1011                 reserve_force_alloc(size);
    1012 
    10131000loop:
    10141001        irq_spinlock_lock(&zones.lock, true);
     
    10451032                if (flags & FRAME_ATOMIC) {
    10461033                        irq_spinlock_unlock(&zones.lock, true);
    1047                         if (!(flags & FRAME_NO_RESERVE))
    1048                                 reserve_free(size);
    10491034                        return NULL;
    10501035                }
     
    10641049               
    10651050#ifdef CONFIG_DEBUG
    1066                 printf("Thread %" PRIu64 " waiting for %zu frames, "
    1067                     "%zu available.\n", THREAD->tid, size, avail);
     1051                printf("Thread %" PRIu64 " waiting for %" PRIs " frames, "
     1052                    "%" PRIs " available.\n", THREAD->tid, size, avail);
    10681053#endif
    10691054               
     
    11021087}
    11031088
    1104 void *frame_alloc(uint8_t order, frame_flags_t flags)
    1105 {
    1106         return frame_alloc_generic(order, flags, NULL);
    1107 }
    1108 
    1109 void *frame_alloc_noreserve(uint8_t order, frame_flags_t flags)
    1110 {
    1111         return frame_alloc_generic(order, flags | FRAME_NO_RESERVE, NULL);
    1112 }
    1113 
    11141089/** Free a frame.
    11151090 *
     
    11191094 *
    11201095 * @param frame Physical Address of of the frame to be freed.
    1121  * @param flags Flags to control memory reservation.
    1122  *
    1123  */
    1124 void frame_free_generic(uintptr_t frame, frame_flags_t flags)
    1125 {
    1126         size_t size;
    1127        
     1096 *
     1097 */
     1098void frame_free(uintptr_t frame)
     1099{
    11281100        irq_spinlock_lock(&zones.lock, true);
    11291101       
     
    11321104         */
    11331105        pfn_t pfn = ADDR2PFN(frame);
    1134         size_t znum = find_zone(pfn, 1, 0);
    1135 
     1106        size_t znum = find_zone(pfn, 1, NULL);
    11361107       
    11371108        ASSERT(znum != (size_t) -1);
    11381109       
    1139         size = zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);
     1110        zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);
    11401111       
    11411112        irq_spinlock_unlock(&zones.lock, true);
     
    11461117        mutex_lock(&mem_avail_mtx);
    11471118        if (mem_avail_req > 0)
    1148                 mem_avail_req -= min(mem_avail_req, size);
     1119                mem_avail_req--;
    11491120       
    11501121        if (mem_avail_req == 0) {
     
    11531124        }
    11541125        mutex_unlock(&mem_avail_mtx);
    1155        
    1156         if (!(flags & FRAME_NO_RESERVE))
    1157                 reserve_free(size);
    1158 }
    1159 
    1160 void frame_free(uintptr_t frame)
    1161 {
    1162         frame_free_generic(frame, 0);
    1163 }
    1164 
    1165 void frame_free_noreserve(uintptr_t frame)
    1166 {
    1167         frame_free_generic(frame, FRAME_NO_RESERVE);
    11681126}
    11691127
     
    11831141         * First, find host frame zone for addr.
    11841142         */
    1185         size_t znum = find_zone(pfn, 1, 0);
     1143        size_t znum = find_zone(pfn, 1, NULL);
    11861144       
    11871145        ASSERT(znum != (size_t) -1);
     
    13391297                bool available = zone_flags_available(flags);
    13401298               
    1341                 printf("%-4zu", i);
     1299                printf("%-4" PRIs, i);
    13421300               
    13431301#ifdef __32_BITS__
    1344                 printf("  %p", (void *) base);
     1302                printf("  %10p", base);
    13451303#endif
    13461304               
    13471305#ifdef __64_BITS__
    1348                 printf(" %p", (void *) base);
     1306                printf(" %18p", base);
    13491307#endif
    13501308               
    1351                 printf(" %12zu %c%c%c      ", count,
     1309                printf(" %12" PRIs " %c%c%c      ", count,
    13521310                    available ? 'A' : ' ',
    13531311                    (flags & ZONE_RESERVED) ? 'R' : ' ',
     
    13551313               
    13561314                if (available)
    1357                         printf("%14zu %14zu",
     1315                        printf("%14" PRIs " %14" PRIs,
    13581316                            free_count, busy_count);
    13591317               
     
    13961354        bool available = zone_flags_available(flags);
    13971355       
    1398         uint64_t size;
    1399         const char *size_suffix;
    1400         bin_order_suffix(FRAMES2SIZE(count), &size, &size_suffix, false);
    1401        
    1402         printf("Zone number:       %zu\n", znum);
    1403         printf("Zone base address: %p\n", (void *) base);
    1404         printf("Zone size:         %zu frames (%" PRIu64 " %s)\n", count,
    1405             size, size_suffix);
     1356        printf("Zone number:       %" PRIs "\n", znum);
     1357        printf("Zone base address: %p\n", base);
     1358        printf("Zone size:         %" PRIs " frames (%" PRIs " KiB)\n", count,
     1359            SIZE2KB(FRAMES2SIZE(count)));
    14061360        printf("Zone flags:        %c%c%c\n",
    14071361            available ? 'A' : ' ',
     
    14101364       
    14111365        if (available) {
    1412                 bin_order_suffix(FRAMES2SIZE(busy_count), &size, &size_suffix,
    1413                     false);
    1414                 printf("Allocated space:   %zu frames (%" PRIu64 " %s)\n",
    1415                     busy_count, size, size_suffix);
    1416                 bin_order_suffix(FRAMES2SIZE(free_count), &size, &size_suffix,
    1417                     false);
    1418                 printf("Available space:   %zu frames (%" PRIu64 " %s)\n",
    1419                     free_count, size, size_suffix);
     1366                printf("Allocated space:   %" PRIs " frames (%" PRIs " KiB)\n",
     1367                    busy_count, SIZE2KB(FRAMES2SIZE(busy_count)));
     1368                printf("Available space:   %" PRIs " frames (%" PRIs " KiB)\n",
     1369                    free_count, SIZE2KB(FRAMES2SIZE(free_count)));
    14201370        }
    14211371}
Note: See TracChangeset for help on using the changeset viewer.