summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbeck <beck@openbsd.org>2019-11-28 02:30:38 +0000
committerbeck <beck@openbsd.org>2019-11-28 02:30:38 +0000
commitff9f3f5ab44f257cfd87a55ce98d4d554493fb54 (patch)
tree1a7817e9a1da7c3ef42f618e5e453bffde3929a5
parentNo train stations allowed in the airport file. (diff)
downloadwireguard-openbsd-ff9f3f5ab44f257cfd87a55ce98d4d554493fb54.tar.xz
wireguard-openbsd-ff9f3f5ab44f257cfd87a55ce98d4d554493fb54.zip
Fix the buffer cache code to not use a giant uvm obj of all pages
when a small one on each buf is all that is needed. reduces the cost of large frees by about 25%. ok kettenis@
-rw-r--r--sys/kern/vfs_biomem.c32
-rw-r--r--sys/sys/buf.h6
2 files changed, 10 insertions, 28 deletions
diff --git a/sys/kern/vfs_biomem.c b/sys/kern/vfs_biomem.c
index 8bdd583fe58..55eb6f5af7e 100644
--- a/sys/kern/vfs_biomem.c
+++ b/sys/kern/vfs_biomem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_biomem.c,v 1.41 2019/05/09 20:36:44 beck Exp $ */
+/* $OpenBSD: vfs_biomem.c,v 1.42 2019/11/28 02:30:38 beck Exp $ */
/*
* Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
@@ -33,18 +33,6 @@ 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
@@ -61,10 +49,6 @@ 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);
}
/*
@@ -267,7 +251,6 @@ 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));
@@ -275,10 +258,8 @@ buf_alloc_pages(struct buf *bp, vsize_t size)
KASSERT(bp->b_data == NULL);
splassert(IPL_BIO);
- offs = buf_page_offset;
- buf_page_offset += size;
-
- KASSERT(buf_page_offset > 0);
+ bp->b_pobj = &bp->b_uobj;
+ uvm_objinit(bp->b_pobj, NULL, 1);
/*
* Attempt to allocate with NOWAIT. if we can't, then throw
@@ -287,13 +268,13 @@ buf_alloc_pages(struct buf *bp, vsize_t size)
* memory for us.
*/
do {
- i = uvm_pagealloc_multi(buf_object, offs, size,
+ i = uvm_pagealloc_multi(bp->b_pobj, 0, size,
UVM_PLA_NOWAIT | UVM_PLA_NOWAKE);
if (i == 0)
break;
} while (bufbackoff(&dma_constraint, size) == 0);
if (i != 0)
- i = uvm_pagealloc_multi(buf_object, offs, size,
+ i = uvm_pagealloc_multi(bp->b_pobj, 0, size,
UVM_PLA_WAITOK);
/* should not happen */
if (i != 0)
@@ -303,8 +284,7 @@ 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 = buf_object;
- bp->b_poffs = offs;
+ bp->b_poffs = 0;
bp->b_bufsize = size;
}
diff --git a/sys/sys/buf.h b/sys/sys/buf.h
index d2dd04470ea..e86cc452a7d 100644
--- a/sys/sys/buf.h
+++ b/sys/sys/buf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: buf.h,v 1.109 2019/07/19 00:24:31 cheloha Exp $ */
+/* $OpenBSD: buf.h,v 1.110 2019/11/28 02:30:38 beck Exp $ */
/* $NetBSD: buf.h,v 1.25 1997/04/09 21:12:17 mycroft Exp $ */
/*
@@ -42,6 +42,7 @@
#include <sys/queue.h>
#include <sys/tree.h>
#include <sys/mutex.h>
+#include <uvm/uvm_extern.h>
#define NOLIST ((struct buf *)0x87654321)
@@ -157,7 +158,8 @@ struct buf {
union bufq_data b_bufq;
struct bufq *b_bq; /* What bufq this buf is on */
- struct uvm_object *b_pobj; /* Object containing the pages */
+ struct uvm_object *b_pobj;
+ struct uvm_object b_uobj; /* Object containing the pages */
off_t b_poffs; /* Offset within object */
daddr_t b_lblkno; /* Logical block number. */