diff options
author | 2019-11-28 02:30:38 +0000 | |
---|---|---|
committer | 2019-11-28 02:30:38 +0000 | |
commit | ff9f3f5ab44f257cfd87a55ce98d4d554493fb54 (patch) | |
tree | 1a7817e9a1da7c3ef42f618e5e453bffde3929a5 | |
parent | No train stations allowed in the airport file. (diff) | |
download | wireguard-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.c | 32 | ||||
-rw-r--r-- | sys/sys/buf.h | 6 |
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. */ |