diff options
| author | 2019-11-28 18:29:49 +0000 | |
|---|---|---|
| committer | 2019-11-28 18:29:49 +0000 | |
| commit | ac15d0f2f8dc32e40fe457ba268bbaf93ad596af (patch) | |
| tree | 05baa73c6d16c6423c76c3b19d108914c74a12fa | |
| parent | Add console command (diff) | |
| download | wireguard-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.
| -rw-r--r-- | sys/kern/vfs_biomem.c | 32 | ||||
| -rw-r--r-- | sys/sys/buf.h | 6 |
2 files changed, 28 insertions, 10 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; } diff --git a/sys/sys/buf.h b/sys/sys/buf.h index e86cc452a7d..175bf397542 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: buf.h,v 1.110 2019/11/28 02:30:38 beck Exp $ */ +/* $OpenBSD: buf.h,v 1.111 2019/11/28 18:29:49 beck Exp $ */ /* $NetBSD: buf.h,v 1.25 1997/04/09 21:12:17 mycroft Exp $ */ /* @@ -42,7 +42,6 @@ #include <sys/queue.h> #include <sys/tree.h> #include <sys/mutex.h> -#include <uvm/uvm_extern.h> #define NOLIST ((struct buf *)0x87654321) @@ -158,8 +157,7 @@ struct buf { union bufq_data b_bufq; struct bufq *b_bq; /* What bufq this buf is on */ - struct uvm_object *b_pobj; - struct uvm_object b_uobj; /* Object containing the pages */ + struct uvm_object *b_pobj; /* Object containing the pages */ off_t b_poffs; /* Offset within object */ daddr_t b_lblkno; /* Logical block number. */ |
