clean up paging code. - eliminate onswap() because it is not supported (that leaves pagedout() looking kind of funny, doesn't it?) - eliminate funny pagechainhead/pageunchainhead in newpage. it was hard to follow, and resulted in funny looking code. - nil not 0 Reference: /n/atom/patch/applied/pageclean Date: Mon Jun 9 23:53:53 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/port/segment.c Mon Jun 9 23:50:46 2014 +++ /sys/src/nix/port/segment.c Mon Jun 9 23:50:46 2014 @@ -316,18 +316,11 @@ * We construct a list of the pages to be freed, zero * the entries, then (below) call procflushseg, and call * putpage on the whole list. - * - * Swapped-out pages don't appear in TLBs, so it's okay - * to putswap those pages before procflushseg. */ if(pg){ - if(onswap(pg)) - putswap(pg); - else{ - pg->next = list; - list = pg; - } - s->map[i]->pages[j] = 0; + pg->next = list; + list = pg; + s->map[i]->pages[j] = nil; } if(--pages == 0) goto out; --- /sys/src/nix/port/page.c Mon Jun 9 23:50:46 2014 +++ /sys/src/nix/port/page.c Mon Jun 9 23:50:46 2014 @@ -83,7 +83,6 @@ for(si = 0; si < m->npgsz; si++) if(size == m->pgsz[si]) return si; - print("getpgszi: size %#ulx not found\n", size); return -1; } @@ -94,13 +93,16 @@ int si; si = getpgszi(size); + if(si == -1){ + print("pgalloc: getpgszi %lux %d %#p\n", size, color, getcallerpc(&size)); + return nil; + } if((pg = malloc(sizeof(Page))) == nil){ DBG("pgalloc: malloc failed\n"); return nil; } - memset(pg, 0, sizeof *pg); if((pg->pa = physalloc(size, &color, pg)) == 0){ - DBG("pgalloc: physalloc failed: size %#ulx color %d\n", size, color); + DBG("pgalloc: physalloc failed: size %#lux color %d\n", size, color); free(pg); return nil; } @@ -173,10 +175,10 @@ } else { pa->tail = p; - p->next = 0; + p->next = nil; } pa->head = p; - p->prev = 0; + p->prev = nil; pa->freecount++; } @@ -198,7 +200,6 @@ { Page *p; KMap *k; - uchar ct; Pgsza *pa; int i, dontalloc, si; static int once; @@ -220,17 +221,17 @@ * 1. try to reuse a free one. */ p = findpg(pa->head, color); - if(p != nil) + if(p != nil){ + pageunchain(p); break; + } /* * 2. try to allocate a new one from physical memory */ p = pgalloc(size, color); - if(p != nil){ - pagechainhead(p); + if(p != nil) break; - } /* * 3. out of memory, try with the pager. @@ -239,16 +240,12 @@ unlock(&pga); dontalloc = 0; - if(s && *s) { + if(s != nil && *s != nil) { qunlock(&((*s)->lk)); - *s = 0; + *s = nil; dontalloc = 1; } - /* - * Try to get any page of the desired color - * or any color for NOCOLOR. - */ kickpager(si, color); /* @@ -263,11 +260,6 @@ lock(&pga); } - assert(p != nil); - ct = PG_NEWCOL; - - pageunchain(p); - lock(p); if(p->ref != 0) panic("newpage pa %#P", p->pa); @@ -277,7 +269,7 @@ p->va = va; p->modref = 0; for(i = 0; i < nelem(p->cachectl); i++) - p->cachectl[i] = ct; + p->cachectl[i] = PG_NEWCOL; unlock(p); unlock(&pga); @@ -611,14 +603,10 @@ dst = &new->pages[old->first-old->pages]; new->first = dst; for(src = old->first; src <= old->last; src++, dst++) - if(*src){ - if(onswap(*src)) - panic("ptecpy: no swap"); - else{ - lock(*src); - (*src)->ref++; - unlock(*src); - } + if(*src != nil){ + lock(*src); + (*src)->ref++; + unlock(*src); new->last = dst; *dst = *src; } @@ -659,7 +647,7 @@ } for(pg = p->pages; pg < ptop; pg++) { pt = *pg; - if(pt == 0) + if(pt == nil) continue; lock(pt); ref = --pt->ref; --- /sys/src/nix/port/portdat.h Mon Jun 9 23:50:46 2014 +++ /sys/src/nix/port/portdat.h Mon Jun 9 23:50:46 2014 @@ -429,10 +429,7 @@ SG_CEXEC = 0100, /* Detach at exec */ }; -#define PG_ONSWAP 1 -#define onswap(s) (PTR2UINT(s) & PG_ONSWAP) -#define pagedout(s) (PTR2UINT(s) == 0 || onswap(s)) -#define swapaddr(s) (PTR2UINT(s) & ~PG_ONSWAP) +#define pagedout(s) (s == nil) #define SEGMAXPG (SEGMAPSIZE)