From owner-freebsd-bugs@FreeBSD.ORG Mon Jul 21 01:40:22 2003 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BFDBC37B405 for ; Mon, 21 Jul 2003 01:40:22 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 550D343FBF for ; Mon, 21 Jul 2003 01:40:19 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id h6L8eJUp049522 for ; Mon, 21 Jul 2003 01:40:19 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id h6L8eJMM049521; Mon, 21 Jul 2003 01:40:19 -0700 (PDT) Resent-Date: Mon, 21 Jul 2003 01:40:19 -0700 (PDT) Resent-Message-Id: <200307210840.h6L8eJMM049521@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Bruce M Simpson Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A86ED37B401 for ; Mon, 21 Jul 2003 01:37:56 -0700 (PDT) Received: from bigboy.spc.org (bigboy.spc.org [195.206.69.225]) by mx1.FreeBSD.org (Postfix) with ESMTP id D443643FAF for ; Mon, 21 Jul 2003 01:37:55 -0700 (PDT) (envelope-from bms@spc.org) Received: from saboteur.dek.spc.org (unknown [81.3.72.68]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by bigboy.spc.org (Postfix) with ESMTP id 99B5C316A for ; Mon, 21 Jul 2003 09:38:09 +0100 (BST) Received: by saboteur.dek.spc.org (Postfix, from userid 1001) id 5073D5CB; Mon, 21 Jul 2003 09:37:47 +0100 (BST) Message-Id: <20030721083747.5073D5CB@saboteur.dek.spc.org> Date: Mon, 21 Jul 2003 09:37:47 +0100 (BST) From: Bruce M Simpson To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/54690: [PATCH] wrap swap_pager's swhash with a mutex X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Bruce M Simpson List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jul 2003 08:40:23 -0000 >Number: 54690 >Category: kern >Synopsis: [PATCH] wrap swap_pager's swhash with a mutex >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Mon Jul 21 01:40:18 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Bruce M Simpson >Release: FreeBSD 5.1-RELEASE i386 >Organization: >Environment: System: FreeBSD saboteur.dek.spc.org 5.1-RELEASE FreeBSD 5.1-RELEASE #3: Mon Jun 23 06:55:01 BST 2003 root@saboteur.dek.spc.org:/usr/src/sys/i386/compile/SABOTEUR i386 >Description: Requested and reviewed by alc@freebsd.org -- wrap the swap block hash table in the swap pager with a fine grained lock. >How-To-Repeat: >Fix: --- swhash.col.patch begins here --- Generated by diffcoll on Sat 19 Jul 2003 20:35:54 BST diff -uN src/sys/vm/swap_pager.c.orig src/sys/vm/swap_pager.c --- /usr/src/sys/vm/swap_pager.c.orig Sat Jul 19 00:56:10 2003 +++ /usr/src/sys/vm/swap_pager.c Sat Jul 19 20:35:47 2003 @@ -113,8 +113,11 @@ static int nsw_cluster_max; /* maximum VOP I/O allowed */ struct blist *swapblist; + +static struct mtx swhash_mtx; /* protect hash table */ static struct swblock **swhash; static int swhash_mask; + static int swap_async_max = 4; /* maximum in-progress async I/O's */ static struct sx sw_alloc_sx; @@ -256,6 +259,8 @@ */ dmmax = SWB_NPAGES * 2; dmmax_mask = ~(dmmax - 1); + + mtx_init(&swhash_mtx, "swap_pager swhash mutex", NULL, MTX_DEF); } /* @@ -1752,6 +1757,7 @@ full_rescan: waitobj = NULL; + mtx_lock(&swhash_mtx); for (i = 0; i <= swhash_mask; i++) { /* '<=' is correct here */ restart: pswap = &swhash[i]; @@ -1763,7 +1769,9 @@ break; } if (j < SWAP_META_PAGES) { + mtx_unlock(&swhash_mtx); swp_pager_force_pagein(swap, j); + mtx_lock(&swhash_mtx); goto restart; } else if (swap->swb_object->paging_in_progress) { if (!waitobj) @@ -1772,6 +1780,8 @@ pswap = &swap->swb_hnext; } } + mtx_unlock(&swhash_mtx); + if (waitobj && *sw_used) { /* * We wait on an arbitrary object to clock our rescans @@ -1782,6 +1792,7 @@ VM_OBJECT_UNLOCK(waitobj); goto full_rescan; } + if (*sw_used) panic("swapoff: failed to locate %d swap blocks", *sw_used); } @@ -1817,6 +1828,8 @@ struct swblock *swap; index &= ~(vm_pindex_t)SWAP_META_MASK; + + mtx_lock(&swhash_mtx); pswap = &swhash[(index ^ (int)(intptr_t)object) & swhash_mask]; while ((swap = *pswap) != NULL) { if (swap->swb_object == object && @@ -1826,6 +1839,8 @@ } pswap = &swap->swb_hnext; } + mtx_unlock(&swhash_mtx); + return (pswap); } --- swhash.col.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: