Subversion Repositories HelenOS-historic

Rev

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

Rev 1757 Rev 1760
Line 160... Line 160...
160
    void *data;
160
    void *data;
161
    slab_t *slab;
161
    slab_t *slab;
162
    size_t fsize;
162
    size_t fsize;
163
    int i;
163
    int i;
164
    int status;
164
    int status;
165
    pfn_t pfn;
-
 
166
    int zone=0;
165
    int zone=0;
167
   
166
   
168
    pfn = frame_alloc_rc_zone(cache->order, FRAME_KA | flags, &status, &zone);
167
    data = frame_alloc_rc_zone(cache->order, FRAME_KA | flags, &status, &zone);
169
    data = (void *) PA2KA(PFN2ADDR(pfn));
-
 
170
    if (status != FRAME_OK) {
168
    if (status != FRAME_OK) {
171
        return NULL;
169
        return NULL;
172
    }
170
    }
173
    if (! (cache->flags & SLAB_CACHE_SLINSIDE)) {
171
    if (! (cache->flags & SLAB_CACHE_SLINSIDE)) {
174
        slab = slab_alloc(slab_extern_cache, flags);
172
        slab = slab_alloc(slab_extern_cache, flags);
175
        if (!slab) {
173
        if (!slab) {
176
            frame_free(ADDR2PFN(KA2PA(data)));
174
            frame_free(KA2PA(data));
177
            return NULL;
175
            return NULL;
178
        }
176
        }
179
    } else {
177
    } else {
180
        fsize = (PAGE_SIZE << cache->order);
178
        fsize = (PAGE_SIZE << cache->order);
181
        slab = data + fsize - sizeof(*slab);
179
        slab = data + fsize - sizeof(*slab);
182
    }
180
    }
183
   
181
   
184
    /* Fill in slab structures */
182
    /* Fill in slab structures */
185
    for (i=0; i < (1 << cache->order); i++)
183
    for (i=0; i < (1 << cache->order); i++)
186
        frame_set_parent(pfn+i, slab, zone);
184
        frame_set_parent(ADDR2PFN(KA2PA(data))+i, slab, zone);
187
 
185
 
188
    slab->start = data;
186
    slab->start = data;
189
    slab->available = cache->objects;
187
    slab->available = cache->objects;
190
    slab->nextavail = 0;
188
    slab->nextavail = 0;
191
    slab->cache = cache;
189
    slab->cache = cache;
Line 202... Line 200...
202
 *
200
 *
203
 * @return number of freed frames
201
 * @return number of freed frames
204
 */
202
 */
205
static count_t slab_space_free(slab_cache_t *cache, slab_t *slab)
203
static count_t slab_space_free(slab_cache_t *cache, slab_t *slab)
206
{
204
{
207
    frame_free(ADDR2PFN(KA2PA(slab->start)));
205
    frame_free(KA2PA(slab->start));
208
    if (! (cache->flags & SLAB_CACHE_SLINSIDE))
206
    if (! (cache->flags & SLAB_CACHE_SLINSIDE))
209
        slab_free(slab_extern_cache, slab);
207
        slab_free(slab_extern_cache, slab);
210
 
208
 
211
    atomic_dec(&cache->allocated_slabs);
209
    atomic_dec(&cache->allocated_slabs);
212
   
210