[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-ia64-devel] [PATCH] make MMU setting of domVTi configurable
Hi, This patch makes MMU setting of domVTi configurable. The size of VTLB and VHPT can be set by boot option. (e.g. "vti_vtlb_size=256k vti_vhpt_size=1m") Also some cleanups. Thanks, Kouya Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx> diff -r cc83df4c96d6 xen/arch/ia64/vmx/vmmu.c --- a/xen/arch/ia64/vmx/vmmu.c Mon Aug 06 21:40:47 2007 -0600 +++ b/xen/arch/ia64/vmx/vmmu.c Fri Aug 10 17:54:38 2007 +0900 @@ -19,22 +19,46 @@ * Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx) * Yaozu Dong (Eddie Dong) (Eddie.dong@xxxxxxxxx) */ -#include <linux/sched.h> -#include <linux/mm.h> -#include <asm/tlb.h> -#include <asm/gcc_intrin.h> -#include <asm/vcpu.h> -#include <linux/interrupt.h> #include <asm/vmx_vcpu.h> -#include <asm/vmx_mm_def.h> -#include <asm/vmx.h> -#include <asm/hw_irq.h> #include <asm/vmx_pal_vsa.h> -#include <asm/kregs.h> -#include <asm/vcpu.h> -#include <xen/irq.h> -#include <xen/errno.h> #include <xen/sched-if.h> + +static int default_vtlb_sz = DEFAULT_VTLB_SZ; +static int default_vhpt_sz = DEFAULT_VHPT_SZ; + +static void __init parse_vtlb_size(char *s) +{ + int sz = parse_size_and_unit(s, NULL); + 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; + } +} + +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); + if (sz > 0) { + default_vhpt_sz = fls(sz - 1); + default_vhpt_sz = canonicalize_vhpt_size(default_vhpt_sz); + } +} + +custom_param("vti_vtlb_size", parse_vtlb_size); +custom_param("vti_vhpt_size", parse_vhpt_size); /* * Get the machine page frame number in 16KB unit @@ -132,66 +156,33 @@ purge_machine_tc_by_domid(domid_t domid) static int init_domain_vhpt(struct vcpu *v) { - struct page_info *page; - void * vbase; - page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0); - if ( page == NULL ) { - printk("No enough contiguous memory for init_domain_vhpt\n"); - return -ENOMEM; - } - vbase = page_to_virt(page); - memset(vbase, 0, VCPU_VHPT_SIZE); - printk(XENLOG_DEBUG "Allocate domain vhpt at 0x%p\n", vbase); - - VHPT(v,hash) = vbase; - VHPT(v,hash_sz) = VCPU_VHPT_SIZE/2; - VHPT(v,cch_buf) = (void *)((u64)vbase + VHPT(v,hash_sz)); - VHPT(v,cch_sz) = VCPU_VHPT_SIZE - VHPT(v,hash_sz); - thash_init(&(v->arch.vhpt),VCPU_VHPT_SHIFT-1); + int rc; + + rc = thash_alloc(&(v->arch.vhpt), default_vhpt_sz, "vhpt"); v->arch.arch_vmx.mpta = v->arch.vhpt.pta.val; - - return 0; + return rc; } static void free_domain_vhpt(struct vcpu *v) { - struct page_info *page; - - if (v->arch.vhpt.hash) { - page = virt_to_page(v->arch.vhpt.hash); - free_domheap_pages(page, VCPU_VHPT_ORDER); - v->arch.vhpt.hash = 0; - } - - return; + if (v->arch.vhpt.hash) + thash_free(&(v->arch.vhpt)); } int init_domain_tlb(struct vcpu *v) { - struct page_info *page; - void * vbase; int rc; rc = init_domain_vhpt(v); if (rc) return rc; - page = alloc_domheap_pages (NULL, VCPU_VTLB_ORDER, 0); - if ( page == NULL ) { - printk("No enough contiguous memory for init_domain_tlb\n"); + rc = thash_alloc(&(v->arch.vtlb), default_vtlb_sz, "vtlb"); + if (rc) { free_domain_vhpt(v); - return -ENOMEM; - } - vbase = page_to_virt(page); - memset(vbase, 0, VCPU_VTLB_SIZE); - printk(XENLOG_DEBUG "Allocate domain vtlb at 0x%p\n", vbase); - - VTLB(v,hash) = vbase; - VTLB(v,hash_sz) = VCPU_VTLB_SIZE/2; - VTLB(v,cch_buf) = (void *)((u64)vbase + VTLB(v,hash_sz)); - VTLB(v,cch_sz) = VCPU_VTLB_SIZE - VTLB(v,hash_sz); - thash_init(&(v->arch.vtlb),VCPU_VTLB_SHIFT-1); + return rc; + } return 0; } @@ -199,12 +190,8 @@ int init_domain_tlb(struct vcpu *v) void free_domain_tlb(struct vcpu *v) { - struct page_info *page; - - if ( v->arch.vtlb.hash) { - page = virt_to_page(v->arch.vtlb.hash); - free_domheap_pages(page, VCPU_VTLB_ORDER); - } + if ( v->arch.vtlb.hash) + thash_free(&(v->arch.vtlb)); free_domain_vhpt(v); } diff -r cc83df4c96d6 xen/arch/ia64/vmx/vmx_entry.S --- a/xen/arch/ia64/vmx/vmx_entry.S Mon Aug 06 21:40:47 2007 -0600 +++ b/xen/arch/ia64/vmx/vmx_entry.S Fri Aug 10 11:00:35 2007 +0900 @@ -20,21 +20,9 @@ * Kun Tian (Kevin Tian) (kevin.tian@xxxxxxxxx) */ -#ifndef VCPU_TLB_SHIFT -#define VCPU_TLB_SHIFT 22 -#endif #include <linux/config.h> #include <asm/asmmacro.h> -#include <asm/cache.h> -#include <asm/kregs.h> #include <asm/offsets.h> -#include <asm/pgtable.h> -#include <asm/percpu.h> -#include <asm/processor.h> -#include <asm/thread_info.h> -#include <asm/unistd.h> -#include <asm/vhpt.h> -#include <asm/vmmu.h> #include "vmx_minstate.h" GLOBAL_ENTRY(ia64_leave_nested) @@ -719,7 +707,7 @@ 1: movl r25=PAGE_KERNEL ;; or loc5 = r25,loc5 // construct PA | page properties - mov r23 = VCPU_VHPT_SHIFT <<2 + mov r23 = IA64_GRANULE_SHIFT <<2 ;; ptr.d in3,r23 ;; diff -r cc83df4c96d6 xen/arch/ia64/vmx/vtlb.c --- a/xen/arch/ia64/vmx/vtlb.c Mon Aug 06 21:40:47 2007 -0600 +++ b/xen/arch/ia64/vmx/vtlb.c Fri Aug 10 17:56:40 2007 +0900 @@ -21,18 +21,7 @@ * XiaoYan Feng (Fleming Feng) (Fleming.feng@xxxxxxxxx) */ -#include <linux/sched.h> -#include <asm/tlb.h> -#include <xen/mm.h> -#include <asm/vmx_mm_def.h> -#include <asm/gcc_intrin.h> -#include <linux/interrupt.h> #include <asm/vmx_vcpu.h> -#include <asm/vmx_phy_mode.h> -#include <asm/vmmu.h> -#include <asm/tlbflush.h> -#include <asm/regionreg.h> -#define MAX_CCH_LENGTH 40 thash_data_t *__alloc_chain(thash_cb_t *); @@ -664,7 +653,7 @@ thash_data_t *vtlb_lookup(VCPU *v, u64 v /* * Initialize internal control data before service. */ -void thash_init(thash_cb_t *hcb, u64 sz) +static void thash_init(thash_cb_t *hcb, u64 sz) { int num; thash_data_t *head; @@ -688,3 +677,43 @@ void thash_init(thash_cb_t *hcb, u64 sz) hcb->cch_free_idx = 0; hcb->cch_freelist = NULL; } + +int thash_alloc(thash_cb_t *hcb, u64 sz_log2, char *what) +{ + struct page_info *page; + void * vbase; + u64 sz = 1UL << sz_log2; + + page = alloc_domheap_pages (NULL, (sz_log2 + 1 - PAGE_SHIFT), 0); + if ( page == NULL ) { + printk("No enough contiguous memory(%ldKB) for init_domain_%s\n", + sz >> (10 - 1), what); + return -ENOMEM; + } + vbase = page_to_virt(page); + memset(vbase, 0, sz + sz); // hash + collisions chain + if (sz_log2 >= 20 - 1) + printk(XENLOG_DEBUG "Allocate domain %s at 0x%p(%ldMB)\n", + what, vbase, sz >> (20 - 1)); + else + printk(XENLOG_DEBUG "Allocate domain %s at 0x%p(%ldKB)\n", + what, vbase, sz >> (10 - 1)); + + hcb->hash = vbase; + hcb->hash_sz = sz; + hcb->cch_buf = (void *)((u64)vbase + hcb->hash_sz); + hcb->cch_sz = sz; + thash_init(hcb, sz_log2); + return 0; +} + +void thash_free(thash_cb_t *hcb) +{ + struct page_info *page; + + if (hcb->hash) { + page = virt_to_page(hcb->hash); + free_domheap_pages(page, hcb->pta.size + 1 - PAGE_SHIFT); + hcb->hash = 0; + } +} diff -r cc83df4c96d6 xen/include/asm-ia64/vmmu.h --- a/xen/include/asm-ia64/vmmu.h Mon Aug 06 21:40:47 2007 -0600 +++ b/xen/include/asm-ia64/vmmu.h Fri Aug 10 15:15:31 2007 +0900 @@ -24,12 +24,8 @@ #define XEN_TLBthash_H #define MAX_CCN_DEPTH (15) // collision chain depth -#define VCPU_VTLB_SHIFT (20) // 1M for VTLB -#define VCPU_VTLB_SIZE (1UL<<VCPU_VTLB_SHIFT) -#define VCPU_VTLB_ORDER (VCPU_VTLB_SHIFT - PAGE_SHIFT) -#define VCPU_VHPT_SHIFT (24) // 16M for VTLB -#define VCPU_VHPT_SIZE (1UL<<VCPU_VHPT_SHIFT) -#define VCPU_VHPT_ORDER (VCPU_VHPT_SHIFT - PAGE_SHIFT) +#define DEFAULT_VTLB_SZ (19) // 512K hash + 512K 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) #define _PAGE_PL_PRIV (CONFIG_CPL0_EMUL << 7) @@ -202,9 +198,11 @@ typedef struct thash_cb { } thash_cb_t; /* - * Initialize internal control data before service. - */ -extern void thash_init(thash_cb_t *hcb, u64 sz); + * Allocate and initialize internal control data before service. + */ +extern int thash_alloc(thash_cb_t *hcb, u64 sz, char *what); + +extern void thash_free(thash_cb_t *hcb); /* * Insert an entry to hash table. _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |