diff options
author | Yang Zhang <yang.zhang@intel.com> | 2009-03-23 03:31:04 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-06-10 04:48:34 -0400 |
commit | 362c1055e58ecd25a9393c520ab263c80b147497 (patch) | |
tree | 76fe99925f7ce1e9bf14733658ea51b4dd025703 | |
parent | a8b876b1a469cb364fee16ba3aef01613a1231cc (diff) |
KVM: ia64: enable external interrupt in vmm
Currently, the interrupt enable bit is cleared when in
the vmm. This patch sets the bit and the external interrupts can
be dealt with when in the vmm. This improves the I/O performance.
Signed-off-by: Yang Zhang <yang.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/ia64/kvm/process.c | 5 | ||||
-rw-r--r-- | arch/ia64/kvm/vmm_ivt.S | 18 | ||||
-rw-r--r-- | arch/ia64/kvm/vtlb.c | 3 |
3 files changed, 16 insertions, 10 deletions
diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index b1dc80952d91..a8f84da04b49 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c | |||
@@ -652,20 +652,25 @@ void kvm_ia64_handle_break(unsigned long ifa, struct kvm_pt_regs *regs, | |||
652 | unsigned long isr, unsigned long iim) | 652 | unsigned long isr, unsigned long iim) |
653 | { | 653 | { |
654 | struct kvm_vcpu *v = current_vcpu; | 654 | struct kvm_vcpu *v = current_vcpu; |
655 | long psr; | ||
655 | 656 | ||
656 | if (ia64_psr(regs)->cpl == 0) { | 657 | if (ia64_psr(regs)->cpl == 0) { |
657 | /* Allow hypercalls only when cpl = 0. */ | 658 | /* Allow hypercalls only when cpl = 0. */ |
658 | if (iim == DOMN_PAL_REQUEST) { | 659 | if (iim == DOMN_PAL_REQUEST) { |
660 | local_irq_save(psr); | ||
659 | set_pal_call_data(v); | 661 | set_pal_call_data(v); |
660 | vmm_transition(v); | 662 | vmm_transition(v); |
661 | get_pal_call_result(v); | 663 | get_pal_call_result(v); |
662 | vcpu_increment_iip(v); | 664 | vcpu_increment_iip(v); |
665 | local_irq_restore(psr); | ||
663 | return; | 666 | return; |
664 | } else if (iim == DOMN_SAL_REQUEST) { | 667 | } else if (iim == DOMN_SAL_REQUEST) { |
668 | local_irq_save(psr); | ||
665 | set_sal_call_data(v); | 669 | set_sal_call_data(v); |
666 | vmm_transition(v); | 670 | vmm_transition(v); |
667 | get_sal_call_result(v); | 671 | get_sal_call_result(v); |
668 | vcpu_increment_iip(v); | 672 | vcpu_increment_iip(v); |
673 | local_irq_restore(psr); | ||
669 | return; | 674 | return; |
670 | } | 675 | } |
671 | } | 676 | } |
diff --git a/arch/ia64/kvm/vmm_ivt.S b/arch/ia64/kvm/vmm_ivt.S index 3ef1a017a318..40920c630649 100644 --- a/arch/ia64/kvm/vmm_ivt.S +++ b/arch/ia64/kvm/vmm_ivt.S | |||
@@ -95,7 +95,7 @@ GLOBAL_ENTRY(kvm_vmm_panic) | |||
95 | ;; | 95 | ;; |
96 | srlz.i // guarantee that interruption collection is on | 96 | srlz.i // guarantee that interruption collection is on |
97 | ;; | 97 | ;; |
98 | //(p15) ssm psr.i // restore psr.i | 98 | (p15) ssm psr.i // restore psr. |
99 | addl r14=@gprel(ia64_leave_hypervisor),gp | 99 | addl r14=@gprel(ia64_leave_hypervisor),gp |
100 | ;; | 100 | ;; |
101 | KVM_SAVE_REST | 101 | KVM_SAVE_REST |
@@ -249,7 +249,7 @@ ENTRY(kvm_break_fault) | |||
249 | ;; | 249 | ;; |
250 | srlz.i // guarantee that interruption collection is on | 250 | srlz.i // guarantee that interruption collection is on |
251 | ;; | 251 | ;; |
252 | //(p15)ssm psr.i // restore psr.i | 252 | (p15)ssm psr.i // restore psr.i |
253 | addl r14=@gprel(ia64_leave_hypervisor),gp | 253 | addl r14=@gprel(ia64_leave_hypervisor),gp |
254 | ;; | 254 | ;; |
255 | KVM_SAVE_REST | 255 | KVM_SAVE_REST |
@@ -439,7 +439,7 @@ kvm_dispatch_vexirq: | |||
439 | ;; | 439 | ;; |
440 | srlz.i // guarantee that interruption collection is on | 440 | srlz.i // guarantee that interruption collection is on |
441 | ;; | 441 | ;; |
442 | //(p15) ssm psr.i // restore psr.i | 442 | (p15) ssm psr.i // restore psr.i |
443 | adds r3=8,r2 // set up second base pointer | 443 | adds r3=8,r2 // set up second base pointer |
444 | ;; | 444 | ;; |
445 | KVM_SAVE_REST | 445 | KVM_SAVE_REST |
@@ -819,7 +819,7 @@ ENTRY(kvm_dtlb_miss_dispatch) | |||
819 | ;; | 819 | ;; |
820 | srlz.i // guarantee that interruption collection is on | 820 | srlz.i // guarantee that interruption collection is on |
821 | ;; | 821 | ;; |
822 | //(p15) ssm psr.i // restore psr.i | 822 | (p15) ssm psr.i // restore psr.i |
823 | addl r14=@gprel(ia64_leave_hypervisor_prepare),gp | 823 | addl r14=@gprel(ia64_leave_hypervisor_prepare),gp |
824 | ;; | 824 | ;; |
825 | KVM_SAVE_REST | 825 | KVM_SAVE_REST |
@@ -842,7 +842,7 @@ ENTRY(kvm_itlb_miss_dispatch) | |||
842 | ;; | 842 | ;; |
843 | srlz.i // guarantee that interruption collection is on | 843 | srlz.i // guarantee that interruption collection is on |
844 | ;; | 844 | ;; |
845 | //(p15) ssm psr.i // restore psr.i | 845 | (p15) ssm psr.i // restore psr.i |
846 | addl r14=@gprel(ia64_leave_hypervisor),gp | 846 | addl r14=@gprel(ia64_leave_hypervisor),gp |
847 | ;; | 847 | ;; |
848 | KVM_SAVE_REST | 848 | KVM_SAVE_REST |
@@ -871,7 +871,7 @@ ENTRY(kvm_dispatch_reflection) | |||
871 | ;; | 871 | ;; |
872 | srlz.i // guarantee that interruption collection is on | 872 | srlz.i // guarantee that interruption collection is on |
873 | ;; | 873 | ;; |
874 | //(p15) ssm psr.i // restore psr.i | 874 | (p15) ssm psr.i // restore psr.i |
875 | addl r14=@gprel(ia64_leave_hypervisor),gp | 875 | addl r14=@gprel(ia64_leave_hypervisor),gp |
876 | ;; | 876 | ;; |
877 | KVM_SAVE_REST | 877 | KVM_SAVE_REST |
@@ -898,7 +898,7 @@ ENTRY(kvm_dispatch_virtualization_fault) | |||
898 | ;; | 898 | ;; |
899 | srlz.i // guarantee that interruption collection is on | 899 | srlz.i // guarantee that interruption collection is on |
900 | ;; | 900 | ;; |
901 | //(p15) ssm psr.i // restore psr.i | 901 | (p15) ssm psr.i // restore psr.i |
902 | addl r14=@gprel(ia64_leave_hypervisor_prepare),gp | 902 | addl r14=@gprel(ia64_leave_hypervisor_prepare),gp |
903 | ;; | 903 | ;; |
904 | KVM_SAVE_REST | 904 | KVM_SAVE_REST |
@@ -920,7 +920,7 @@ ENTRY(kvm_dispatch_interrupt) | |||
920 | ;; | 920 | ;; |
921 | srlz.i | 921 | srlz.i |
922 | ;; | 922 | ;; |
923 | //(p15) ssm psr.i | 923 | (p15) ssm psr.i |
924 | addl r14=@gprel(ia64_leave_hypervisor),gp | 924 | addl r14=@gprel(ia64_leave_hypervisor),gp |
925 | ;; | 925 | ;; |
926 | KVM_SAVE_REST | 926 | KVM_SAVE_REST |
@@ -1333,7 +1333,7 @@ hostret = r24 | |||
1333 | ;; | 1333 | ;; |
1334 | (p7) srlz.i | 1334 | (p7) srlz.i |
1335 | ;; | 1335 | ;; |
1336 | //(p6) ssm psr.i | 1336 | (p6) ssm psr.i |
1337 | ;; | 1337 | ;; |
1338 | mov rp=rpsave | 1338 | mov rp=rpsave |
1339 | mov ar.pfs=pfssave | 1339 | mov ar.pfs=pfssave |
diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 2c2501f13159..4290a429bf7c 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c | |||
@@ -254,7 +254,8 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte) | |||
254 | "(p7) st8 [%2]=r9;;" | 254 | "(p7) st8 [%2]=r9;;" |
255 | "ssm psr.ic;;" | 255 | "ssm psr.ic;;" |
256 | "srlz.d;;" | 256 | "srlz.d;;" |
257 | /* "ssm psr.i;;" Once interrupts in vmm open, need fix*/ | 257 | "ssm psr.i;;" |
258 | "srlz.d;;" | ||
258 | : "=r"(ret) : "r"(iha), "r"(pte):"memory"); | 259 | : "=r"(ret) : "r"(iha), "r"(pte):"memory"); |
259 | 260 | ||
260 | return ret; | 261 | return ret; |