Hi Isaku,
Thanks for tracking it down.
This is new one per your input.
Next step, we need add warning mechanism in fast path.
Thanks,
Anthony
Isaku Yamahata wrote:
> Hi Anthony.
>
> I tracked it down.
> The key is perfc=y and perfc_arrays=y. I suppose you didn't enabled
> those.
> I can boot VTi domain without panic with the following patch.
>
> While debuging, I noticed that switch_mm_mode() also calls
> panic_domain() which isn't usually called. If panic_domain() is called
> on the fast path, the vmm itself would panic.
> Could you refine it?
> And could you add comments to the new fast C routine to warn?
>
> diff -r 2ce591cbc564 xen/arch/ia64/vmx/vmx_phy_mode.c
> --- a/xen/arch/ia64/vmx/vmx_phy_mode.c Wed May 14 12:31:37 2008
+0900
> +++ b/xen/arch/ia64/vmx/vmx_phy_mode.c Wed May 14 14:15:36 2008
+0900
> @@ -180,7 +180,7 @@
> ia64_srlz_d();
> }
>
> -void
> +static void
> switch_to_physical_rid(VCPU *vcpu)
> {
> u64 psr;
> @@ -208,7 +208,7 @@
> return;
> }
>
> -void
> +static void
> switch_to_virtual_rid(VCPU *vcpu)
> {
> u64 psr;
> @@ -228,12 +228,13 @@
> return mm_switch_table[MODE_IND(opsr)][MODE_IND(npsr)];
> }
>
> -void
> -switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
> +static void
> +__switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr, int
> is_fast) {
> int act;
> act = mm_switch_action(old_psr, new_psr);
> - perfc_incra(vmx_switch_mm_mode, act);
> + if (unlikely(!is_fast))
> + perfc_incra(vmx_switch_mm_mode, act);
> switch (act) {
> case SW_2P_DT:
> vcpu->arch.arch_vmx.mmu_mode = VMX_MMU_PHY_DT;
> @@ -252,8 +253,9 @@
> switch_to_virtual_rid(vcpu);
> break;
> case SW_SELF:
> -// printk("Switch to self-0x%lx!!! MM mode doesn't
> change...\n",
> -// old_psr.val);
> + if (unlikely(!is_fast))
> + printk("Switch to self-0x%lx!!! MM mode doesn't
> change...\n", + old_psr.val);
> break;
> case SW_NOP:
> // printk("No action required for mode transition: (0x%lx ->
> 0x%lx)\n", @@ -267,6 +269,21 @@
> break;
> }
> return;
> +}
> +
> +void
> +switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
> +{
> + __switch_mm_mode(vcpu, old_psr, new_psr, 0);
> +}
> +
> +void
> +switch_mm_mode_fast(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
> +{
> + /* When fast path, psr.ic = 0, psr.i = 0, psr.bn = 0
> + * so that no tlb miss is allowed.
> + */
> + __switch_mm_mode(vcpu, old_psr, new_psr, 1);
> }
>
> void
> diff -r 2ce591cbc564 xen/arch/ia64/vmx/vmx_vcpu.c
> --- a/xen/arch/ia64/vmx/vmx_vcpu.c Wed May 14 12:31:37 2008 +0900
> +++ b/xen/arch/ia64/vmx/vmx_vcpu.c Wed May 14 14:15:36 2008 +0900
> @@ -298,7 +298,7 @@
>
> ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
>
> - switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
> + switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr,
> (IA64_PSR)new_vpsr); }
>
>
> @@ -348,7 +348,7 @@
>
> ia64_setreg(_IA64_REG_CR_IIP, VCPU(vcpu, iip));
>
> - switch_mm_mode(vcpu, (IA64_PSR)vpsr, (IA64_PSR)vipsr);
> + switch_mm_mode_fast(vcpu, (IA64_PSR)vpsr, (IA64_PSR)vipsr);
> }
>
>
> @@ -369,7 +369,7 @@
> mipsr |= imm24 & (~IA64_PSR_PP);
> ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
>
> - switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
> + switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr,
> (IA64_PSR)new_vpsr); }
>
> void vmx_vcpu_rsm_fast(VCPU *vcpu, u64 imm24)
> @@ -394,7 +394,7 @@
>
> ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
>
> - switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
> + switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr,
> (IA64_PSR)new_vpsr); }
>
> IA64FAULT vmx_vcpu_rfi(VCPU *vcpu)
> diff -r 2ce591cbc564 xen/include/asm-ia64/vmx_phy_mode.h
> --- a/xen/include/asm-ia64/vmx_phy_mode.h Wed May 14 12:31:37 2008
> +0900 +++ b/xen/include/asm-ia64/vmx_phy_mode.h Wed May 14
14:15:36
> 2008 +0900 @@ -76,9 +76,8 @@
> #define PHY_PAGE_WB
> (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_WB|_PAGE_AR_RWX)
>
> extern void physical_mode_init(VCPU *);
> -extern void switch_to_physical_rid(VCPU *);
> -extern void switch_to_virtual_rid(VCPU *vcpu);
> extern void switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR
> new_psr); +extern void switch_mm_mode_fast(VCPU *vcpu, IA64_PSR
> old_psr, IA64_PSR new_psr); extern void check_mm_mode_switch (VCPU
> *vcpu, IA64_PSR old_psr, IA64_PSR new_psr); extern void
> prepare_if_physical_mode(VCPU *vcpu); extern void
> recover_if_physical_mode(VCPU *vcpu);
>
>
> On Mon, May 12, 2008 at 04:12:28PM +0900, Isaku Yamahata wrote:
>> On Mon, May 12, 2008 at 11:27:29AM +0800, Xu, Anthony wrote:
>>> Hi isaku,
>>>
>>> I can't reprocude it.
>>> I had booted guest rhel4-2 and windows server 2003 SP1 with intel &
>>> opensource Guest FW.
>>>
>>> What's your FW version and guest OS version?
>>
>> GFW: open gfw of change set 124:ececa5a5473b (prebuild one)
>>
>> kernel:
>> - Linux version 2.6.9-22.EL (bhcompile@xxxxxxxxxxxxxxxxxxxxxx) (gcc
>> version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19
>> 17:54:55 EDT 2005
>> - Linux 2.6.18 + xen (My local compile)
>> - Windows 2003
20080514.patch
Description: 20080514.patch
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|