aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-12-07 15:52:14 -0800
committerRuss Cox <rsc@golang.org>2009-12-07 15:52:14 -0800
commit0d3301a557c1c8da66e5181bb93ceefc3dd3369d (patch)
tree7b3b4f1b9c5102b5fd3eeb766331be5d5c34040e
parent33649bd2780ec6fd28d6812769f9a1ad5ff3118b (diff)
downloadgo-0d3301a557c1c8da66e5181bb93ceefc3dd3369d.tar.gz
go-0d3301a557c1c8da66e5181bb93ceefc3dd3369d.zip
runtime: don't touch pages of memory unnecessarily.
cuts working size for hello world from 6 MB to 1.2 MB. still some work to be done, but diminishing returns. R=r https://golang.org/cl/165080
-rw-r--r--src/pkg/runtime/malloc.h6
-rw-r--r--src/pkg/runtime/mcentral.c1
-rw-r--r--src/pkg/runtime/mgc0.c7
-rw-r--r--src/pkg/runtime/mheap.c1
-rw-r--r--src/pkg/runtime/mheapmap32.c1
-rw-r--r--src/pkg/runtime/mheapmap64.c2
-rw-r--r--src/pkg/runtime/proc.c3
-rw-r--r--src/pkg/runtime/symtab.c39
8 files changed, 15 insertions, 45 deletions
diff --git a/src/pkg/runtime/malloc.h b/src/pkg/runtime/malloc.h
index 2e0f1143dd..b3fa8e0dfb 100644
--- a/src/pkg/runtime/malloc.h
+++ b/src/pkg/runtime/malloc.h
@@ -113,8 +113,9 @@ struct MLink
MLink *next;
};
-// SysAlloc obtains a large chunk of memory from the operating system,
-// typically on the order of a hundred kilobytes or a megabyte.
+// SysAlloc obtains a large chunk of zeroed memory from the
+// operating system, typically on the order of a hundred kilobytes
+// or a megabyte.
//
// SysUnused notifies the operating system that the contents
// of the memory region are no longer needed and can be reused
@@ -312,4 +313,3 @@ enum
RefSome, // some references
RefNoPointers = 0x80000000U, // flag - no pointers here
};
-
diff --git a/src/pkg/runtime/mcentral.c b/src/pkg/runtime/mcentral.c
index 5c9f720c09..9881812e32 100644
--- a/src/pkg/runtime/mcentral.c
+++ b/src/pkg/runtime/mcentral.c
@@ -40,7 +40,6 @@ MCentral_AllocList(MCentral *c, int32 n, MLink **pfirst)
MLink *first, *last, *v;
int32 i;
-
lock(c);
// Replenish central list if empty.
if(MSpanList_IsEmpty(&c->nonempty)) {
diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c
index d01429f349..f0eafe3fd6 100644
--- a/src/pkg/runtime/mgc0.c
+++ b/src/pkg/runtime/mgc0.c
@@ -91,8 +91,11 @@ mark(void)
{
G *gp;
- // mark data+bss
- scanblock(0, data, end - data);
+ // mark data+bss.
+ // skip mheap itself, which has no interesting pointers
+ // and is mostly zeroed and would not otherwise be paged in.
+ scanblock(0, data, (byte*)&mheap - data);
+ scanblock(0, (byte*)(&mheap+1), end - (byte*)(&mheap+1));
// mark stacks
for(gp=allg; gp!=nil; gp=gp->alllink) {
diff --git a/src/pkg/runtime/mheap.c b/src/pkg/runtime/mheap.c
index 8661bd2a1b..e78c860c31 100644
--- a/src/pkg/runtime/mheap.c
+++ b/src/pkg/runtime/mheap.c
@@ -194,7 +194,6 @@ MHeap_Grow(MHeap *h, uintptr npage)
// NOTE(rsc): In tcmalloc, if we've accumulated enough
// system allocations, the heap map gets entirely allocated
// in 32-bit mode. (In 64-bit mode that's not practical.)
-
if(!MHeapMap_Preallocate(&h->map, ((uintptr)v>>PageShift) - 1, (ask>>PageShift) + 2)) {
SysFree(v, ask);
return false;
diff --git a/src/pkg/runtime/mheapmap32.c b/src/pkg/runtime/mheapmap32.c
index 8cea825c33..13491595da 100644
--- a/src/pkg/runtime/mheapmap32.c
+++ b/src/pkg/runtime/mheapmap32.c
@@ -84,7 +84,6 @@ MHeapMap_Preallocate(MHeapMap *m, PageID k, uintptr len)
p2 = m->allocator(sizeof *p2);
if(p2 == nil)
return false;
- runtime_memclr((byte*)p2, sizeof *p2);
m->p[i1] = p2;
}
diff --git a/src/pkg/runtime/mheapmap64.c b/src/pkg/runtime/mheapmap64.c
index 7930291786..97e20b6d20 100644
--- a/src/pkg/runtime/mheapmap64.c
+++ b/src/pkg/runtime/mheapmap64.c
@@ -96,7 +96,6 @@ MHeapMap_Preallocate(MHeapMap *m, PageID k, uintptr len)
p2 = m->allocator(sizeof *p2);
if(p2 == nil)
return false;
- runtime_memclr((byte*)p2, sizeof *p2);
m->p[i1] = p2;
}
@@ -105,7 +104,6 @@ MHeapMap_Preallocate(MHeapMap *m, PageID k, uintptr len)
p3 = m->allocator(sizeof *p3);
if(p3 == nil)
return false;
- runtime_memclr((byte*)p3, sizeof *p3);
p2->p[i2] = p3;
}
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 2f36868f5f..f04cb66928 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -102,9 +102,10 @@ schedinit(void)
mallocinit();
goargs();
+ // For debugging:
// Allocate internal symbol table representation now,
// so that we don't need to call malloc when we crash.
- findfunc(0);
+ // findfunc(0);
sched.gomaxprocs = 1;
p = getenv("GOMAXPROCS");
diff --git a/src/pkg/runtime/symtab.c b/src/pkg/runtime/symtab.c
index 18ce07a1cf..0b5499474f 100644
--- a/src/pkg/runtime/symtab.c
+++ b/src/pkg/runtime/symtab.c
@@ -24,40 +24,6 @@
#define SYMDATA ((byte*)(0x99LL<<24) + 8)
#endif
-
-// Return a pointer to a byte array containing the symbol table segment.
-void
-runtime·symdat(Slice *symtab, Slice *pclntab)
-{
- Slice *a;
- int32 *v;
-
- // TODO(rsc): Remove once TODO at top of file is done.
- if(goos != nil && strcmp((uint8*)goos, (uint8*)"nacl") == 0) {
- symtab = mal(sizeof *a);
- pclntab = mal(sizeof *a);
- FLUSH(&symtab);
- FLUSH(&pclntab);
- return;
- }
-
- v = SYMCOUNTS;
-
- a = mal(sizeof *a);
- a->len = v[0];
- a->cap = a->len;
- a->array = SYMDATA;
- symtab = a;
- FLUSH(&symtab);
-
- a = mal(sizeof *a);
- a->len = v[1];
- a->cap = a->len;
- a->array = SYMDATA + v[0];
- pclntab = a;
- FLUSH(&pclntab);
-}
-
typedef struct Sym Sym;
struct Sym
{
@@ -122,6 +88,8 @@ static int32 nfunc;
static byte **fname;
static int32 nfname;
+static Lock funclock;
+
static void
dofunc(Sym *sym)
{
@@ -379,8 +347,11 @@ findfunc(uintptr addr)
Func *f;
int32 nf, n;
+ lock(&funclock);
if(func == nil)
buildfuncs();
+ unlock(&funclock);
+
if(nfunc == 0)
return nil;
if(addr < func[0].entry || addr >= func[nfunc].entry)