Module Name: src Committed By: riz Date: Fri Feb 8 20:22:19 UTC 2013
Modified Files: src/sys/kern [netbsd-6-0]: subr_vmem.c Log Message: Pull up following revision(s) (requested by para in ticket #789): sys/kern/subr_vmem.c: revision 1.81 sys/kern/subr_vmem.c: revision 1.77 fix a lock order reversal during global boundary tag refill. thanks to chuq@ xxx: request pullup Fix release of vmem_btag_lock (don't release twice in error path) To generate a diff of this commit: cvs rdiff -u -r1.72.2.1 -r1.72.2.1.4.1 src/sys/kern/subr_vmem.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_vmem.c diff -u src/sys/kern/subr_vmem.c:1.72.2.1 src/sys/kern/subr_vmem.c:1.72.2.1.4.1 --- src/sys/kern/subr_vmem.c:1.72.2.1 Tue Apr 3 16:14:02 2012 +++ src/sys/kern/subr_vmem.c Fri Feb 8 20:22:18 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_vmem.c,v 1.72.2.1 2012/04/03 16:14:02 riz Exp $ */ +/* $NetBSD: subr_vmem.c,v 1.72.2.1.4.1 2013/02/08 20:22:18 riz Exp $ */ /*- * Copyright (c)2006,2007,2008,2009 YAMAMOTO Takashi, @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.72.2.1 2012/04/03 16:14:02 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.72.2.1.4.1 2013/02/08 20:22:18 riz Exp $"); #if defined(_KERNEL) #include "opt_ddb.h" @@ -263,6 +263,7 @@ static int static_qc_pool_count = STATIC vmem_t *kmem_va_meta_arena; vmem_t *kmem_meta_arena; +static kmutex_t vmem_refill_lock; static kmutex_t vmem_btag_lock; static LIST_HEAD(, vmem_btag) vmem_btag_freelist; static size_t vmem_btag_freelist_count = 0; @@ -282,19 +283,24 @@ bt_refillglobal(vm_flag_t flags) bt_t *bt; int i; + mutex_enter(&vmem_refill_lock); + mutex_enter(&vmem_btag_lock); if (vmem_btag_freelist_count > (BT_MINRESERVE * 16)) { mutex_exit(&vmem_btag_lock); + mutex_exit(&vmem_refill_lock); return 0; } + mutex_exit(&vmem_btag_lock); if (vmem_alloc(kmem_meta_arena, PAGE_SIZE, (flags & ~VM_FITMASK) | VM_INSTANTFIT | VM_POPULATING, &va) != 0) { - mutex_exit(&vmem_btag_lock); + mutex_exit(&vmem_refill_lock); return ENOMEM; } VMEM_EVCNT_INCR(bt_pages); + mutex_enter(&vmem_btag_lock); btp = (void *) va; for (i = 0; i < (BT_PER_PAGE); i++) { bt = btp; @@ -308,9 +314,14 @@ bt_refillglobal(vm_flag_t flags) } mutex_exit(&vmem_btag_lock); - bt_refill(kmem_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT); - bt_refill(kmem_va_meta_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT); - bt_refill(kmem_meta_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT); + bt_refill(kmem_arena, (flags & ~VM_FITMASK) + | VM_INSTANTFIT | VM_POPULATING); + bt_refill(kmem_va_meta_arena, (flags & ~VM_FITMASK) + | VM_INSTANTFIT | VM_POPULATING); + bt_refill(kmem_meta_arena, (flags & ~VM_FITMASK) + | VM_INSTANTFIT | VM_POPULATING); + + mutex_exit(&vmem_refill_lock); return 0; } @@ -320,7 +331,9 @@ bt_refill(vmem_t *vm, vm_flag_t flags) { bt_t *bt; - bt_refillglobal(flags); + if (!(flags & VM_POPULATING)) { + bt_refillglobal(flags); + } VMEM_LOCK(vm); mutex_enter(&vmem_btag_lock); @@ -691,6 +704,7 @@ vmem_bootstrap(void) { mutex_init(&vmem_list_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&vmem_refill_lock, MUTEX_DEFAULT, IPL_VM); mutex_init(&vmem_btag_lock, MUTEX_DEFAULT, IPL_VM); while (static_bt_count-- > 0) {