Subversion Repositories HelenOS-historic

Rev

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

Rev 766 Rev 767
Line 94... Line 94...
94
    }
94
    }
95
 
95
 
96
    slab->start = data;
96
    slab->start = data;
97
    slab->available = cache->objects;
97
    slab->available = cache->objects;
98
    slab->nextavail = 0;
98
    slab->nextavail = 0;
-
 
99
    slab->cache = cache;
99
 
100
 
100
    for (i=0; i<cache->objects;i++)
101
    for (i=0; i<cache->objects;i++)
101
        *((int *) (slab->start + i*cache->size)) = i+1;
102
        *((int *) (slab->start + i*cache->size)) = i+1;
102
 
103
 
103
    atomic_inc(&cache->allocated_slabs);
104
    atomic_inc(&cache->allocated_slabs);
Line 149... Line 150...
149
    count_t frames = 0;
150
    count_t frames = 0;
150
 
151
 
151
    if (!slab)
152
    if (!slab)
152
        slab = obj2slab(obj);
153
        slab = obj2slab(obj);
153
 
154
 
-
 
155
    ASSERT(slab->cache == cache);
-
 
156
 
154
    *((int *)obj) = slab->nextavail;
157
    *((int *)obj) = slab->nextavail;
155
    slab->nextavail = (obj - slab->start)/cache->size;
158
    slab->nextavail = (obj - slab->start)/cache->size;
156
    slab->available++;
159
    slab->available++;
157
 
160
 
158
    /* Move it to correct list */
161
    /* Move it to correct list */
Line 228... Line 231...
228
                slab_magazine_t *mag)
231
                slab_magazine_t *mag)
229
{
232
{
230
    int i;
233
    int i;
231
    count_t frames = 0;
234
    count_t frames = 0;
232
 
235
 
233
    for (i=0;i < mag->busy; i++)
236
    for (i=0;i < mag->busy; i++) {
234
        frames += slab_obj_destroy(cache, mag->objs[i], NULL);
237
        frames += slab_obj_destroy(cache, mag->objs[i], NULL);
-
 
238
        atomic_dec(&cache->cached_objs);
-
 
239
    }
235
   
240
   
236
    slab_free(&mag_cache, mag);
241
    slab_free(&mag_cache, mag);
237
 
242
 
238
    return frames;
243
    return frames;
239
}
244
}
Line 244... Line 249...
244
 * @return Pointer to object or NULL if not available
249
 * @return Pointer to object or NULL if not available
245
 */
250
 */
246
static void * magazine_obj_get(slab_cache_t *cache)
251
static void * magazine_obj_get(slab_cache_t *cache)
247
{
252
{
248
    slab_magazine_t *mag;
253
    slab_magazine_t *mag;
-
 
254
    void *obj;
249
 
255
 
250
    spinlock_lock(&cache->mag_cache[CPU->id].lock);
256
    spinlock_lock(&cache->mag_cache[CPU->id].lock);
251
 
257
 
252
    mag = cache->mag_cache[CPU->id].current;
258
    mag = cache->mag_cache[CPU->id].current;
253
    if (!mag)
259
    if (!mag)
Line 277... Line 283...
277
        list_remove(&mag->link);
283
        list_remove(&mag->link);
278
       
284
       
279
        spinlock_unlock(&cache->lock);
285
        spinlock_unlock(&cache->lock);
280
    }
286
    }
281
gotit:
287
gotit:
-
 
288
    obj = mag->objs[--mag->busy];
282
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
289
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
-
 
290
    atomic_dec(&cache->cached_objs);
-
 
291
   
283
    return mag->objs[--mag->busy];
292
    return obj;
284
out:   
293
out:   
285
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
294
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
286
    return NULL;
295
    return NULL;
287
}
296
}
288
 
297
 
Line 335... Line 344...
335
        cache->mag_cache[CPU->id].current = mag;
344
        cache->mag_cache[CPU->id].current = mag;
336
    }
345
    }
337
    mag->objs[mag->busy++] = obj;
346
    mag->objs[mag->busy++] = obj;
338
 
347
 
339
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
348
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
-
 
349
    atomic_inc(&cache->cached_objs);
