2 #include "../port/lib.h"
6 #include "../port/error.h"
13 return ((cm->klimit - cm->kbase) + BY2PG-1) / BY2PG;
24 if(palloc.pages == nil){
28 for(i=0; i<nelem(conf.mem); i++){
30 np += cm->npage - nkpages(cm);
32 palloc.pages = xalloc(np*sizeof(Page));
33 if(palloc.pages == nil)
44 for(i=0; i<nelem(conf.mem); i++){
46 for(j=nkpages(cm); j<cm->npage; j++){
47 memset(p, 0, sizeof *p);
48 p->pa = cm->base+j*BY2PG;
49 if(cankaddr(p->pa) && (KADDR(p->pa) == nil || KADDR(p->pa) == (void*)-BY2PG))
52 color = (color+1)%NCOLOR;
59 palloc.user = p - palloc.pages;
60 u = palloc.user*BY2PG;
61 v = u + conf.nswap*BY2PG;
64 swapalloc.highwater = (palloc.user*5)/100;
65 swapalloc.headroom = swapalloc.highwater + (swapalloc.highwater/4);
68 for(i=0; i<nelem(conf.mem); i++)
70 m += conf.mem[i].npage*BY2PG;
71 m += PGROUND(end - (char*)KTZERO);
73 print("%lldM memory: ", (m+1024*1024-1)/(1024*1024));
74 print("%lldM kernel data, ", (m-u+1024*1024-1)/(1024*1024));
75 print("%lldM user, ", u/(1024*1024));
76 print("%lldM swap\n", v/(1024*1024));
82 if(palloc.pwait[0].p != nil && wakeup(&palloc.pwait[0]) != nil)
84 if(palloc.pwait[1].p != nil)
85 wakeup(&palloc.pwait[1]);
89 freepages(Page *head, Page *tail, ulong np)
103 tail->next = palloc.head;
105 palloc.freecount += np;
111 pagereclaim(Image *i)
113 Page **h, **l, **x, *p;
126 for(h = i->pghash; h < &i->pghash[PGHSIZE]; h++){
129 for(p = *l; p != nil; p = p->next){
157 freepages(fh, ft, np);
165 return palloc.freecount > swapalloc.highwater || up->noswap && palloc.freecount > 0;
169 newpage(int clear, Segment **s, uintptr va)
176 while(!ispages(nil)){
184 q = &palloc.pwait[!up->noswap];
188 sleep(q, ispages, nil);
196 * If called from fault and we lost the segment from
197 * underneath don't waste time allocating and freeing
198 * a page. Fault will call newpage again when it has
199 * reacquired the segment locks
208 /* First try for our colour */
209 color = getpgcolor(va);
211 for(p = *l; p != nil; p = p->next){
212 if(p->color == color)
234 memset((void*)VA(k), 0, BY2PG);
248 if(p->image != nil) {
257 copypage(Page *f, Page *t)
263 memmove((void*)VA(kd), (void*)VA(ks), BY2PG);
269 cachepage(Page *p, Image *i)
275 h = &PGHASH(i, p->daddr);
298 l = &PGHASH(i, p->daddr);
299 for(x = *l; x != nil; x = x->next) {
315 lookpage(Image *i, uintptr daddr)
320 l = h = &PGHASH(i, daddr);
321 for(p = *l; p != nil; p = p->next){
322 if(p->daddr == daddr){
338 cachedel(Image *i, uintptr daddr)
342 while((p = lookpage(i, daddr)) != nil){
356 dst = &new->pages[old->first-old->pages];
358 for(src = old->first; src <= old->last; src++, dst++)
376 new = smalloc(sizeof(Pte));
377 new->first = &new->pages[PTEPERTAB];
378 new->last = new->pages;
383 freepte(Segment*, Pte *p)