diff options
author | Pedro Martelletto <pedro@cvs.openbsd.org> | 2007-05-26 20:26:52 +0000 |
---|---|---|
committer | Pedro Martelletto <pedro@cvs.openbsd.org> | 2007-05-26 20:26:52 +0000 |
commit | 196f5066228d908cbac060396a1aba557efe1ef3 (patch) | |
tree | 5c48aa4f82af6d902afe35afb642c3d4225a1a07 /sys/arch/sparc64 | |
parent | 6e18a0b85a66c596fb041fbf27229487f6661bbf (diff) |
Dynamic buffer cache. Initial diff from mickey@, okay art@ beck@ toby@
deraadt@ dlg@.
Diffstat (limited to 'sys/arch/sparc64')
-rw-r--r-- | sys/arch/sparc64/sparc64/machdep.c | 91 |
1 files changed, 8 insertions, 83 deletions
diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c index 229efbf7b1d..f0e910a0351 100644 --- a/sys/arch/sparc64/sparc64/machdep.c +++ b/sys/arch/sparc64/sparc64/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.88 2007/05/23 20:33:47 pvalchev Exp $ */ +/* $OpenBSD: machdep.c,v 1.89 2007/05/26 20:26:51 pedro Exp $ */ /* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */ /*- @@ -172,14 +172,8 @@ extern vaddr_t avail_end; /* * Declare these as initialized data so we can patch them. */ -#ifdef NBUF -int nbuf = NBUF; -#else -int nbuf = 0; -#endif - #ifndef BUFCACHEPERCENT -#define BUFCACHEPERCENT 5 +#define BUFCACHEPERCENT 10 #endif #ifdef BUFPAGES @@ -232,16 +226,13 @@ void stackdump(void); void cpu_startup() { - unsigned i; caddr_t v; long sz; - int base, residual; #ifdef DEBUG extern int pmapdebug; int opmapdebug = pmapdebug; #endif vaddr_t minaddr, maxaddr; - vsize_t size; extern struct user *proc0paddr; #ifdef DEBUG @@ -267,52 +258,12 @@ cpu_startup() if (allocsys(v) - v != sz) panic("startup: table size inconsistency"); - /* - * allocate virtual and physical memory for the buffers. - */ - size = MAXBSIZE * nbuf; /* # bytes for buffers */ - - /* allocate VM for buffers... area is not managed by VM system */ - if (uvm_map(kernel_map, (vaddr_t *) &buffers, round_page(size), - NULL, UVM_UNKNOWN_OFFSET, 0, - UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE, - UVM_ADV_NORMAL, 0)) != 0) - panic("cpu_startup: cannot allocate VM for buffers"); - - minaddr = (vaddr_t) buffers; - if ((bufpages / nbuf) >= btoc(MAXBSIZE)) { - bufpages = btoc(MAXBSIZE) * nbuf; /* do not overallocate RAM */ - } - base = bufpages / nbuf; - residual = bufpages % nbuf; - - /* now allocate RAM for buffers */ - for (i = 0 ; i < nbuf ; i++) { - vaddr_t curbuf; - vsize_t curbufsize; - struct vm_page *pg; - - /* - * each buffer has MAXBSIZE bytes of VM space allocated. of - * that MAXBSIZE space we allocate and map (base+1) pages - * for the first "residual" buffers, and then we allocate - * "base" pages for the rest. - */ - curbuf = (vaddr_t) buffers + (i * MAXBSIZE); - curbufsize = NBPG * ((i < residual) ? (base+1) : base); - - while (curbufsize) { - pg = uvm_pagealloc(NULL, 0, NULL, 0); - if (pg == NULL) - panic("cpu_startup: " - "not enough RAM for buffer cache"); - pmap_kenter_pa(curbuf, - VM_PAGE_TO_PHYS(pg), VM_PROT_READ|VM_PROT_WRITE); - curbuf += PAGE_SIZE; - curbufsize -= PAGE_SIZE; - } - } - pmap_update(pmap_kernel()); + /* + * Determine how many buffers to allocate. + * We allocate bufcachepercent% of memory for buffer space. + */ + if (bufpages == 0) + bufpages = physmem * bufcachepercent / 100; /* * Allocate a submap for exec arguments. This map effectively @@ -327,8 +278,6 @@ cpu_startup() #endif printf("avail mem = %lu (%luMB)\n", ptoa(uvmexp.free), ptoa(uvmexp.free)/1024/1024); - printf("using %d buffers containing %ld bytes of memory\n", nbuf, - (long)bufpages * PAGE_SIZE); /* * Set up buffers, so they can be used to read disk labels. @@ -352,30 +301,6 @@ allocsys(caddr_t v) valloc(msqids, struct msqid_ds, msginfo.msgmni); #endif - /* - * Determine how many buffers to allocate (enough to - * hold 5% of total physical memory, but at least 16). - * Allocate 1/2 as many swap buffer headers as file i/o buffers. - */ - if (bufpages == 0) - bufpages = physmem * bufcachepercent / 100; - if (nbuf == 0) { - nbuf = bufpages; - if (nbuf < 16) - nbuf = 16; - } - /* Restrict to at most 30% filled kvm */ - if (nbuf * MAXBSIZE > - (KERNEND - KERNBASE) * 3 / 10) - nbuf = (KERNEND - KERNBASE) / - MAXBSIZE * 3 / 10; - - /* More buffer pages than fits into the buffers is senseless. */ - if (bufpages > nbuf * MAXBSIZE / PAGE_SIZE) - bufpages = nbuf * MAXBSIZE / PAGE_SIZE; - - valloc(buf, struct buf, nbuf); - return (v); } |