340
    return 0;
350
    return 0;
341
errout:
351
errout:
342
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
352
    spinlock_unlock(&cache->mag_cache[CPU->id].lock);
343
    return -1;
353
    return -1;
344
}
354
}
Line 465... Line 475...
465
        spinlock_lock(&cache->mag_cache[i].lock);
475
        spinlock_lock(&cache->mag_cache[i].lock);
466
    spinlock_lock(&cache->lock);
476
    spinlock_lock(&cache->lock);
467
   
477
   
468
    if (flags & SLAB_RECLAIM_ALL) {
478
    if (flags & SLAB_RECLAIM_ALL) {
469
        /* Aggressive memfree */
479
        /* Aggressive memfree */
470
 
-
 
471
        /* Destroy CPU magazines */
480
        /* Destroy CPU magazines */
472
        for (i=0; i<config.cpu_count; i++) {
481
        for (i=0; i<config.cpu_count; i++) {
473
            mag = cache->mag_cache[i].current;
482
            mag = cache->mag_cache[i].current;
474
            if (mag)
483
            if (mag)
475
                frames += magazine_destroy(cache, mag);
484
                frames += magazine_destroy(cache, mag);
Line 481... Line 490...
481
            cache->mag_cache[i].last = NULL;
490
            cache->mag_cache[i].last = NULL;
482
        }
491
        }
483
    }
492
    }
484
    /* Destroy full magazines */
493
    /* Destroy full magazines */
485
    cur=cache->magazines.prev;
494
    cur=cache->magazines.prev;
-
 
495
 
486
    while (cur!=&cache->magazines) {
496
    while (cur!=&cache->magazines) {
487
        mag = list_get_instance(cur, slab_magazine_t, link);
497
        mag = list_get_instance(cur, slab_magazine_t, link);
488
       
498
       
489
        cur = cur->prev;
499
        cur = cur->prev;
490
        list_remove(cur->next);
500
        list_remove(cur->next);
-
 
501
//      list_remove(&mag->link);
491
        frames += magazine_destroy(cache,mag);
502
        frames += magazine_destroy(cache,mag);
492
        /* If we do not do full reclaim, break
503
        /* If we do not do full reclaim, break
493
         * as soon as something is freed */
504
         * as soon as something is freed */
494
        if (!(flags & SLAB_RECLAIM_ALL) && frames)
505
        if (!(flags & SLAB_RECLAIM_ALL) && frames)
495
            break;
506
            break;
Line 594... Line 605...
594
{
605
{
595
    slab_cache_t *cache;
606
    slab_cache_t *cache;
596
    link_t *cur;
607
    link_t *cur;
597
 
608
 
598
    spinlock_lock(&slab_cache_lock);
609
    spinlock_lock(&slab_cache_lock);
599
    printf("SLAB name\tOsize\tPages\tOcnt\tSlabs\tAllocobjs\tCtl\n");
610
    printf("SLAB name\tOsize\tPages\tObj/pg\tSlabs\tCached\tAllocobjs\tCtl\n");
600
    for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) {
611
    for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) {
601
        cache = list_get_instance(cur, slab_cache_t, link);
612
        cache = list_get_instance(cur, slab_cache_t, link);
602
        printf("%s\t%d\t%d\t%d\t%d\t%d\t\t%s\n", cache->name, cache->size,
613
        printf("%s\t%d\t%d\t%d\t%d\t%d\t%d\t\t%s\n", cache->name, cache->size,
603
               (1 << cache->order), cache->objects,
614
               (1 << cache->order), cache->objects,
604
               atomic_get(&cache->allocated_slabs),
615
               atomic_get(&cache->allocated_slabs),
-
 
616
               atomic_get(&cache->cached_objs),
605
               atomic_get(&cache->allocated_objs),
617
               atomic_get(&cache->allocated_objs),
606
               cache->flags & SLAB_CACHE_SLINSIDE ? "In" : "Out");
618
               cache->flags & SLAB_CACHE_SLINSIDE ? "In" : "Out");
607
    }
619
    }
608
    spinlock_unlock(&slab_cache_lock);
620
    spinlock_unlock(&slab_cache_lock);
609
}
621
}