diff options
author | 2020-01-16 15:35:22 +0000 | |
---|---|---|
committer | 2020-01-16 15:35:22 +0000 | |
commit | cded8e25bc6bc6fb4ec6d24fd0b8cc54aa7ef9d9 (patch) | |
tree | 86f1ac2b26787384b274a5007bbdfe0f4d0d2611 | |
parent | Implement "start -c" to automatically connect to the console (diff) | |
download | wireguard-openbsd-cded8e25bc6bc6fb4ec6d24fd0b8cc54aa7ef9d9.tar.xz wireguard-openbsd-cded8e25bc6bc6fb4ec6d24fd0b8cc54aa7ef9d9.zip |
Use list for freeing pages in uvn_flush() to optimize freeing chunks of
contiguous pages.
ok beck@
-rw-r--r-- | sys/uvm/uvm_vnode.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/uvm/uvm_vnode.c b/sys/uvm/uvm_vnode.c index dbb18ac4c9f..22450396276 100644 --- a/sys/uvm/uvm_vnode.c +++ b/sys/uvm/uvm_vnode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_vnode.c,v 1.105 2019/12/08 12:37:45 mpi Exp $ */ +/* $OpenBSD: uvm_vnode.c,v 1.106 2020/01/16 15:35:22 kettenis Exp $ */ /* $NetBSD: uvm_vnode.c,v 1.36 2000/11/24 20:34:01 chs Exp $ */ /* @@ -582,10 +582,13 @@ uvn_flush(struct uvm_object *uobj, voff_t start, voff_t stop, int flags) struct uvm_vnode *uvn = (struct uvm_vnode *) uobj; struct vm_page *pp, *ptmp; struct vm_page *pps[MAXBSIZE >> PAGE_SHIFT], **ppsp; + struct pglist dead; int npages, result, lcv; boolean_t retval, need_iosync, needs_clean; voff_t curoff; + TAILQ_INIT(&dead); + /* get init vals and determine how we are going to traverse object */ need_iosync = FALSE; retval = TRUE; /* return value */ @@ -675,7 +678,8 @@ uvn_flush(struct uvm_object *uobj, voff_t start, voff_t stop, int flags) } else { pmap_page_protect(pp, PROT_NONE); /* removed page from object */ - uvm_pagefree(pp); + uvm_pageclean(pp); + TAILQ_INSERT_HEAD(&dead, pp, pageq); } } continue; @@ -802,7 +806,8 @@ ReTry: retval = FALSE; } pmap_page_protect(ptmp, PROT_NONE); - uvm_pagefree(ptmp); + uvm_pageclean(ptmp); + TAILQ_INSERT_TAIL(&dead, ptmp, pageq); } } /* end of "lcv" for loop */ @@ -823,6 +828,8 @@ ReTry: uvn->u_flags &= ~(UVM_VNODE_IOSYNC|UVM_VNODE_IOSYNCWANTED); } + uvm_pglistfree(&dead); + return(retval); } |