[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] [PATCH] shrink vtlb size



Hi,

I observed usage ratio of vtlb by using the attached
modification (test_vtlb.diff).
It's very low. vtlb includes at most 21 entries.

The attached patch shrinks the default vtlb size from 512KB to 16KB
to optimize memory. Also speedup ptc_e emulation.
To improve the hash function, frequency of collision never changed
and there is no performance degradation.

The following is a result:

xm dmesg | sort | uniq -c
=============================================================
w/o patch (vtlb:512KB)
Linux:
      1 (XEN) thash_purge_all entries:6 collisions:0
      4 (XEN) thash_purge_all entries:7 collisions:0
     10 (XEN) thash_purge_all entries:8 collisions:0
      9 (XEN) thash_purge_all entries:9 collisions:0
      4 (XEN) thash_purge_all entries:10 collisions:0
      1 (XEN) thash_purge_all entries:11 collisions:0
      1 (XEN) thash_purge_all entries:17 collisions:0
      1 (XEN) thash_purge_all entries:20 collisions:0
      1 (XEN) thash_purge_all entries:20 collisions:3

Windows:
     75 (XEN) thash_purge_all entries:1 collisions:0
    228 (XEN) thash_purge_all entries:2 collisions:0
     19 (XEN) thash_purge_all entries:3 collisions:0
     18 (XEN) thash_purge_all entries:4 collisions:0
      5 (XEN) thash_purge_all entries:5 collisions:0
      4 (XEN) thash_purge_all entries:6 collisions:0
      2 (XEN) thash_purge_all entries:7 collisions:0
      9 (XEN) thash_purge_all entries:8 collisions:0
      8 (XEN) thash_purge_all entries:9 collisions:0
      4 (XEN) thash_purge_all entries:10 collisions:0
      2 (XEN) thash_purge_all entries:13 collisions:0
      1 (XEN) thash_purge_all entries:14 collisions:0
      1 (XEN) thash_purge_all entries:16 collisions:0
      1 (XEN) thash_purge_all entries:21 collisions:0

=============================================================
w patch (vtlb:16KB)
Linux:
      4 (XEN) thash_purge_all entries:7 collisions:0
      6 (XEN) thash_purge_all entries:8 collisions:0
      3 (XEN) thash_purge_all entries:9 collisions:0
     10 (XEN) thash_purge_all entries:10 collisions:0
      1 (XEN) thash_purge_all entries:11 collisions:0
      3 (XEN) thash_purge_all entries:11 collisions:1
      2 (XEN) thash_purge_all entries:12 collisions:0
      1 (XEN) thash_purge_all entries:17 collisions:1
      1 (XEN) thash_purge_all entries:19 collisions:1
      1 (XEN) thash_purge_all entries:21 collisions:0

Windows:
     90 (XEN) thash_purge_all entries:1 collisions:0
    230 (XEN) thash_purge_all entries:2 collisions:0
     19 (XEN) thash_purge_all entries:3 collisions:0
      9 (XEN) thash_purge_all entries:4 collisions:0
      6 (XEN) thash_purge_all entries:6 collisions:0
      2 (XEN) thash_purge_all entries:7 collisions:0
     10 (XEN) thash_purge_all entries:8 collisions:0
      7 (XEN) thash_purge_all entries:9 collisions:0
      4 (XEN) thash_purge_all entries:10 collisions:0
      2 (XEN) thash_purge_all entries:13 collisions:0
      1 (XEN) thash_purge_all entries:15 collisions:0
      1 (XEN) thash_purge_all entries:16 collisions:0
      1 (XEN) thash_purge_all entries:21 collisions:0

Thanks,
Kouya

Singed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r cd51fa91956b xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Sun Aug 12 14:50:02 2007 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Wed Aug 15 14:58:16 2007 +0900
@@ -381,6 +381,9 @@ thash_data_t *__alloc_chain(thash_cb_t *
     return cch;
 }
 
+#if 1
+u64 vtlb_ents, vtlb_colls;
+#endif
 /*
  * Insert an entry into hash TLB or VHPT.
  * NOTES:
@@ -398,6 +401,9 @@ void vtlb_insert(VCPU *v, u64 pte, u64 i
     /* u64 gppn, ppns, ppne; */
     u64 tag, len;
     thash_cb_t *hcb = &v->arch.vtlb;
+#if 1
+    ++vtlb_ents;
+#endif
     vcpu_get_rr(v, va, &vrr.rrval);
     vrr.ps = itir_ps(itir);
     VMX(v, psbits[va >> 61]) |= (1UL << vrr.ps);
@@ -428,6 +434,9 @@ void vtlb_insert(VCPU *v, u64 pte, u64 i
     wmb();
     hash_table->next = cch;
     hash_table->len += 1;
+#if 1
+    ++vtlb_colls;
+#endif
     return;
 }
 
@@ -581,6 +590,10 @@ void thash_purge_all(VCPU *v)
     int num;
     thash_data_t *head;
     thash_cb_t  *vtlb,*vhpt;
+#if 1
+    printk("%s entries:%ld collisions:%ld\n", __func__, vtlb_ents, vtlb_colls);
+    vtlb_ents = vtlb_colls = 0;
+#endif
     vtlb =&v->arch.vtlb;
     vhpt =&v->arch.vhpt;
 
