From owner-p4-projects@FreeBSD.ORG Wed Oct 26 02:24:40 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 122AF16A421; Wed, 26 Oct 2005 02:24:40 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id AE4DA16A41F for ; Wed, 26 Oct 2005 02:24:39 +0000 (GMT) (envelope-from alc@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 63A0343D49 for ; Wed, 26 Oct 2005 02:24:39 +0000 (GMT) (envelope-from alc@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j9Q2Odee040193 for ; Wed, 26 Oct 2005 02:24:39 GMT (envelope-from alc@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j9Q2Odds040190 for perforce@freebsd.org; Wed, 26 Oct 2005 02:24:39 GMT (envelope-from alc@freebsd.org) Date: Wed, 26 Oct 2005 02:24:39 GMT Message-Id: <200510260224.j9Q2Odds040190@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to alc@freebsd.org using -f From: Alan Cox To: Perforce Change Reviews Cc: Subject: PERFORCE change 85860 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Oct 2005 02:24:40 -0000 http://perforce.freebsd.org/chv.cgi?CH=85860 Change 85860 by alc@alc_sp01 on 2005/10/26 02:24:09 Properly synchronize the preemption of reservations. Affected files ... .. //depot/projects/superpages/src/sys/vm/vm_reserve.c#8 edit Differences ... ==== //depot/projects/superpages/src/sys/vm/vm_reserve.c#8 (text+ko) ==== @@ -512,8 +512,10 @@ preempt_contig_alloc(int *level, int free_pool) { int l, lev = level ? *level : -1; + vm_object_t object; vm_page_t m = NULL; - reservation_t sp; + reservation_t sp, sp_next; + boolean_t was_trylocked; retry: if (free_pool) { @@ -531,13 +533,26 @@ /* 3. try rres at level lev or higher */ for (l = lev; l <= SP_LEVELS - 2; l++) { - while ( (sp = TAILQ_FIRST(&rres[l])) ) { + mtx_lock(&rres_mtx); + TAILQ_FOREACH_SAFE(sp, &rres[l], next, sp_next) { KASSERT(sp->rql==l && sp->rqllevel,("preempt_contig_alloc: rql invalid")); - preempt(sp, lev, NULL); - m = buddy_alloc(SP_ORDER(lev), FALSE); - if (m != NULL) - goto done; + object = sp->object; + was_trylocked = VM_OBJECT_TRYLOCK(object); + if (was_trylocked || VM_OBJECT_LOCKED(object)) { + TAILQ_REMOVE(&rres[l], sp, next); + mtx_unlock(&rres_mtx); + sp->rql = NO_RESQ; + preempt(sp, lev, NULL); + if (was_trylocked) + VM_OBJECT_UNLOCK(object); + m = buddy_alloc(SP_ORDER(lev), FALSE); + if (m != NULL) + goto done; + mtx_lock(&rres_mtx); + sp_next = TAILQ_FIRST(&rres[l]); + } } + mtx_unlock(&rres_mtx); } /* Downgrade level, retry free, rres... */ @@ -552,13 +567,26 @@ } /* 5, 7, 9... */ - while ( (sp = TAILQ_FIRST(&rres[lev])) ) { + mtx_lock(&rres_mtx); + TAILQ_FOREACH_SAFE(sp, &rres[lev], next, sp_next) { KASSERT(sp->rql==lev && sp->rqllevel,("preempt_alloc_contig")); - preempt(sp, lev, NULL); - m = buddy_alloc(SP_ORDER(lev), FALSE); - if (m != NULL) - goto done; + object = sp->object; + was_trylocked = VM_OBJECT_TRYLOCK(object); + if (was_trylocked || VM_OBJECT_LOCKED(object)) { + TAILQ_REMOVE(&rres[lev], sp, next); + mtx_unlock(&rres_mtx); + sp->rql = NO_RESQ; + preempt(sp, lev, NULL); + if (was_trylocked) + VM_OBJECT_UNLOCK(object); + m = buddy_alloc(SP_ORDER(lev), FALSE); + if (m != NULL) + goto done; + mtx_lock(&rres_mtx); + sp_next = TAILQ_FIRST(&rres[lev]); + } } + mtx_unlock(&rres_mtx); } done: KASSERT(*level>= -1,("preempt_alloc_contig"));