On 17.11.2013, at 20:09, Liu Ping Fan <qemul...@gmail.com> wrote:

> In some scene, e.g openstack CI, PR guest can trigger "sc 1" frequently,
> this patch optimizes the path by directly delivering BOOK3S_INTERRUPT_SYSCALL
> to HV guest, so powernv can return to HV guest without heavy exit, i.e,
> no need to swap TLB, HTAB,.. etc
> 
> Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com>
> ---
> arch/powerpc/kvm/book3s_hv.c            |  6 ------
> arch/powerpc/kvm/book3s_hv_rmhandlers.S | 12 +++++++++++-
> 2 files changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
> index 62a2b5a..73dc852 100644
> --- a/arch/powerpc/kvm/book3s_hv.c
> +++ b/arch/powerpc/kvm/book3s_hv.c
> @@ -628,12 +628,6 @@ static int kvmppc_handle_exit(struct kvm_run *run, 
> struct kvm_vcpu *vcpu,
>               /* hcall - punt to userspace */
>               int i;
> 
> -             if (vcpu->arch.shregs.msr & MSR_PR) {
> -                     /* sc 1 from userspace - reflect to guest syscall */
> -                     kvmppc_book3s_queue_irqprio(vcpu, 
> BOOK3S_INTERRUPT_SYSCALL);
> -                     r = RESUME_GUEST;
> -                     break;
> -             }

Please document the fact that we never get here for

 1) hypercall with MSR_PR
 2) hypercall that was handled by rm code

so that when anyone reads the C file he doesn't have to dig through piles of 
asm code to understand what's happening.

>               run->papr_hcall.nr = kvmppc_get_gpr(vcpu, 3);
>               for (i = 0; i < 9; ++i)
>                       run->papr_hcall.args[i] = kvmppc_get_gpr(vcpu, 4 + i);
> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S 
> b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> index c71103b..0d1e2c2 100644
> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> @@ -1388,7 +1388,8 @@ kvmppc_hisi:
> hcall_try_real_mode:
>       ld      r3,VCPU_GPR(R3)(r9)
>       andi.   r0,r11,MSR_PR
> -     bne     guest_exit_cont
> +     /* sc 1 from userspace - reflect to guest syscall */
> +     bne     sc_1_fast_return
>       clrrdi  r3,r3,2
>       cmpldi  r3,hcall_real_table_end - hcall_real_table
>       bge     guest_exit_cont
> @@ -1409,6 +1410,15 @@ hcall_try_real_mode:
>       ld      r11,VCPU_MSR(r4)
>       b       fast_guest_return
> 
> +sc_1_fast_return:
> +     mtspr   SPRN_SRR0,r10
> +     mtspr   SPRN_SRR1,r11
> +     li      r10, BOOK3S_INTERRUPT_SYSCALL
> +     li      r11, (MSR_ME << 1) | 1  /* synthesize MSR_SF | MSR_ME */
> +     rotldi  r11, r11, 63
> +     mr      r4,r9
> +     b       fast_guest_return

While at it, please also document the input registers to fast_guest_return. As 
you've seen it's very easy to get them right when they're not properly 
documented in the header of the function.

Apart from these minor bits, the patch looks very sound and hopefully speeds up 
PR-in-HV by quite a bit.


Alex

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to