summaryrefslogtreecommitdiff
path: root/sys/arch/sparc64
diff options
context:
space:
mode:
authorPedro Martelletto <pedro@cvs.openbsd.org>2007-05-26 20:26:52 +0000
committerPedro Martelletto <pedro@cvs.openbsd.org>2007-05-26 20:26:52 +0000
commit196f5066228d908cbac060396a1aba557efe1ef3 (patch)
tree5c48aa4f82af6d902afe35afb642c3d4225a1a07 /sys/arch/sparc64
parent6e18a0b85a66c596fb041fbf27229487f6661bbf (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.c91
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);
}