Subject: Re: G4, 2GB RAM report (fwd)
To: Jason R Thorpe <thorpej@zembu.com>
From: Bill Studenmund <wrstuden@zembu.com>
List: port-powerpc
Date: 08/09/2000 13:41:05
On Wed, 9 Aug 2000, Jason R Thorpe wrote:
Oh. Ok, now I see what's going on. I'm still a little worried that we
still are calculating the number of bytes of memory in the system, which
will overflow an int and might do weird sign-extended goofyness. How about
the patch below?
For folks only on port-powerpc, the current powerpc pmap doesn't size
things well when the machine has 2GB of memory. It calculates the number
of bytes in the system in an integer quantity. 2GB > INT_MAX, so bad
things happen.
Tsubai? WS?
Take care,
Bill
> > 1. int physmem:
> >
> > the page hash table is auto-sized in pmap_bootstrap()\pmap.c:
> >
> > #ifdef HTABENTS
> > ptab_cnt = HTABENTS;
> > #else /* HTABENTS */
> > ptab_cnt = 1024;
> > while ((HTABSIZE << 7) < ctob(physmem))
> > ptab_cnt <<= 1;
> > #endif /* HTABENTS */
> >
> > with >= 2GB RAM, ctob(physmem) as a signed quantity
> > will evaluate negative right off so ptab_cnt never gets
> > adjusted upwards. The result is overflow of the (puny)
> > page table during startup before VM is initialized
> > which results in panic("poalloc").
Index: pmap.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/powerpc/powerpc/pmap.c,v
retrieving revision 1.30
diff -u -r1.30 pmap.c
--- pmap.c 2000/06/29 07:48:18 1.30
+++ pmap.c 2000/08/09 20:37:04
@@ -47,6 +47,12 @@
int ptab_cnt;
u_int ptab_mask;
#define HTABSIZE (ptab_cnt * 64)
+#define HTABTOPAGES (ptab_cnt << (6 + 7 - PGSHIFT))
+/*
+ * above calculates btoc(HTABSIZE << 7) without overflow. Assumes PGSHIFT
+ * is not greater than 13, which means that our physical pages aren't
+ * larger than 16k. They are 8k at present.
+ */
struct pte_ovfl {
LIST_ENTRY(pte_ovfl) po_list; /* Linked list of overflow entries */
@@ -401,7 +407,7 @@
ptab_cnt = HTABENTS;
#else /* HTABENTS */
ptab_cnt = 1024;
- while ((HTABSIZE << 7) < ctob(physmem))
+ while (HTABTOPAGES < physmem)
ptab_cnt <<= 1;
#endif /* HTABENTS */