Subversion Repositories HelenOS

Rev

Rev 3188 | Rev 3206 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3188 Rev 3205
Line 1212... Line 1212...
1212
{
1212
{
1213
    zone_t *zone = NULL;
1213
    zone_t *zone = NULL;
1214
    unsigned int i;
1214
    unsigned int i;
1215
    ipl_t ipl;
1215
    ipl_t ipl;
1216
 
1216
 
1217
    ipl = interrupts_disable();
-
 
1218
    spinlock_lock(&zones.lock);
-
 
1219
 
-
 
1220
#ifdef __32_BITS__  
1217
#ifdef __32_BITS__  
1221
    printf("#  base address free frames  busy frames\n");
1218
    printf("#  base address free frames  busy frames\n");
1222
    printf("-- ------------ ------------ ------------\n");
1219
    printf("-- ------------ ------------ ------------\n");
1223
#endif
1220
#endif
1224
 
1221
 
1225
#ifdef __64_BITS__
1222
#ifdef __64_BITS__
1226
    printf("#  base address         free frames  busy frames\n");
1223
    printf("#  base address         free frames  busy frames\n");
1227
    printf("-- -------------------- ------------ ------------\n");
1224
    printf("-- -------------------- ------------ ------------\n");
1228
#endif
1225
#endif
1229
   
1226
   
-
 
1227
    /*
-
 
1228
     * Because printing may require allocation of memory, we may not hold
-
 
1229
     * the frame allocator locks when printing zone statistics.  Therefore,
-
 
1230
     * we simply gather the statistics under the protection of the locks and
-
 
1231
     * print the statistics when the locks have been released.
-
 
1232
     *
-
 
1233
     * When someone adds/removes zones while we are printing the statistics,
-
 
1234
     * we may end up with inaccurate output (e.g. a zone being skipped from
-
 
1235
     * the listing).
-
 
1236
     */
-
 
1237
 
1230
    for (i = 0; i < zones.count; i++) {
1238
    for (i = 0; ; i++) {
-
 
1239
        uintptr_t base;
-
 
1240
        count_t free_count;
-
 
1241
        count_t busy_count;
-
 
1242
 
-
 
1243
        ipl = interrupts_disable();
-
 
1244
        spinlock_lock(&zones.lock);
-
 
1245
       
-
 
1246
        if (i >= zones.count) {
-
 
1247
            spinlock_unlock(&zones.lock);
-
 
1248
            interrupts_restore(ipl);
-
 
1249
            break;
-
 
1250
        }
-
 
1251
 
1231
        zone = zones.info[i];
1252
        zone = zones.info[i];
1232
        spinlock_lock(&zone->lock);
1253
        spinlock_lock(&zone->lock);
1233
 
1254
 
-
 
1255
        base = PFN2ADDR(zone->base);
-
 
1256
        free_count = zone->free_count;
-
 
1257
        busy_count = zone->busy_count;
-
 
1258
 
-
 
1259
        spinlock_unlock(&zone->lock);
-
 
1260
       
-
 
1261
        spinlock_unlock(&zones.lock);
-
 
1262
        interrupts_restore(ipl);
-
 
1263
 
1234
#ifdef __32_BITS__
1264
#ifdef __32_BITS__
1235
        printf("%-2u   %10p %12" PRIc " %12" PRIc "\n",
1265
        printf("%-2u   %10p %12" PRIc " %12" PRIc "\n", i, base,
1236
            i, PFN2ADDR(zone->base), zone->free_count,
-
 
1237
            zone->busy_count);
1266
            free_count, busy_count);
1238
#endif
1267
#endif
1239
 
1268
 
1240
#ifdef __64_BITS__
1269
#ifdef __64_BITS__
1241
        printf("%-2u   %18p %12" PRIc " %12" PRIc "\n", i,
1270
        printf("%-2u   %18p %12" PRIc " %12" PRIc "\n", i, base,
1242
            PFN2ADDR(zone->base), zone->free_count, zone->busy_count);
1271
            free_count, busy_count);
1243
#endif
1272
#endif
1244
       
1273
       
1245
        spinlock_unlock(&zone->lock);
-
 
1246
    }
1274
    }
1247
   
-
 
1248
    spinlock_unlock(&zones.lock);
-
 
1249
    interrupts_restore(ipl);
-
 
1250
}
1275
}
1251
 
1276
 
1252
/** Prints zone details.
1277
/** Prints zone details.
1253
 *
1278
 *
1254
 * @param num       Zone base address or zone number.
1279
 * @param num       Zone base address or zone number.