From owner-svn-src-all@FreeBSD.ORG Fri Aug 6 07:32:34 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 09EDE1065679; Fri, 6 Aug 2010 07:32:34 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D06018FC1C; Fri, 6 Aug 2010 07:32:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o767WXF9045641; Fri, 6 Aug 2010 07:32:33 GMT (envelope-from jchandra@svn.freebsd.org) Received: (from jchandra@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o767WX4Z045638; Fri, 6 Aug 2010 07:32:33 GMT (envelope-from jchandra@svn.freebsd.org) Message-Id: <201008060732.o767WX4Z045638@svn.freebsd.org> From: "Jayachandran C." Date: Fri, 6 Aug 2010 07:32:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r210914 - in head/sys/mips: include mips X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Aug 2010 07:32:34 -0000 Author: jchandra Date: Fri Aug 6 07:32:33 2010 New Revision: 210914 URL: http://svn.freebsd.org/changeset/base/210914 Log: Fix the issue reported by alc: pmap_page_wired_mappings() counts the number of pv entries for the specified page that have the pv entry wired flag set to TRUE. pmap_enter() correctly initializes this flag. However, pmap_change_wiring() doesn't update the corresponding pv entry flag, only the PTE. So, the count returned by pmap_page_wired_mappings() will sometimes be wrong. In the short term, the best fix would be to eliminate the pv entry flag and use only the PTE. That flag is wasting non-trivial memory. Remove pv_wired flag, and use PTE flag to count the wired mappings. Reviewed by: alc Modified: head/sys/mips/include/pmap.h head/sys/mips/mips/pmap.c Modified: head/sys/mips/include/pmap.h ============================================================================== --- head/sys/mips/include/pmap.h Fri Aug 6 07:03:22 2010 (r210913) +++ head/sys/mips/include/pmap.h Fri Aug 6 07:32:33 2010 (r210914) @@ -124,7 +124,6 @@ typedef struct pv_entry { TAILQ_ENTRY(pv_entry) pv_list; TAILQ_ENTRY(pv_entry) pv_plist; vm_page_t pv_ptem; /* VM page for pte */ - boolean_t pv_wired; /* whether this entry is wired */ } *pv_entry_t; Modified: head/sys/mips/mips/pmap.c ============================================================================== --- head/sys/mips/mips/pmap.c Fri Aug 6 07:03:22 2010 (r210913) +++ head/sys/mips/mips/pmap.c Fri Aug 6 07:32:33 2010 (r210914) @@ -1473,7 +1473,6 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm pv->pv_va = va; pv->pv_pmap = pmap; pv->pv_ptem = mpte; - pv->pv_wired = FALSE; TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); m->md.pv_list_count++; @@ -1897,7 +1896,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va, pv->pv_va = va; pv->pv_pmap = pmap; pv->pv_ptem = mpte; - pv->pv_wired = wired; TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); m->md.pv_list_count++; @@ -2655,15 +2653,22 @@ int pmap_page_wired_mappings(vm_page_t m) { pv_entry_t pv; + pmap_t pmap; + pt_entry_t *pte; int count; count = 0; if ((m->flags & PG_FICTITIOUS) != 0) return (count); vm_page_lock_queues(); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) - if (pv->pv_wired) - count++; + TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { + pmap = pv->pv_pmap; + PMAP_LOCK(pmap); + pte = pmap_pte(pmap, pv->pv_va); + if (pte_test(pte, PTE_W)) + count++; + PMAP_UNLOCK(pmap); + } vm_page_unlock_queues(); return (count); }