Subversion Repositories Kolibri OS

Rev

Rev 1066 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1066 serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
7
 
8
extern u32_t mem_amount;
9
10
 
11
12
 
13
14
 
15
16
 
17
{
18
    link_t    link;
19
    SPINLOCK_DECLARE(lock);
20
    u32_t     state;
21
    void     *parent;
22
    count_t   avail;
23
    addr_t    base;
24
    index_t   next;
25
    int       list[512];
26
}pslab_t;
27
28
 
29
{
30
    SPINLOCK_DECLARE(lock);
31
32
 
33
34
 
35
    link_t   partial_slabs;        /**< List of partial slabs */
36
}pcache_t;
37
38
 
39
40
 
41
42
 
43
 
44
 
45
{
46
    int i;
47
48
 
49
    u32_t     size;
50
    count_t   pages;
51
    size_t    conf_size;
52
    size_t    core_size;
53
    pslab_t  *slab;
54
55
 
56
    DBG("last page = %x total pages =  %x\n",mem_amount, pages);
57
58
 
59
    DBG("conf_size = %x  free mem start =%x\n",conf_size, pg_balloc);
60
61
 
62
    zone_release(&z_core, 0, pages);
63
    zone_reserve(&z_core, 0, pg_balloc >> PAGE_WIDTH);
64
65
 
66
    list_initialize(&page_cache.partial_slabs);
67
68
 
69
70
 
71
72
 
73
    page_cache.partial_count++;
74
    list_prepend(&slab->link, &page_cache.partial_slabs);
75
};
76
77
 
78
static unsigned int badness(index_t order, size_t size)
79
{
80
	unsigned int objects;
81
	unsigned int ssize;
82
83
 
84
    objects = (PAGE_SIZE << order) / size;
85
	return ssize - objects * size;
86
}
87
88
 
89
90
 
91
 
