PERFORCE change 97835 for review
Kip Macy
kmacy at FreeBSD.org
Thu May 25 15:52:23 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=97835
Change 97835 by kmacy at kmacy_storage:sun4v_work on 2006/05/25 22:43:10
change initial TSB size to be the same as the initial hash table size
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tsb.c#16 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tsb.c#16 (text+ko) ====
@@ -50,13 +50,17 @@
#include <machine/smp.h>
#include <machine/mmu.h>
#include <machine/tte.h>
+#include <machine/tte_hash.h>
#include <machine/tsb.h>
#include <machine/vmparam.h>
#include <machine/tlb.h>
CTASSERT(sizeof(tte_t) == sizeof(uint64_t));
#define TSB_MASK(tsb) ((tsb->hvtsb_ntte) - 1)
+/* make TSB start off at the same size as the hash */
+#define TSB_SIZE (1 << HASH_ENTRY_SHIFT)
+
#ifdef DEBUG_TSB
#define DPRINTF printf
#else
@@ -67,24 +71,21 @@
tsb_init(hv_tsb_info_t *hvtsb, uint64_t *scratchval)
{
vm_page_t m;
- int granted;
+ int i;
uint64_t tsb_pages;
- static int color;
- granted = 0;
-
- while (granted == 0) {
- m = vm_page_alloc(NULL, color++,
- VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
- VM_ALLOC_ZERO);
- if (m == NULL)
+ m = NULL;
+ while (m == NULL) {
+ m = vm_page_alloc_contig(TSB_SIZE, phys_avail[0],
+ phys_avail[1], TSB_SIZE*PAGE_SIZE, (1UL<<34));
+ if (m == NULL) {
+ printf("vm_page_alloc_contig failed - waiting to retry\n");
VM_WAIT;
- else
- granted = 1;
+ }
}
hvtsb->hvtsb_idxpgsz = TTE8K;
hvtsb->hvtsb_assoc = 1;
- hvtsb->hvtsb_ntte = (PAGE_SIZE >> TTE_SHIFT);
+ hvtsb->hvtsb_ntte = (TSB_SIZE*PAGE_SIZE >> TTE_SHIFT);
hvtsb->hvtsb_ctx_index = -1; /* TSBs aren't shared so if we don't
* set the context in the TTEs we can
* simplify miss handling slightly
@@ -93,6 +94,10 @@
hvtsb->hvtsb_rsvd = 0;
hvtsb->hvtsb_pa = VM_PAGE_TO_PHYS(m);
+ for (i = 0; i < TSB_SIZE; i++, m++)
+ if ((m->flags & PG_ZERO) == 0)
+ pmap_zero_page(m);
+
tsb_pages = hvtsb->hvtsb_ntte >> (PAGE_SHIFT - TTE_SHIFT);
*scratchval = TLB_PHYS_TO_DIRECT(hvtsb->hvtsb_pa) | tsb_pages;
@@ -102,12 +107,16 @@
void
tsb_deinit(hv_tsb_info_t *hvtsb)
{
- vm_page_t m;
+ vm_page_t m, tm;
+ int i;
+
m = PHYS_TO_VM_PAGE((vm_paddr_t)hvtsb->hvtsb_pa);
- m->wire_count--;
- atomic_subtract_int(&cnt.v_wire_count, 1);
- vm_page_free_zero(m);
+ for (i = 0, tm = m; i < TSB_SIZE; i++, m++) {
+ tm->wire_count--;
+ atomic_subtract_int(&cnt.v_wire_count, 1);
+ }
+ vm_page_release_contig(m, TSB_SIZE);
}
@@ -180,7 +189,7 @@
void
tsb_clear(hv_tsb_info_t *tsb)
{
- pmap_scrub_pages(tsb->hvtsb_pa, tsb->hvtsb_ntte << TTE_SHIFT);
+ hwblkclr((void *)TLB_PHYS_TO_DIRECT(tsb->hvtsb_pa), tsb->hvtsb_ntte << TTE_SHIFT);
}
void
More information about the p4-projects
mailing list