==== //depot/projects/sparc64/sys/sparc64/include/tsb.h#15 - /usr/p4/sparc64/sys/sparc64/include/tsb.h ==== --- /tmp/tmp.70614.1 Mon Feb 25 20:12:13 2002 +++ /usr/p4/sparc64/sys/sparc64/include/tsb.h Mon Feb 25 19:13:06 2002 @@ -32,7 +32,9 @@ #ifndef _MACHINE_TSB_H_ #define _MACHINE_TSB_H_ -#define TSB_BSHIFT PAGE_SHIFT_8K +#define TSB_PAGES_SHIFT (1) +#define TSB_PAGES (1 << TSB_PAGES_SHIFT) +#define TSB_BSHIFT (TSB_PAGES_SHIFT + PAGE_SHIFT) #define TSB_BSIZE (1UL << TSB_BSHIFT) #define TSB_SIZE (TSB_BSIZE / sizeof(struct tte)) #define TSB_BUCKET_SHIFT (2) ==== //depot/projects/sparc64/sys/sparc64/sparc64/pmap.c#58 - /usr/p4/sparc64/sys/sparc64/sparc64/pmap.c ==== --- /tmp/tmp.70614.2 Mon Feb 25 20:12:14 2002 +++ /usr/p4/sparc64/sys/sparc64/sparc64/pmap.c Mon Feb 25 19:13:41 2002 @@ -1069,37 +1069,39 @@ void pmap_pinit(pmap_t pm) { + vm_page_t ma[TSB_PAGES]; vm_page_t m; + int i; /* * Allocate kva space for the tsb. */ if (pm->pm_tsb == NULL) { pm->pm_tsb = (struct tte *)kmem_alloc_pageable(kernel_map, - PAGE_SIZE_8K); + TSB_BSIZE); } /* * Allocate an object for it. */ if (pm->pm_tsb_obj == NULL) - pm->pm_tsb_obj = vm_object_allocate(OBJT_DEFAULT, 1); + pm->pm_tsb_obj = vm_object_allocate(OBJT_DEFAULT, TSB_PAGES); - /* - * Allocate the tsb page. - */ - m = vm_page_grab(pm->pm_tsb_obj, 0, VM_ALLOC_RETRY | VM_ALLOC_ZERO); - if ((m->flags & PG_ZERO) == 0) - pmap_zero_page(VM_PAGE_TO_PHYS(m)); + for (i = 0; i < TSB_PAGES; i++) { + m = vm_page_grab(pm->pm_tsb_obj, i, + VM_ALLOC_RETRY | VM_ALLOC_ZERO); + if ((m->flags & PG_ZERO) == 0) + pmap_zero_page(VM_PAGE_TO_PHYS(m)); - m->wire_count++; - cnt.v_wire_count++; + m->wire_count++; + cnt.v_wire_count++; - vm_page_flag_clear(m, PG_MAPPED | PG_BUSY); - m->valid = VM_PAGE_BITS_ALL; + vm_page_flag_clear(m, PG_MAPPED | PG_BUSY); + m->valid = VM_PAGE_BITS_ALL; - pmap_kenter((vm_offset_t)pm->pm_tsb, VM_PAGE_TO_PHYS(m)); - tlb_page_demap(TLB_DTLB, TLB_CTX_KERNEL, (vm_offset_t)pm->pm_tsb); + ma[i] = m; + } + pmap_qenter((vm_offset_t)pm->pm_tsb, ma, TSB_PAGES); pm->pm_active = 0; pm->pm_context = pmap_context_alloc(); @@ -1134,17 +1136,17 @@ KASSERT(pmap_resident_count(pm) == 0, ("pmap_release: resident pages %ld != 0", pmap_resident_count(pm))); - m = TAILQ_FIRST(&obj->memq); - pmap_context_destroy(pm->pm_context); - if (vm_page_sleep_busy(m, FALSE, "pmaprl")) - return; - vm_page_busy(m); - KASSERT(m->hold_count == 0, ("pmap_release: freeing held tsb page")); - pmap_kremove((vm_offset_t)pm->pm_tsb); - tlb_page_demap(TLB_DTLB, TLB_CTX_KERNEL, (vm_offset_t)pm->pm_tsb); - m->wire_count--; - cnt.v_wire_count--; - vm_page_free_zero(m); + TAILQ_FOREACH(m, &obj->memq, listq) { + if (vm_page_sleep_busy(m, FALSE, "pmaprl")) + continue; + vm_page_busy(m); + KASSERT(m->hold_count == 0, + ("pmap_release: freeing held tsb page")); + m->wire_count--; + cnt.v_wire_count--; + vm_page_free_zero(m); + } + pmap_qremove((vm_offset_t)pm->pm_tsb, TSB_PAGES); } /*