summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/pc64/mmu.c31
-rw-r--r--sys/src/9/port/page.c22
-rw-r--r--sys/src/9/port/portdat.h8
-rw-r--r--sys/src/9/port/portfns.h1
-rw-r--r--sys/src/9/port/xalloc.c38
5 files changed, 46 insertions, 54 deletions
diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c
index 936955d4b..23a39f6d8 100644
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -652,16 +652,16 @@ patwc(void *a, int n)
void
preallocpages(void)
{
- Pallocmem *pm;
+ Confmem *cm;
uintptr va, base, top;
vlong tsize, psize;
ulong np, nt;
int i;
np = 0;
- for(i=0; i<nelem(palloc.mem); i++){
- pm = &palloc.mem[i];
- np += pm->npage;
+ for(i=0; i<nelem(conf.mem); i++){
+ cm = &conf.mem[i];
+ np += cm->npage - nkpages(cm);
}
nt = np / 50; /* 2% for mmupool */
np -= nt;
@@ -676,16 +676,19 @@ preallocpages(void)
psize += tsize;
psize = ROUND(psize, PGLSZ(1));
- for(i=0; i<nelem(palloc.mem); i++){
- pm = &palloc.mem[i];
- base = ROUND(pm->base, PGLSZ(1));
- top = pm->base + (uvlong)pm->npage * BY2PG;
- if((base + psize) <= VMAPSIZE && (vlong)(top - base) >= psize){
- pm->base = base + psize;
- pm->npage = (top - pm->base)/BY2PG;
-
- va = base + VMAP;
- pmap(base | PTEGLOBAL|PTEWRITE|PTENOEXEC|PTEVALID, va, psize);
+ for(i=0; i<nelem(conf.mem); i++){
+ cm = &conf.mem[i];
+ base = cm->base;
+ top = base + (uvlong)cm->npage * BY2PG;
+ base += (uvlong)nkpages(cm) * BY2PG;
+ top &= -PGLSZ(1);
+ if(top <= VMAPSIZE && (vlong)(top - base) >= psize){
+ /* steal memory from the end of the bank */
+ top -= psize;
+ cm->npage = (top - cm->base) / BY2PG;
+
+ va = top + VMAP;
+ pmap(top | PTEGLOBAL|PTEWRITE|PTENOEXEC|PTEVALID, va, psize);
palloc.pages = (void*)(va + tsize);
diff --git a/sys/src/9/port/page.c b/sys/src/9/port/page.c
index b7194058e..f907aca5b 100644
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -7,21 +7,27 @@
Palloc palloc;
+ulong
+nkpages(Confmem *cm)
+{
+ return ((cm->klimit - cm->kbase) + BY2PG-1) / BY2PG;
+}
+
void
pageinit(void)
{
int color, i, j;
Page *p, **t;
- Pallocmem *pm;
+ Confmem *cm;
vlong m, v, u;
if(palloc.pages == nil){
ulong np;
np = 0;
- for(i=0; i<nelem(palloc.mem); i++){
- pm = &palloc.mem[i];
- np += pm->npage;
+ for(i=0; i<nelem(conf.mem); i++){
+ cm = &conf.mem[i];
+ np += cm->npage - nkpages(cm);
}
palloc.pages = xalloc(np*sizeof(Page));
if(palloc.pages == nil)
@@ -35,11 +41,11 @@ pageinit(void)
t = &palloc.head;
p = palloc.pages;
- for(i=0; i<nelem(palloc.mem); i++){
- pm = &palloc.mem[i];
- for(j=0; j<pm->npage; j++){
+ for(i=0; i<nelem(conf.mem); i++){
+ cm = &conf.mem[i];
+ for(j=nkpages(cm); j<cm->npage; j++){
memset(p, 0, sizeof *p);
- p->pa = pm->base+j*BY2PG;
+ p->pa = cm->base+j*BY2PG;
if(cankaddr(p->pa) && (KADDR(p->pa) == nil || KADDR(p->pa) == (void*)-BY2PG))
continue;
p->color = color;
diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h
index c1a127fb2..b3b86eaa7 100644
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -25,7 +25,6 @@ typedef struct Note Note;
typedef struct Page Page;
typedef struct Path Path;
typedef struct Palloc Palloc;
-typedef struct Pallocmem Pallocmem;
typedef struct Perf Perf;
typedef struct PhysUart PhysUart;
typedef struct Pgrp Pgrp;
@@ -519,12 +518,6 @@ enum
DELTAFD = 20 /* incremental increase in Fgrp.fd's */
};
-struct Pallocmem
-{
- uintptr base;
- ulong npage;
-};
-
struct Palloc
{
Lock;
@@ -533,7 +526,6 @@ struct Palloc
Page *pages; /* array of all pages */
ulong user; /* how many user pages */
Rendezq pwait[2]; /* Queues of procs waiting for memory */
- Pallocmem mem[16]; /* physical user page banks */
};
struct Waitq
diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h
index 7446513be..d1b81a2e6 100644
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -213,6 +213,7 @@ Rgrp* newrgrp(void);
Proc* newproc(void);
void nexterror(void);
int notify(Ureg*);
+ulong nkpages(Confmem*);
uvlong ns2fastticks(uvlong);
int okaddr(uintptr, ulong, int);
int openmode(ulong);
diff --git a/sys/src/9/port/xalloc.c b/sys/src/9/port/xalloc.c
index 13550d4ba..149985719 100644
--- a/sys/src/9/port/xalloc.c
+++ b/sys/src/9/port/xalloc.c
@@ -43,10 +43,8 @@ void
xinit(void)
{
ulong maxpages, kpages, n;
- uintptr size;
- Confmem *m;
- Pallocmem *pm;
Hole *h, *eh;
+ Confmem *cm;
int i;
eh = &xlists.hole[Nhole-1];
@@ -57,36 +55,28 @@ xinit(void)
kpages = conf.npage - conf.upages;
- pm = palloc.mem;
for(i=0; i<nelem(conf.mem); i++){
- m = &conf.mem[i];
- n = m->npage;
+ cm = &conf.mem[i];
+ n = cm->npage;
if(n > kpages)
n = kpages;
/* don't try to use non-KADDR-able memory for kernel */
- maxpages = cankaddr(m->base)/BY2PG;
+ maxpages = cankaddr(cm->base)/BY2PG;
if(n > maxpages)
n = maxpages;
- size = (uintptr)n*BY2PG;
- /* first give to kernel */
+ /* give to kernel */
if(n > 0){
- m->kbase = (uintptr)KADDR(m->base);
- m->klimit = (uintptr)m->kbase+size;
- if(m->klimit == 0)
- m->klimit = (uintptr)-BY2PG;
- xhole(m->base, m->klimit - m->kbase);
+ cm->kbase = (uintptr)KADDR(cm->base);
+ cm->klimit = (uintptr)cm->kbase+(uintptr)n*BY2PG;
+ if(cm->klimit == 0)
+ cm->klimit = (uintptr)-BY2PG;
+ xhole(cm->base, cm->klimit - cm->kbase);
kpages -= n;
}
- /* if anything left over, give to user */
- if(n < m->npage){
- if(pm >= palloc.mem+nelem(palloc.mem)){
- print("xinit: losing %lud pages\n", m->npage-n);
- continue;
- }
- pm->base = m->base+size;
- pm->npage = m->npage - n;
- pm++;
- }
+ /*
+ * anything left over: cm->npage - nkpages(cm)
+ * will be given to user by pageinit()
+ */
}
xsummary();
}