92
{
93
    pslab_t  *slab;
94
    link_t   *tmp;
95
96
 
97
98
 
99
100
 
101
    {
102
        frame_t     *frame;
103
        int          i;
104
        addr_t       v;
105
106
 
107
        z_core.free_count -= 512;
108
        z_core.busy_count += 512;
109
110
 
111
112
 
113
        frame = (frame_t*)tmp;
114
115
 
116
117
 
118
119
 
120
121
 
122
                frame[i].parent = slab;
123
124
 
125
126
 
127
        slab->next  = 0;
128
129
 
130
            slab->list[i] = i + 1;
131
132
 
133
    else
134
    {
135
        spinlock_unlock(&z_core.lock);
136
        slab = NULL;
137
    };
138
139
 
140
141
 
142
}
143
144
 
145
{
146
    u32_t     order;
147
    count_t   idx;
148
    frame_t  *frame;
149
150
 
151
 
152
153
 
154
155
 
156
	order = frame->buddy_order;
157
158
 
159
160
 
161
    {
162
        spinlock_lock(&z_core.lock);
163
164
 
165
166
 
167
        z_core.free_count += (1 << order);
168
        z_core.busy_count -= (1 << order);
169
170
 
171
    }
172
}
173
174
 
175
fslab_t *create_slab(index_t order, size_t size)
176
{
177
    fslab_t *slab;
178
179
 
180
181
 
182
    {
183
        link_t      *tmp;
184
185
 
186
187
 
188
        ASSERT(tmp);
189
190
 
191
        {
192
            frame_t     *frame;
193
            count_t      objects;
194
            count_t      i;
195
            addr_t       v;
196
197
 
198
            z_core.free_count -= (1 << order);
199
            z_core.busy_count += (1 << order);
200
201
 
202
203
 
204
            frame = (frame_t*)tmp;
205
206
 
207
                frame[i].parent = slab;
208
209
 
210
            v = z_core.base + (index_t)(frame - z_core.frames);
211
212
 
213
214
 
215
            slab->next  = 0;
216
217
 
218
219
 
220
                slab->list[i] = i + 1;
221
        }
222
        else
223
        {
224
            spinlock_unlock(&z_core.lock);
225
            frame_free(KA2PA(slab));
226
            slab = NULL;
227
        };
228
    };
229
230
 
231
}
232
233
 
234
{
235
    u32_t order;
236
    count_t idx;
237
    frame_t *frame;
238
239
 
240
    frame = &z_core.frames[idx];
241
242
 
243
	order = frame->buddy_order;
244
245
 
246
247
 
248
    {
249
        spinlock_lock(&z_core.lock);
250
251
 
252
253
 
254
        z_core.free_count += (1 << order);
255
        z_core.busy_count -= (1 << order);
256
257
 
258
    }
259
260
 
261
262
 
263
#endif
264
265
 
266
{
267
    eflags_t  efl;
268
    pslab_t  *slab;
269
    addr_t    frame;
270
271
 
272
273
 
274
275
 
276
    {
277
        slab = create_page_slab();
278
        if (!slab)
279
        {
280
            spinlock_unlock(&page_cache.lock);
281
            safe_sti(efl);
282
            return 0;
283
        }
284
        slab->parent = &page_cache;
285
        slab->state  = 1;
286
        page_cache.partial_count++;
287
        list_prepend(&slab->link, &page_cache.partial_slabs);
288
    }
289
    else
290
        slab = (pslab_t*)page_cache.partial_slabs.next;
291
292
 
293
    slab->next = slab->list[slab->next];
294
295
 
296
    if( slab->avail == 0 )
297
    {
298
        slab->state  = 0;
299
        list_remove(&slab->link);
300
        list_prepend(&slab->link, &page_cache.full_slabs);
301
        page_cache.partial_count--;
302
        DBG("%s insert empty page slab\n", __FUNCTION__);
2971 Serge 303
    };
1066 serge 304
    spinlock_unlock(&page_cache.lock);
305
306
 
307
308
 
309
310
 
311
}
312
313
 
314
 
315
{
316
    addr_t    frame;
317
318
 
319
    {
320
        eflags_t  efl;
321
        index_t   order;
322
        frame_t  *tmp;
323
        count_t   i;
324
325
 
326
327
 
328
329
 
330
331
 
332
333
 
334
335
 
336
        z_core.busy_count += (1 << order);
337
338
 
339
            tmp[i].parent = NULL;
340
341
 
342
343
 
344
345
 
346
                (index_t)(tmp - z_core.frames)) << PAGE_WIDTH;
347
348
 
349
 
350
             frame, order, z_core.free_count);
351
    }
352
    else
353
        frame = alloc_page();
354
355
 
356
}
357
358
 
359
{
360
    eflags_t  efl;
361
    index_t   idx;
362
    frame_t  *frame;
363
    size_t    frame_size;
364
365
 
366
367
 
368
        (idx >= z_core.base+z_core.count)) {
369
        DBG("%s: invalid address %x\n", __FUNCTION__, addr);
370
        return 0;
371
    }
372
373
 
374
375
 
376
377
 
378
    {
379
        pslab_t  *slab;
380
381
 
382
383
 
384
385
 
386
387
 
388
389
 
390
        slab->next = idx;
391
392
 
393
394
 
395
             (slab->avail >= 4))
396
        {
397
            slab->state = 1;
398
            list_remove(&slab->link);
2971 Serge 399
            list_prepend(&slab->link, &page_cache.partial_slabs);
400
            page_cache.partial_count++;
401
1066 serge 402
 
403
        }
404
        spinlock_unlock(&page_cache.lock);
405
406
 
407
    }
408
    else
409
    {
410
        count_t   order;
411
412
 
413
414
 
415
416
 
417
418
 
419
420
 
421
        {
422
            buddy_system_free(&frame->buddy_link);
423
424
 
425
            z_core.free_count += (1 << order);
426
            z_core.busy_count -= (1 << order);
427
        }
428
        spinlock_unlock(&z_core.lock);
429
430
 
431
    };
432
    safe_sti(efl);
433
434
 
435
}
436
437
 
438
{
439
   return z_core.free_count;
440
}
441