From: kettenis Date: Thu, 8 Oct 2015 15:58:38 +0000 (+0000) Subject: Lock the page queues by turning uvm_lock_pageq() and uvm_unlock_pageq() into X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=1eaf72b8154ab782085c6d40660cd31265c95da4;p=openbsd Lock the page queues by turning uvm_lock_pageq() and uvm_unlock_pageq() into mtx_enter() and mtx_leave() operations. Not 100% this won't blow up but there is only one way to find out, and we need this to make progress on further unlocking uvm. prodded by deraadt@ --- diff --git a/sys/uvm/uvm.h b/sys/uvm/uvm.h index bc42871cc7e..5a6082d35db 100644 --- a/sys/uvm/uvm.h +++ b/sys/uvm/uvm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm.h,v 1.59 2015/05/04 10:21:15 dlg Exp $ */ +/* $OpenBSD: uvm.h,v 1.60 2015/10/08 15:58:38 kettenis Exp $ */ /* $NetBSD: uvm.h,v 1.24 2000/11/27 08:40:02 chs Exp $ */ /* @@ -54,6 +54,7 @@ struct uvm { struct pglist page_inactive_swp;/* pages inactive (reclaim or free) */ struct pglist page_inactive_obj;/* pages inactive (reclaim or free) */ /* Lock order: pageqlock, then fpageqlock. */ + struct mutex pageqlock; /* lock for active/inactive page q */ struct mutex fpageqlock; /* lock for free page q + pdaemon */ boolean_t page_init_done; /* TRUE if uvm_page_init() finished */ struct uvm_pmr_control pmr_control; /* pmemrange data */ diff --git a/sys/uvm/uvm_page.c b/sys/uvm/uvm_page.c index 84be6eb8a38..08160054b48 100644 --- a/sys/uvm/uvm_page.c +++ b/sys/uvm/uvm_page.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_page.c,v 1.142 2015/09/21 12:59:01 visa Exp $ */ +/* $OpenBSD: uvm_page.c,v 1.143 2015/10/08 15:58:38 kettenis Exp $ */ /* $NetBSD: uvm_page.c,v 1.44 2000/11/27 08:40:04 chs Exp $ */ /* @@ -179,6 +179,7 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr_t *kvm_endp) TAILQ_INIT(&uvm.page_active); TAILQ_INIT(&uvm.page_inactive_swp); TAILQ_INIT(&uvm.page_inactive_obj); + mtx_init(&uvm.pageqlock, IPL_NONE); mtx_init(&uvm.fpageqlock, IPL_VM); uvm_pmr_init(); diff --git a/sys/uvm/uvm_page.h b/sys/uvm/uvm_page.h index aaf03181c81..1300b3b96b9 100644 --- a/sys/uvm/uvm_page.h +++ b/sys/uvm/uvm_page.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_page.h,v 1.59 2015/08/21 16:04:35 visa Exp $ */ +/* $OpenBSD: uvm_page.h,v 1.60 2015/10/08 15:58:38 kettenis Exp $ */ /* $NetBSD: uvm_page.h,v 1.19 2000/12/28 08:24:55 chs Exp $ */ /* @@ -285,8 +285,8 @@ int vm_physseg_find(paddr_t, int *); * macros */ -#define uvm_lock_pageq() /* lock */ -#define uvm_unlock_pageq() /* unlock */ +#define uvm_lock_pageq() mtx_enter(&uvm.pageqlock) +#define uvm_unlock_pageq() mtx_leave(&uvm.pageqlock) #define uvm_lock_fpageq() mtx_enter(&uvm.fpageqlock) #define uvm_unlock_fpageq() mtx_leave(&uvm.fpageqlock) diff --git a/sys/uvm/uvm_pdaemon.c b/sys/uvm/uvm_pdaemon.c index ea8961703e0..15dba9c4e6a 100644 --- a/sys/uvm/uvm_pdaemon.c +++ b/sys/uvm/uvm_pdaemon.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_pdaemon.c,v 1.76 2015/08/21 16:04:35 visa Exp $ */ +/* $OpenBSD: uvm_pdaemon.c,v 1.77 2015/10/08 15:58:38 kettenis Exp $ */ /* $NetBSD: uvm_pdaemon.c,v 1.23 2000/08/20 10:24:14 bjh21 Exp $ */ /* @@ -237,7 +237,9 @@ uvm_pageout(void *arg) if (uvmexp.free - BUFPAGES_DEFICIT < uvmexp.freetarg) size += uvmexp.freetarg - (uvmexp.free - BUFPAGES_DEFICIT); + uvm_unlock_pageq(); (void) bufbackoff(&constraint, size * 2); + uvm_lock_pageq(); /* Scan if needed to meet our targets. */ if (pma != NULL ||