summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_biomem.c
diff options
context:
space:
mode:
authorbeck <beck@openbsd.org>2019-11-28 18:29:49 +0000
committerbeck <beck@openbsd.org>2019-11-28 18:29:49 +0000
commitac15d0f2f8dc32e40fe457ba268bbaf93ad596af (patch)
tree05baa73c6d16c6423c76c3b19d108914c74a12fa /sys/kern/vfs_biomem.c
parentAdd console command (diff)
downloadwireguard-openbsd-ac15d0f2f8dc32e40fe457ba268bbaf93ad596af.tar.xz
wireguard-openbsd-ac15d0f2f8dc32e40fe457ba268bbaf93ad596af.zip
back out the buffer cache uvm_obj change for now.
the bread_cluster code has confused even me and mark, we need to handle the buffer slice and dice case better for bread_cluster.
Diffstat (limited to 'sys/kern/vfs_biomem.c')
-rw-r--r--sys/kern/vfs_biomem.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/sys/kern/vfs_biomem.c b/sys/kern/vfs_biomem.c
index 2be52c300f3..b0271b48fa7 100644
--- a/sys/kern/vfs_biomem.c
+++ b/sys/kern/vfs_biomem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_biomem.c,v 1.43 2019/11/28 16:05:25 beck Exp $ */
+/* $OpenBSD: vfs_biomem.c,v 1.44 2019/11/28 18:29:49 beck Exp $ */
/*
* Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
@@ -33,6 +33,18 @@ TAILQ_HEAD(,buf) buf_valist;
extern struct bcachestats bcstats;
+/*
+ * Pages are allocated from a uvm object (we only use it for page storage,
+ * all pages are wired). Since every buffer contains a contiguous range of
+ * pages, reusing the pages could be very painful. Fortunately voff_t is
+ * 64 bits, so we can just increment buf_page_offset all the time and ignore
+ * wraparound. Even if you reuse 4GB worth of buffers every second
+ * you'll still run out of time_t faster than buffers.
+ *
+ */
+voff_t buf_page_offset;
+struct uvm_object *buf_object, buf_object_store;
+
vaddr_t buf_unmap(struct buf *);
void
@@ -49,6 +61,10 @@ buf_mem_init(vsize_t size)
/* Contiguous mapping */
bcstats.kvaslots = bcstats.kvaslots_avail = size / MAXPHYS;
+
+ buf_object = &buf_object_store;
+
+ uvm_objinit(buf_object, NULL, 1);
}
/*
@@ -251,6 +267,7 @@ buf_unmap(struct buf *bp)
void
buf_alloc_pages(struct buf *bp, vsize_t size)
{
+ voff_t offs;
int i;
KASSERT(size == round_page(size));
@@ -258,7 +275,10 @@ buf_alloc_pages(struct buf *bp, vsize_t size)
KASSERT(bp->b_data == NULL);
splassert(IPL_BIO);
- uvm_objinit(&bp->b_uobj, NULL, 1);
+ offs = buf_page_offset;
+ buf_page_offset += size;
+
+ KASSERT(buf_page_offset > 0);
/*
* Attempt to allocate with NOWAIT. if we can't, then throw
@@ -267,13 +287,13 @@ buf_alloc_pages(struct buf *bp, vsize_t size)
* memory for us.
*/
do {
- i = uvm_pagealloc_multi(&bp->b_uobj, 0, size,
+ i = uvm_pagealloc_multi(buf_object, offs, size,
UVM_PLA_NOWAIT | UVM_PLA_NOWAKE);
if (i == 0)
break;
} while (bufbackoff(&dma_constraint, size) == 0);
if (i != 0)
- i = uvm_pagealloc_multi(&bp->b_uobj, 0, size,
+ i = uvm_pagealloc_multi(buf_object, offs, size,
UVM_PLA_WAITOK);
/* should not happen */
if (i != 0)
@@ -283,8 +303,8 @@ buf_alloc_pages(struct buf *bp, vsize_t size)
bcstats.numbufpages += atop(size);
bcstats.dmapages += atop(size);
SET(bp->b_flags, B_DMA);
- bp->b_pobj = &bp->b_uobj;
- bp->b_poffs = 0;
+ bp->b_pobj = buf_object;
+ bp->b_poffs = offs;
bp->b_bufsize = size;
}