Subversion Repositories HelenOS-historic

Rev

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

Rev 703 Rev 724
Line 131... Line 131...
131
       
131
       
132
        panic("Sleep not implemented.\n");
132
        panic("Sleep not implemented.\n");
133
        goto loop;
133
        goto loop;
134
    }
134
    }
135
       
135
       
136
 
-
 
137
    /* Allocate frames from zone buddy system */
136
    /* Allocate frames from zone buddy system */
138
    tmp = buddy_system_alloc(zone->buddy_system, order);
137
    tmp = buddy_system_alloc(zone->buddy_system, order);
139
   
138
   
140
    ASSERT(tmp);
139
    ASSERT(tmp);
141
   
140
   
Line 158... Line 157...
158
   
157
   
159
    if (flags & FRAME_NON_BLOCKING) {
158
    if (flags & FRAME_NON_BLOCKING) {
160
        ASSERT(status != NULL);
159
        ASSERT(status != NULL);
161
        *status = FRAME_OK;
160
        *status = FRAME_OK;
162
    }
161
    }
163
   
-
 
164
    return v;
162
    return v;
165
}
163
}
166
 
164
 
167
/** Free a frame.
165
/** Free a frame.
168
 *
166
 *
Line 177... Line 175...
177
    ipl_t ipl;
175
    ipl_t ipl;
178
    link_t *cur;
176
    link_t *cur;
179
    zone_t *z;
177
    zone_t *z;
180
    zone_t *zone = NULL;
178
    zone_t *zone = NULL;
181
    frame_t *frame;
179
    frame_t *frame;
-
 
180
    int order;
-
 
181
   
182
    ASSERT(addr % FRAME_SIZE == 0);
182
    ASSERT(addr % FRAME_SIZE == 0);
183
   
183
   
184
    ipl = interrupts_disable();
184
    ipl = interrupts_disable();
185
    spinlock_lock(&zone_head_lock);
185
    spinlock_lock(&zone_head_lock);
186
   
186
   
Line 207... Line 207...
207
    }
207
    }
208
   
208
   
209
    ASSERT(zone != NULL);
209
    ASSERT(zone != NULL);
210
   
210
   
211
    frame = ADDR2FRAME(zone, addr);
211
    frame = ADDR2FRAME(zone, addr);
-
 
212
   
-
 
213
    /* remember frame order */
-
 
214
    order = frame->buddy_order;
212
 
215
 
213
    ASSERT(frame->refcount);
216
    ASSERT(frame->refcount);
214
 
217
 
215
    if (!--frame->refcount) {
218
    if (!--frame->refcount) {
216
        buddy_system_free(zone->buddy_system, &frame->buddy_link);
219
        buddy_system_free(zone->buddy_system, &frame->buddy_link);
217
    }
220
    }
218
 
221
 
219
    /* Update zone information. */
222
    /* Update zone information. */
220
    zone->free_count += (1 << frame->buddy_order);
223
    zone->free_count += (1 << order);
221
    zone->busy_count -= (1 << frame->buddy_order);
224
    zone->busy_count -= (1 << order);
222
   
225
   
223
    spinlock_unlock(&zone->lock);
226
    spinlock_unlock(&zone->lock);
224
    spinlock_unlock(&zone_head_lock);
227
    spinlock_unlock(&zone_head_lock);
225
    interrupts_restore(ipl);
228
    interrupts_restore(ipl);
226
}
229
}
Line 319... Line 322...
319
    if (z) {
322
    if (z) {
320
        link_initialize(&z->link);
323
        link_initialize(&z->link);
321
        spinlock_initialize(&z->lock, "zone_lock");
324
        spinlock_initialize(&z->lock, "zone_lock");
322
   
325
   
323
        z->base = start;
326
        z->base = start;
-
 
327
        z->base_index = start / FRAME_SIZE;
-
 
328
       
324
        z->flags = flags;
329
        z->flags = flags;
325
 
330
 
326
        z->free_count = cnt;
331
        z->free_count = cnt;
327
        z->busy_count = 0;
332
        z->busy_count = 0;
328
       
333
       
Line 346... Line 351...
346
        /* Stuffing frames */
351
        /* Stuffing frames */
347
        for (i = 0; i<cnt; i++) {
352
        for (i = 0; i<cnt; i++) {
348
            z->frames[i].refcount = 0;
353
            z->frames[i].refcount = 0;
349
            buddy_system_free(z->buddy_system, &z->frames[i].buddy_link);  
354
            buddy_system_free(z->buddy_system, &z->frames[i].buddy_link);  
350
        }
355
        }
-
 
356
       
351
    }
357
    }
352
    return z;
358
    return z;
353
}
359
}
354
 
360
 
355
/** Attach frame zone
361
/** Attach frame zone
Line 398... Line 404...
398
    index_t index;
404
    index_t index;
399
    bool is_left, is_right;
405
    bool is_left, is_right;
400
 
406
 
401
    frame = list_get_instance(block, frame_t, buddy_link);
407
    frame = list_get_instance(block, frame_t, buddy_link);
402
    zone = (zone_t *) b->data;
408
    zone = (zone_t *) b->data;
-
 
409
    ASSERT(IS_BUDDY_ORDER_OK(FRAME_INDEX_ABS(zone, frame), frame->buddy_order));
403
   
410
   
404
    ASSERT(IS_BUDDY_ORDER_OK(FRAME_INDEX(zone, frame), frame->buddy_order));
-
 
405
   
411
   
406
    is_left = IS_BUDDY_LEFT_BLOCK(zone, frame);
412
    is_left = IS_BUDDY_LEFT_BLOCK_ABS(zone, frame);
407
    is_right = IS_BUDDY_RIGHT_BLOCK(zone, frame);
413
    is_right = IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame);
408
   
414
   
409
    ASSERT(is_left ^ is_right);
415
    ASSERT(is_left ^ is_right);
410
   
416
   
411
    if (is_left) {
417
    if (is_left) {
412
        index = (FRAME_INDEX(zone, frame)) + (1 << frame->buddy_order);
418
        index = (FRAME_INDEX(zone, frame)) + (1 << frame->buddy_order);