[PATCH kernel 7/9] KVM: PPC: Create a virtual-mode only TCE table handlers
David Gibson
david at gibson.dropbear.id.au
Tue Mar 8 17:32:18 AEDT 2016
On Mon, Mar 07, 2016 at 02:41:15PM +1100, Alexey Kardashevskiy wrote:
> In-kernel VFIO acceleration needs different handling in real and virtual
> modes which makes it hard to support both modes in the same handler.
>
> This creates a copy of kvmppc_rm_h_stuff_tce and kvmppc_rm_h_put_tce
> in addition to the existing kvmppc_rm_h_put_tce_indirect.
>
> Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
Reviewed-by: David Gibson <david at gibson.dropbear.id.au>
> ---
> arch/powerpc/kvm/book3s_64_vio.c | 52 +++++++++++++++++++++++++++++++++
> arch/powerpc/kvm/book3s_64_vio_hv.c | 8 ++---
> arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 +--
> 3 files changed, 57 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
> index 846d16d..7965fc7 100644
> --- a/arch/powerpc/kvm/book3s_64_vio.c
> +++ b/arch/powerpc/kvm/book3s_64_vio.c
> @@ -317,6 +317,32 @@ fail:
> return ret;
> }
>
> +long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
> + unsigned long ioba, unsigned long tce)
> +{
> + struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn);
> + long ret;
> +
> + /* udbg_printf("H_PUT_TCE(): liobn=0x%lx ioba=0x%lx, tce=0x%lx\n", */
> + /* liobn, ioba, tce); */
> +
> + if (!stt)
> + return H_TOO_HARD;
> +
> + ret = kvmppc_ioba_validate(stt, ioba, 1);
> + if (ret != H_SUCCESS)
> + return ret;
> +
> + ret = kvmppc_tce_validate(stt, tce);
> + if (ret != H_SUCCESS)
> + return ret;
> +
> + kvmppc_tce_put(stt, ioba >> stt->page_shift, tce);
> +
> + return H_SUCCESS;
> +}
> +EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
> +
> long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu,
> unsigned long liobn, unsigned long ioba,
> unsigned long tce_list, unsigned long npages)
> @@ -372,3 +398,29 @@ unlock_exit:
> return ret;
> }
> EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect);
> +
> +long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu,
> + unsigned long liobn, unsigned long ioba,
> + unsigned long tce_value, unsigned long npages)
> +{
> + struct kvmppc_spapr_tce_table *stt;
> + long i, ret;
> +
> + stt = kvmppc_find_table(vcpu, liobn);
> + if (!stt)
> + return H_TOO_HARD;
> +
> + ret = kvmppc_ioba_validate(stt, ioba, npages);
> + if (ret != H_SUCCESS)
> + return ret;
> +
> + /* Check permission bits only to allow userspace poison TCE for debug */
> + if (tce_value & (TCE_PCI_WRITE | TCE_PCI_READ))
> + return H_PARAMETER;
> +
> + for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift))
> + kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value);
> +
> + return H_SUCCESS;
> +}
> +EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce);
> diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c
> index af155f6..11163ae 100644
> --- a/arch/powerpc/kvm/book3s_64_vio_hv.c
> +++ b/arch/powerpc/kvm/book3s_64_vio_hv.c
> @@ -212,8 +212,8 @@ static struct mm_iommu_table_group_mem_t *kvmppc_rm_iommu_lookup(
> return mm_iommu_lookup_rm(mm, ua, size);
> }
>
> -long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
> - unsigned long ioba, unsigned long tce)
> +long kvmppc_rm_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
> + unsigned long ioba, unsigned long tce)
> {
> struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn);
> long ret;
> @@ -236,7 +236,6 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
>
> return H_SUCCESS;
> }
> -EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
>
> static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu,
> unsigned long ua, unsigned long *phpa)
> @@ -350,7 +349,7 @@ unlock_exit:
> return ret;
> }
>
> -long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu,
> +long kvmppc_rm_h_stuff_tce(struct kvm_vcpu *vcpu,
> unsigned long liobn, unsigned long ioba,
> unsigned long tce_value, unsigned long npages)
> {
> @@ -374,7 +373,6 @@ long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu,
>
> return H_SUCCESS;
> }
> -EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce);
>
> long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
> unsigned long ioba)
> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> index ed16182..d6dad2c 100644
> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> @@ -1928,7 +1928,7 @@ hcall_real_table:
> .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table
> .long DOTSYM(kvmppc_h_protect) - hcall_real_table
> .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table
> - .long DOTSYM(kvmppc_h_put_tce) - hcall_real_table
> + .long DOTSYM(kvmppc_rm_h_put_tce) - hcall_real_table
> .long 0 /* 0x24 - H_SET_SPRG0 */
> .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table
> .long 0 /* 0x2c */
> @@ -2006,7 +2006,7 @@ hcall_real_table:
> .long 0 /* 0x12c */
> .long 0 /* 0x130 */
> .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
> - .long DOTSYM(kvmppc_h_stuff_tce) - hcall_real_table
> + .long DOTSYM(kvmppc_rm_h_stuff_tce) - hcall_real_table
> .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table
> .long 0 /* 0x140 */
> .long 0 /* 0x144 */
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20160308/559d523e/attachment.sig>
More information about the Linuxppc-dev
mailing list