From owner-p4-projects@FreeBSD.ORG Tue May 23 05:22:47 2006 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 EAE0616A439; Tue, 23 May 2006 05:22:46 +0000 (UTC) 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 8F57616A433 for ; Tue, 23 May 2006 05:22:46 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id D845943D45 for ; Tue, 23 May 2006 05:22:45 +0000 (GMT) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k4N5M0sh003808 for ; Tue, 23 May 2006 05:22:00 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k4N5M00L003805 for perforce@freebsd.org; Tue, 23 May 2006 05:22:00 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 23 May 2006 05:22:00 GMT Message-Id: <200605230522.k4N5M00L003805@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 97665 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: Tue, 23 May 2006 05:22:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=97665 Change 97665 by kmacy@kmacy_storage:sun4v_work on 2006/05/23 05:21:02 don't lose track of the referenced bit in pmap_enter only invalidate in pmap_remove if a page is referenced or modified Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 (text+ko) ==== @@ -169,7 +169,7 @@ #ifdef PMAP_DEBUG #define KDPRINTF if (pmap_debug) printf #define DPRINTF \ - if ((PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \ + if (PCPU_GET(curpmap) && (PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \ panic("cpumask(0x%x) & active (0x%x) == 0 pid == %d\n", \ PCPU_GET(cpumask), PCPU_GET(curpmap)->pm_active, curthread->td_proc->p_pid); \ if (pmap_debug) printf @@ -960,8 +960,8 @@ tte_data |= TTE_KERNEL_MINFLAGS; - tte_hash_insert(pmap->pm_hash, va, tte_data | TTE_MINFLAGS); - tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS, pmap->pm_context); + tte_hash_insert(pmap->pm_hash, va, tte_data|TTE_MINFLAGS|VTD_REF); + tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS|VTD_REF, pmap->pm_context); invlva = FALSE; if ((otte_data & ~(VTD_W|VTD_REF)) != tte_data) { @@ -983,7 +983,6 @@ } } } - if (invlva) pmap_invalidate_page(pmap, va, TRUE); @@ -1167,7 +1166,7 @@ cpumask, (1 << curcpu)); #endif -#if 0 +#ifdef notyet if ((active_total = (pmap->pm_tlbactive & ~cpumask)) == 0) goto done; @@ -1216,6 +1215,7 @@ if (cleartsb == TRUE) tsb_clear_tte(&pmap->pm_tsb, va); + DPRINTF("pmap_invalidate_page(va=0x%lx)\n", va); spinlock_enter(); invlpg(va, pmap->pm_context); @@ -1234,11 +1234,11 @@ cpumask_t active; #endif - if ((eva - sva) == PAGE_SIZE) { pmap_invalidate_page(pmap, sva, cleartsb); return; } + if (sva >= eva) panic("invalidating negative or zero range sva=0x%lx eva=0x%lx", sva, eva); @@ -1490,7 +1490,8 @@ uint64_t otte_data; vm_page_t m; - if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva, (VTD_SW_W | VTD_W | VTD_REF))) == 0) + if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva, + (VTD_SW_W|VTD_W|VTD_REF))) == 0) continue; if (otte_data & (VTD_SW_W | VTD_W | VTD_REF)) @@ -1509,7 +1510,6 @@ } } } - if (anychanged) pmap_invalidate_range(pmap, sva, eva, TRUE); @@ -1534,7 +1534,6 @@ va += PAGE_SIZE; m++; } - pmap_invalidate_range(kernel_pmap, sva, va, FALSE); } @@ -1557,9 +1556,7 @@ pmap_kremove(va); va += PAGE_SIZE; } - pmap_invalidate_range(kernel_pmap, sva, va, TRUE); - } /* @@ -1605,13 +1602,15 @@ if ((tte_data = tte_hash_delete(pmap->pm_hash, tva)) == 0) continue; pmap_remove_tte(pmap, tte_data, tva); - invlva = 1; + if (!invlva && (tte_data & (VTD_REF|VTD_W))) + invlva = 1; } - sched_unpin(); vm_page_unlock_queues(); - if (invlva) + + if (invlva) pmap_invalidate_range(pmap, start, end, TRUE); + sched_unpin(); PMAP_UNLOCK(pmap); } @@ -1749,8 +1748,8 @@ } tte_hash_reset(pmap->pm_hash); + pmap_invalidate_all(pmap); sched_unpin(); - pmap_invalidate_all(pmap); PMAP_UNLOCK(pmap); vm_page_unlock_queues(); } @@ -1815,7 +1814,8 @@ int rv; pv_entry_t pv, pvf, pvn; pmap_t pmap; - + tte_t otte_data; + rv = 0; if (m->flags & PG_FICTITIOUS) return (rv); @@ -1835,7 +1835,8 @@ pmap = pv->pv_pmap; PMAP_LOCK(pmap); - if ((tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF) & VTD_REF) != 0) { + otte_data = tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF); + if ((otte_data & VTD_REF) != 0) { pmap_invalidate_page(pmap, pv->pv_va, TRUE); rv++;