Ignore:
File:
1 edited

Legend:

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

    rda1bafb r05411e8  
    6666 * available.
    6767 */
    68 static mutex_t mem_avail_mtx;
    69 static condvar_t mem_avail_cv;
    70 static size_t mem_avail_req = 0;  /**< Number of frames requested. */
    71 static size_t mem_avail_gen = 0;  /**< Generation counter. */
     68mutex_t mem_avail_mtx;
     69condvar_t mem_avail_cv;
     70size_t mem_avail_req = 0;  /**< Number of frames requested. */
     71size_t mem_avail_gen = 0;  /**< Generation counter. */
    7272
    7373/********************/
     
    171171        return total;
    172172}
    173 #endif /* CONFIG_DEBUG */
     173#endif
    174174
    175175/** Find a zone with a given frames.
     
    199199                if (i >= zones.count)
    200200                        i = 0;
    201                
    202201        } while (i != hint);
    203202       
     
    243242                if (i >= zones.count)
    244243                        i = 0;
    245                
    246244        } while (i != hint);
    247245       
     
    298296                index = (frame_index(zone, frame)) +
    299297                    (1 << frame->buddy_order);
    300         } else {  /* is_right */
     298        } else {        /* is_right */
    301299                index = (frame_index(zone, frame)) -
    302300                    (1 << frame->buddy_order);
     
    675673bool zone_merge(size_t z1, size_t z2)
    676674{
    677         irq_spinlock_lock(&zones.lock, true);
     675        ipl_t ipl = interrupts_disable();
     676        spinlock_lock(&zones.lock);
    678677       
    679678        bool ret = true;
     
    745744       
    746745errout:
    747         irq_spinlock_unlock(&zones.lock, true);
     746        spinlock_unlock(&zones.lock);
     747        interrupts_restore(ipl);
    748748       
    749749        return ret;
     
    777777 *
    778778 */
    779 static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start,
    780     size_t count, zone_flags_t flags)
     779static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start, size_t count, zone_flags_t flags)
    781780{
    782781        zone->base = start;
     
    842841 *
    843842 */
    844 size_t zone_create(pfn_t start, size_t count, pfn_t confframe,
    845     zone_flags_t flags)
    846 {
    847         irq_spinlock_lock(&zones.lock, true);
     843size_t zone_create(pfn_t start, size_t count, pfn_t confframe, zone_flags_t flags)
     844{
     845        ipl_t ipl = interrupts_disable();
     846        spinlock_lock(&zones.lock);
    848847       
    849848        if (zone_flags_available(flags)) {  /* Create available zone */
     
    890889                size_t znum = zones_insert_zone(start, count);
    891890                if (znum == (size_t) -1) {
    892                         irq_spinlock_unlock(&zones.lock, true);
     891                        spinlock_unlock(&zones.lock);
     892                        interrupts_restore(ipl);
    893893                        return (size_t) -1;
    894894                }
     
    905905                }
    906906               
    907                 irq_spinlock_unlock(&zones.lock, true);
     907                spinlock_unlock(&zones.lock);
     908                interrupts_restore(ipl);
    908909               
    909910                return znum;
     
    913914        size_t znum = zones_insert_zone(start, count);
    914915        if (znum == (size_t) -1) {
    915                 irq_spinlock_unlock(&zones.lock, true);
     916                spinlock_unlock(&zones.lock);
     917                interrupts_restore(ipl);
    916918                return (size_t) -1;
    917919        }
    918920        zone_construct(&zones.info[znum], NULL, start, count, flags);
    919921       
    920         irq_spinlock_unlock(&zones.lock, true);
     922        spinlock_unlock(&zones.lock);
     923        interrupts_restore(ipl);
    921924       
    922925        return znum;
     
    930933void frame_set_parent(pfn_t pfn, void *data, size_t hint)
    931934{
    932         irq_spinlock_lock(&zones.lock, true);
     935        ipl_t ipl = interrupts_disable();
     936        spinlock_lock(&zones.lock);
    933937       
    934938        size_t znum = find_zone(pfn, 1, hint);
     
    939943            pfn - zones.info[znum].base)->parent = data;
    940944       
    941         irq_spinlock_unlock(&zones.lock, true);
     945        spinlock_unlock(&zones.lock);
     946        interrupts_restore(ipl);
    942947}
    943948
    944949void *frame_get_parent(pfn_t pfn, size_t hint)
    945950{
    946         irq_spinlock_lock(&zones.lock, true);
     951        ipl_t ipl = interrupts_disable();
     952        spinlock_lock(&zones.lock);
    947953       
    948954        size_t znum = find_zone(pfn, 1, hint);
     
    953959            pfn - zones.info[znum].base)->parent;
    954960       
    955         irq_spinlock_unlock(&zones.lock, true);
     961        spinlock_unlock(&zones.lock);
     962        interrupts_restore(ipl);
    956963       
    957964        return res;
     
    970977{
    971978        size_t size = ((size_t) 1) << order;
     979        ipl_t ipl;
    972980        size_t hint = pzone ? (*pzone) : 0;
    973981       
    974982loop:
    975         irq_spinlock_lock(&zones.lock, true);
     983        ipl = interrupts_disable();
     984        spinlock_lock(&zones.lock);
    976985       
    977986        /*
     
    984993           if it does not help, reclaim all */
    985994        if ((znum == (size_t) -1) && (!(flags & FRAME_NO_RECLAIM))) {
    986                 irq_spinlock_unlock(&zones.lock, true);
     995                spinlock_unlock(&zones.lock);
     996                interrupts_restore(ipl);
     997               
    987998                size_t freed = slab_reclaim(0);
    988                 irq_spinlock_lock(&zones.lock, true);
     999               
     1000                ipl = interrupts_disable();
     1001                spinlock_lock(&zones.lock);
    9891002               
    9901003                if (freed > 0)
     
    9931006               
    9941007                if (znum == (size_t) -1) {
    995                         irq_spinlock_unlock(&zones.lock, true);
     1008                        spinlock_unlock(&zones.lock);
     1009                        interrupts_restore(ipl);
     1010                       
    9961011                        freed = slab_reclaim(SLAB_RECLAIM_ALL);
    997                         irq_spinlock_lock(&zones.lock, true);
     1012                       
     1013                        ipl = interrupts_disable();
     1014                        spinlock_lock(&zones.lock);
    9981015                       
    9991016                        if (freed > 0)
     
    10051022        if (znum == (size_t) -1) {
    10061023                if (flags & FRAME_ATOMIC) {
    1007                         irq_spinlock_unlock(&zones.lock, true);
     1024                        spinlock_unlock(&zones.lock);
     1025                        interrupts_restore(ipl);
    10081026                        return NULL;
    10091027                }
     
    10131031#endif
    10141032               
    1015                 irq_spinlock_unlock(&zones.lock, true);
    1016                
     1033                spinlock_unlock(&zones.lock);
     1034                interrupts_restore(ipl);
     1035
    10171036                if (!THREAD)
    10181037                        panic("Cannot wait for memory to become available.");
     
    10501069            + zones.info[znum].base;
    10511070       
    1052         irq_spinlock_unlock(&zones.lock, true);
     1071        spinlock_unlock(&zones.lock);
     1072        interrupts_restore(ipl);
    10531073       
    10541074        if (pzone)
     
    10721092void frame_free(uintptr_t frame)
    10731093{
    1074         irq_spinlock_lock(&zones.lock, true);
     1094        ipl_t ipl = interrupts_disable();
     1095        spinlock_lock(&zones.lock);
    10751096       
    10761097        /*
     
    10841105        zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base);
    10851106       
    1086         irq_spinlock_unlock(&zones.lock, true);
     1107        spinlock_unlock(&zones.lock);
     1108        interrupts_restore(ipl);
    10871109       
    10881110        /*
     
    11101132void frame_reference_add(pfn_t pfn)
    11111133{
    1112         irq_spinlock_lock(&zones.lock, true);
     1134        ipl_t ipl = interrupts_disable();
     1135        spinlock_lock(&zones.lock);
    11131136       
    11141137        /*
     
    11211144        zones.info[znum].frames[pfn - zones.info[znum].base].refcount++;
    11221145       
    1123         irq_spinlock_unlock(&zones.lock, true);
    1124 }
    1125 
    1126 /** Mark given range unavailable in frame zones.
    1127  *
    1128  */
     1146        spinlock_unlock(&zones.lock);
     1147        interrupts_restore(ipl);
     1148}
     1149
     1150/** Mark given range unavailable in frame zones. */
    11291151void frame_mark_unavailable(pfn_t start, size_t count)
    11301152{
    1131         irq_spinlock_lock(&zones.lock, true);
     1153        ipl_t ipl = interrupts_disable();
     1154        spinlock_lock(&zones.lock);
    11321155       
    11331156        size_t i;
     
    11411164        }
    11421165       
    1143         irq_spinlock_unlock(&zones.lock, true);
    1144 }
    1145 
    1146 /** Initialize physical memory management.
    1147  *
    1148  */
     1166        spinlock_unlock(&zones.lock);
     1167        interrupts_restore(ipl);
     1168}
     1169
     1170/** Initialize physical memory management. */
    11491171void frame_init(void)
    11501172{
    11511173        if (config.cpu_active == 1) {
    11521174                zones.count = 0;
    1153                 irq_spinlock_initialize(&zones.lock, "frame.zones.lock");
     1175                spinlock_initialize(&zones.lock, "zones.lock");
    11541176                mutex_initialize(&mem_avail_mtx, MUTEX_ACTIVE);
    11551177                condvar_initialize(&mem_avail_cv);
     
    11821204}
    11831205
    1184 /** Return total size of all zones.
    1185  *
    1186  */
     1206/** Return total size of all zones. */
    11871207uint64_t zones_total_size(void)
    11881208{
    1189         irq_spinlock_lock(&zones.lock, true);
     1209        ipl_t ipl = interrupts_disable();
     1210        spinlock_lock(&zones.lock);
    11901211       
    11911212        uint64_t total = 0;
     
    11941215                total += (uint64_t) FRAMES2SIZE(zones.info[i].count);
    11951216       
    1196         irq_spinlock_unlock(&zones.lock, true);
     1217        spinlock_unlock(&zones.lock);
     1218        interrupts_restore(ipl);
    11971219       
    11981220        return total;
     
    12071229        ASSERT(free != NULL);
    12081230       
    1209         irq_spinlock_lock(&zones.lock, true);
     1231        ipl_t ipl = interrupts_disable();
     1232        spinlock_lock(&zones.lock);
    12101233       
    12111234        *total = 0;
     
    12251248        }
    12261249       
    1227         irq_spinlock_unlock(&zones.lock, true);
    1228 }
    1229 
    1230 /** Prints list of zones.
    1231  *
    1232  */
     1250        spinlock_unlock(&zones.lock);
     1251        interrupts_restore(ipl);
     1252}
     1253
     1254/** Prints list of zones. */
    12331255void zones_print_list(void)
    12341256{
     
    12561278        size_t i;
    12571279        for (i = 0;; i++) {
    1258                 irq_spinlock_lock(&zones.lock, true);
     1280                ipl_t ipl = interrupts_disable();
     1281                spinlock_lock(&zones.lock);
    12591282               
    12601283                if (i >= zones.count) {
    1261                         irq_spinlock_unlock(&zones.lock, true);
     1284                        spinlock_unlock(&zones.lock);
     1285                        interrupts_restore(ipl);
    12621286                        break;
    12631287                }
     
    12691293                size_t busy_count = zones.info[i].busy_count;
    12701294               
    1271                 irq_spinlock_unlock(&zones.lock, true);
     1295                spinlock_unlock(&zones.lock);
     1296                interrupts_restore(ipl);
    12721297               
    12731298                bool available = zone_flags_available(flags);
     
    13031328void zone_print_one(size_t num)
    13041329{
    1305         irq_spinlock_lock(&zones.lock, true);
     1330        ipl_t ipl = interrupts_disable();
     1331        spinlock_lock(&zones.lock);
    13061332        size_t znum = (size_t) -1;
    13071333       
     
    13151341       
    13161342        if (znum == (size_t) -1) {
    1317                 irq_spinlock_unlock(&zones.lock, true);
     1343                spinlock_unlock(&zones.lock);
     1344                interrupts_restore(ipl);
    13181345                printf("Zone not found.\n");
    13191346                return;
     
    13261353        size_t busy_count = zones.info[i].busy_count;
    13271354       
    1328         irq_spinlock_unlock(&zones.lock, true);
     1355        spinlock_unlock(&zones.lock);
     1356        interrupts_restore(ipl);
    13291357       
    13301358        bool available = zone_flags_available(flags);
Note: See TracChangeset for help on using the changeset viewer.