diff -r cd51fa91956b xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Sun Aug 12 14:50:02 2007 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Wed Aug 15 14:38:37 2007 +0900
@@ -32,9 +32,9 @@ static void __init parse_vtlb_size(char 
 
     if (sz > 0) {
         default_vtlb_sz = fls(sz - 1);
-        /* minimum 256KB (since calculated tag might be broken) */
-        if (default_vtlb_sz < 18)
-            default_vtlb_sz = 18;
+        /* minimum 16KB (for tag uniqueness) */
+        if (default_vtlb_sz < 14)
+            default_vtlb_sz = 14;
     }
 }
 
@@ -240,40 +240,8 @@ void machine_tlb_insert(struct vcpu *v, 
  */
 void machine_tlb_purge(u64 va, u64 ps)
 {
-//    u64       psr;
-//    psr = ia64_clear_ic();
     ia64_ptcl(va, ps << 2);
-//    ia64_set_psr(psr);
-//    ia64_srlz_i();
-//    return;
-}
-/*
-u64 machine_thash(u64 va)
-{
-    return ia64_thash(va);
-}
-
-u64 machine_ttag(u64 va)
-{
-    return ia64_ttag(va);
-}
-*/
-thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag)
-{
-    u64 index,pfn,rid,pfn_bits;
-    pfn_bits = vpta.size-5-8;
-    pfn = REGION_OFFSET(va)>>_REGION_PAGE_SIZE(vrr);
-    rid = _REGION_ID(vrr);
-    index = ((rid&0xff)<<pfn_bits)|(pfn&((1UL<<pfn_bits)-1));
-    *tag = ((rid>>8)&0xffff) | ((pfn >>pfn_bits)<<16);
-    return (thash_data_t *)((vpta.base<<PTA_BASE_SHIFT)+(index<<5));
-//    return ia64_call_vsa(PAL_VPS_THASH,va,vrr,vpta,0,0,0,0);
-}
-
-//u64 vsa_ttag(u64 va, u64 vrr)
-//{
-//    return ia64_call_vsa(PAL_VPS_TTAG,va,vrr,0,0,0,0,0);
-//}
+}
 
 int vhpt_enabled(VCPU *vcpu, uint64_t vadr, vhpt_ref_t ref)
 {
diff -r cd51fa91956b xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Sun Aug 12 14:50:02 2007 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Wed Aug 15 14:38:37 2007 +0900
@@ -286,6 +286,16 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
     return ret;
 }
 
+static thash_data_t * vtlb_thash(PTA vpta, u64 va, u64 vrr, u64 *tag)
+{
+    u64 index,pfn,rid;
+    pfn = REGION_OFFSET(va)>>_REGION_PAGE_SIZE(vrr);
+    rid = _REGION_ID(vrr);
+    index = (pfn^rid)&((1UL<<(vpta.size-5))-1);
+    *tag = pfn^(rid<<39);
+    return (thash_data_t *)((vpta.base<<PTA_BASE_SHIFT)+(index<<5));
+}
+
 /*
  *  purge software guest tlb
  */
@@ -308,7 +318,7 @@ static void vtlb_purge(VCPU *v, u64 va, 
         size = PSIZE(rr_ps);
         vrr.ps = rr_ps;
         while (num) {
-            cur = vsa_thash(hcb->pta, curadr, vrr.rrval, &tag);
+            cur = vtlb_thash(hcb->pta, curadr, vrr.rrval, &tag);
             while (cur) {
                 if (cur->etag == tag && cur->ps == rr_ps)
                     cur->etag = 1UL << 63;
@@ -401,7 +411,7 @@ void vtlb_insert(VCPU *v, u64 pte, u64 i
     vcpu_get_rr(v, va, &vrr.rrval);
     vrr.ps = itir_ps(itir);
     VMX(v, psbits[va >> 61]) |= (1UL << vrr.ps);
-    hash_table = vsa_thash(hcb->pta, va, vrr.rrval, &tag);
+    hash_table = vtlb_thash(hcb->pta, va, vrr.rrval, &tag);
     cch = hash_table;
     while (cch) {
         if (INVALID_TLB(cch)) {
@@ -639,7 +649,7 @@ thash_data_t *vtlb_lookup(VCPU *v, u64 v
         ps = __ffs(psbits);
         psbits &= ~(1UL << ps);
         vrr.ps = ps;
-        cch = vsa_thash(hcb->pta, va, vrr.rrval, &tag);
+        cch = vtlb_thash(hcb->pta, va, vrr.rrval, &tag);
         do {
             if (cch->etag == tag && cch->ps == ps)
                 return cch;
diff -r cd51fa91956b xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Sun Aug 12 14:50:02 2007 -0600
+++ b/xen/include/asm-ia64/vmmu.h       Wed Aug 15 14:38:37 2007 +0900
@@ -24,7 +24,7 @@
 #define XEN_TLBthash_H
 
 #define     MAX_CCN_DEPTH       (15)       // collision chain depth
-#define     DEFAULT_VTLB_SZ     (19) // 512K hash + 512K c-chain for VTLB
+#define     DEFAULT_VTLB_SZ     (14) // 16K hash + 16K c-chain for VTLB
 #define     DEFAULT_VHPT_SZ     (23) // 8M hash + 8M c-chain for VHPT
 #define     VTLB(v,_x)          (v->arch.vtlb._x)
 #define     VHPT(v,_x)          (v->arch.vhpt._x)
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.