WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] ia64: configure VHPT size per domain: ia6

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] ia64: configure VHPT size per domain: ia64 part
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 20 Oct 2007 05:50:17 -0700
Delivery-date: Sat, 20 Oct 2007 05:51:48 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1192782501 -3600
# Node ID 3ad0080ad9b56a8eb19433c61f6e3c5644fb6f2e
# Parent  c5530fbbe9d0fb23de657532197aeb67d9ae6e02
ia64: configure VHPT size per domain: ia64 part
Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
---
 xen/arch/ia64/vmx/vmmu.c      |   22 +++++++++-------------
 xen/arch/ia64/xen/dom0_ops.c  |   17 +++++++++++++++++
 xen/arch/ia64/xen/vhpt.c      |   32 ++++++++++++++++++++++----------
 xen/include/asm-ia64/domain.h |    1 +
 xen/include/asm-ia64/vhpt.h   |   13 +++++++++++++
 5 files changed, 62 insertions(+), 23 deletions(-)

diff -r c5530fbbe9d0 -r 3ad0080ad9b5 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Fri Oct 19 09:27:55 2007 +0100
+++ b/xen/arch/ia64/vmx/vmmu.c  Fri Oct 19 09:28:21 2007 +0100
@@ -22,6 +22,7 @@
 #include <asm/vmx_vcpu.h>
 #include <asm/vmx_pal_vsa.h>
 #include <xen/sched-if.h>
+#include <asm/vhpt.h>
 
 static int default_vtlb_sz = DEFAULT_VTLB_SZ;
 static int default_vhpt_sz = DEFAULT_VHPT_SZ;
@@ -38,17 +39,6 @@ static void __init parse_vtlb_size(char 
     }
 }
 
-static int canonicalize_vhpt_size(int sz)
-{
-    /* minimum 32KB */
-    if (sz < 15)
-        return 15;
-    /* maximum 8MB (since purging TR is hard coded) */
-    if (sz > IA64_GRANULE_SHIFT - 1)
-        return IA64_GRANULE_SHIFT - 1;
-    return sz;
-}
-
 static void __init parse_vhpt_size(char *s)
 {
     int sz = parse_size_and_unit(s, NULL);
@@ -96,8 +86,14 @@ static int init_domain_vhpt(struct vcpu 
 static int init_domain_vhpt(struct vcpu *v)
 {
     int rc;
-
-    rc = thash_alloc(&(v->arch.vhpt), default_vhpt_sz, "vhpt");
+    u64 size = v->domain->arch.hvm_domain.params[HVM_PARAM_VHPT_SIZE];
+
+    if (size == 0)
+        size = default_vhpt_sz;
+    else
+        size = canonicalize_vhpt_size(size);
+
+    rc = thash_alloc(&(v->arch.vhpt), size, "vhpt");
     v->arch.arch_vmx.mpta = v->arch.vhpt.pta.val;
     return rc;
 }
diff -r c5530fbbe9d0 -r 3ad0080ad9b5 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Fri Oct 19 09:27:55 2007 +0100
+++ b/xen/arch/ia64/xen/dom0_ops.c      Fri Oct 19 09:28:21 2007 +0100
@@ -93,6 +93,9 @@ long arch_do_domctl(xen_domctl_t *op, XE
             ds->maxmem = d->arch.convmem_end;
             ds->xsi_va = d->arch.shared_info_va;
             ds->hypercall_imm = d->arch.breakimm;
+#ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
+            ds->vhpt_size_log2 = d->arch.vhpt_size_log2;
+#endif
             /* Copy back.  */
             if ( copy_to_guest(u_domctl, op, 1) )
                 ret = -EFAULT;
@@ -116,6 +119,20 @@ long arch_do_domctl(xen_domctl_t *op, XE
                     for_each_vcpu (d, v)
                         v->arch.breakimm = d->arch.breakimm;
                 }
+#ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
+                if (ds->vhpt_size_log2 == -1) {
+                    d->arch.has_pervcpu_vhpt = 0;
+                    ds->vhpt_size_log2 = -1;
+                    printk(XENLOG_INFO "XEN_DOMCTL_arch_setup: "
+                           "domain %d VHPT is global.\n", d->domain_id);
+                } else {
+                    d->arch.has_pervcpu_vhpt = 1;
+                    d->arch.vhpt_size_log2 = ds->vhpt_size_log2;
+                    printk(XENLOG_INFO "XEN_DOMCTL_arch_setup: "
+                           "domain %d VHPT is per vcpu. size=2**%d\n",
+                           d->domain_id, ds->vhpt_size_log2);
+                }
+#endif
                 if (ds->xsi_va)
                     d->arch.shared_info_va = ds->xsi_va;
                 ret = dom_fw_setup(d, ds->bp, ds->maxmem);
diff -r c5530fbbe9d0 -r 3ad0080ad9b5 xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c  Fri Oct 19 09:27:55 2007 +0100
+++ b/xen/arch/ia64/xen/vhpt.c  Fri Oct 19 09:28:21 2007 +0100
@@ -28,12 +28,13 @@ DEFINE_PER_CPU(volatile u32, vhpt_tlbflu
 #endif
 
 static void
-__vhpt_flush(unsigned long vhpt_maddr)
+__vhpt_flush(unsigned long vhpt_maddr, unsigned long vhpt_size_log2)
 {
        struct vhpt_lf_entry *v = (struct vhpt_lf_entry*)__va(vhpt_maddr);
+       unsigned long num_entries = 1 << (vhpt_size_log2 - 5);
        int i;
 
-       for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++)
+       for (i = 0; i < num_entries; i++, v++)
                v->ti_tag = INVALID_TI_TAG;
 }
 
@@ -42,7 +43,7 @@ local_vhpt_flush(void)
 {
        /* increment flush clock before flush */
        u32 flush_time = tlbflush_clock_inc_and_return();
-       __vhpt_flush(__ia64_per_cpu_var(vhpt_paddr));
+       __vhpt_flush(__ia64_per_cpu_var(vhpt_paddr), VHPT_SIZE_LOG2);
        /* this must be after flush */
        tlbflush_update_time(&__get_cpu_var(vhpt_tlbflush_timestamp),
                             flush_time);
@@ -52,17 +53,23 @@ void
 void
 vcpu_vhpt_flush(struct vcpu* v)
 {
-       __vhpt_flush(vcpu_vhpt_maddr(v));
+       unsigned long vhpt_size_log2 = VHPT_SIZE_LOG2;
+#ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
+       if (HAS_PERVCPU_VHPT(v->domain))
+               vhpt_size_log2 = v->arch.pta.size;
+#endif
+       __vhpt_flush(vcpu_vhpt_maddr(v), vhpt_size_log2);
        perfc_incr(vcpu_vhpt_flush);
 }
 
 static void
-vhpt_erase(unsigned long vhpt_maddr)
+vhpt_erase(unsigned long vhpt_maddr, unsigned long vhpt_size_log2)
 {
        struct vhpt_lf_entry *v = (struct vhpt_lf_entry*)__va(vhpt_maddr);
+       unsigned long num_entries = 1 << (vhpt_size_log2 - 5);
        int i;
 
-       for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++) {
+       for (i = 0; i < num_entries; i++, v++) {
                v->itir = 0;
                v->CChain = 0;
                v->page_flags = 0;
@@ -140,7 +147,7 @@ void __init vhpt_init(void)
        __get_cpu_var(vhpt_pend) = paddr + (1 << VHPT_SIZE_LOG2) - 1;
        printk(XENLOG_DEBUG "vhpt_init: vhpt paddr=0x%lx, end=0x%lx\n",
               paddr, __get_cpu_var(vhpt_pend));
-       vhpt_erase(paddr);
+       vhpt_erase(paddr, VHPT_SIZE_LOG2);
        // we don't enable VHPT here.
        // context_switch() or schedule_tail() does it.
 }
@@ -151,6 +158,11 @@ pervcpu_vhpt_alloc(struct vcpu *v)
 {
        unsigned long vhpt_size_log2 = VHPT_SIZE_LOG2;
 
+       if (v->domain->arch.vhpt_size_log2 > 0)
+           vhpt_size_log2 =
+               canonicalize_vhpt_size(v->domain->arch.vhpt_size_log2);
+       printk(XENLOG_DEBUG "%s vhpt_size_log2=%ld\n",
+              __func__, vhpt_size_log2);
        v->arch.vhpt_entries =
                (1UL << vhpt_size_log2) / sizeof(struct vhpt_lf_entry);
        v->arch.vhpt_page =
@@ -164,11 +176,11 @@ pervcpu_vhpt_alloc(struct vcpu *v)
 
        v->arch.pta.val = 0; // to zero reserved bits
        v->arch.pta.ve = 1; // enable vhpt
-       v->arch.pta.size = VHPT_SIZE_LOG2;
+       v->arch.pta.size = vhpt_size_log2;
        v->arch.pta.vf = 1; // long format
        v->arch.pta.base = __va_ul(v->arch.vhpt_maddr) >> 15;
 
-       vhpt_erase(v->arch.vhpt_maddr);
+       vhpt_erase(v->arch.vhpt_maddr, vhpt_size_log2);
        smp_mb(); // per vcpu vhpt may be used by another physical cpu.
        return 0;
 }
@@ -178,7 +190,7 @@ pervcpu_vhpt_free(struct vcpu *v)
 {
        if (likely(v->arch.vhpt_page != NULL))
                free_domheap_pages(v->arch.vhpt_page,
-                                  VHPT_SIZE_LOG2 - PAGE_SHIFT);
+                                  v->arch.pta.size - PAGE_SHIFT);
 }
 #endif
 
diff -r c5530fbbe9d0 -r 3ad0080ad9b5 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Fri Oct 19 09:27:55 2007 +0100
+++ b/xen/include/asm-ia64/domain.h     Fri Oct 19 09:28:21 2007 +0100
@@ -123,6 +123,7 @@ struct arch_domain {
             unsigned int is_vti : 1;
 #ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
             unsigned int has_pervcpu_vhpt : 1;
+            unsigned int vhpt_size_log2 : 6;
 #endif
         };
     };
diff -r c5530fbbe9d0 -r 3ad0080ad9b5 xen/include/asm-ia64/vhpt.h
--- a/xen/include/asm-ia64/vhpt.h       Fri Oct 19 09:27:55 2007 +0100
+++ b/xen/include/asm-ia64/vhpt.h       Fri Oct 19 09:28:21 2007 +0100
@@ -84,5 +84,18 @@ vcpu_pta(struct vcpu* v)
         (VHPT_SIZE_LOG2 << 2) | VHPT_ENABLED;
 }
 
+static inline int
+canonicalize_vhpt_size(int sz)
+{
+    /* minimum 32KB */
+    if (sz < 15)
+        return 15;
+    /* maximum 8MB (since purging TR is hard coded) */
+    if (sz > IA64_GRANULE_SHIFT - 1)
+        return IA64_GRANULE_SHIFT - 1;
+    return sz;
+}
+
+
 #endif /* !__ASSEMBLY */
 #endif

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] ia64: configure VHPT size per domain: ia64 part, Xen patchbot-unstable <=