[PATCH kernel 4/4] KVM: PPC: Add support for 64bit TCE windows
David Gibson
david at gibson.dropbear.id.au
Thu Jan 28 10:53:29 AEDT 2016
On Wed, Jan 27, 2016 at 02:29:25PM +1100, Alexey Kardashevskiy wrote:
> On 01/25/2016 04:37 PM, David Gibson wrote:
> >On Thu, Jan 21, 2016 at 07:15:26PM +1100, Alexey Kardashevskiy wrote:
> >>The existing KVM_CREATE_SPAPR_TCE only supports 32bit windows which is not
> >>enough for directly mapped windows as the guest can get more than 4GB.
> >>
> >>This adds KVM_CREATE_SPAPR_TCE_64 ioctl and advertises it
> >>via KVM_CAP_SPAPR_TCE_64 capability.
> >>
> >>Since 64bit windows are to support Dynamic DMA windows (DDW), let's add
> >>@bus_offset and @page_shift which are also required by DDW.
> >>
> >>Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
> >>---
> >> Documentation/virtual/kvm/api.txt | 32 ++++++++++++++++++++++++++++++++
> >> arch/powerpc/include/asm/kvm_ppc.h | 2 +-
> >> arch/powerpc/include/uapi/asm/kvm.h | 9 +++++++++
> >> arch/powerpc/kvm/book3s_64_vio.c | 10 +++++++---
> >> arch/powerpc/kvm/powerpc.c | 25 ++++++++++++++++++++++++-
> >> include/uapi/linux/kvm.h | 2 ++
> >> 6 files changed, 75 insertions(+), 5 deletions(-)
> >>
> >>diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
> >>index da39435..d1c5655 100644
> >>--- a/Documentation/virtual/kvm/api.txt
> >>+++ b/Documentation/virtual/kvm/api.txt
> >>@@ -3060,6 +3060,38 @@ an implementation for these despite the in kernel acceleration.
> >>
> >> This capability is always enabled.
> >>
> >>+4.96 KVM_CREATE_SPAPR_TCE_64
> >>+
> >>+Capability: KVM_CAP_SPAPR_TCE_64
> >>+Architectures: powerpc
> >>+Type: vm ioctl
> >>+Parameters: struct kvm_create_spapr_tce_64 (in)
> >>+Returns: file descriptor for manipulating the created TCE table
> >>+
> >>+This is an extension for KVM_CAP_SPAPR_TCE which only supports 32bit
> >>+windows, described in 4.62 KVM_CREATE_SPAPR_TCE
> >>+
> >>+This capability uses extended struct in ioctl interface:
> >>+
> >>+/* for KVM_CAP_SPAPR_TCE_64 */
> >>+struct kvm_create_spapr_tce_64 {
> >>+ __u64 liobn;
> >>+ __u32 page_shift;
> >>+ __u64 offset; /* in pages */
> >>+ __u64 size; /* in pages */
> >>+ __u32 flags;
> >
> >Best to move page_shift after offset and size, so the structure
> >doesn't get an alignment gap.
>
> Agrh. I did this again :-/
>
>
> >>+};
> >>+
> >>+The aim of extension is to support an additional bigger DMA window with
> >>+a variable page size.
> >>+KVM_CREATE_SPAPR_TCE_64 receives a 64bit window size, an IOMMU page shift and
> >>+a bus offset of the corresponding DMA window, @size and @offset are numbers
> >>+of IOMMU pages.
> >>+
> >>+ at flags are not used at the moment.
> >>+
> >>+The rest of functionality is identical to KVM_CREATE_SPAPR_TCE.
> >>+
> >> 5. The kvm_run structure
> >> ------------------------
> >>
> >>diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
> >>index 4cadee5..6e4d1dc 100644
> >>--- a/arch/powerpc/include/asm/kvm_ppc.h
> >>+++ b/arch/powerpc/include/asm/kvm_ppc.h
> >>@@ -165,7 +165,7 @@ extern void kvmppc_map_vrma(struct kvm_vcpu *vcpu,
> >> extern int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu);
> >>
> >> extern long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
> >>- struct kvm_create_spapr_tce *args);
> >>+ struct kvm_create_spapr_tce_64 *args);
> >> extern struct kvmppc_spapr_tce_table *kvmppc_find_table(
> >> struct kvm_vcpu *vcpu, unsigned long liobn);
> >> extern long kvmppc_ioba_validate(struct kvmppc_spapr_tce_table *stt,
> >>diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
> >>index ab4d473..9c8b4cbc 100644
> >>--- a/arch/powerpc/include/uapi/asm/kvm.h
> >>+++ b/arch/powerpc/include/uapi/asm/kvm.h
> >>@@ -333,6 +333,15 @@ struct kvm_create_spapr_tce {
> >> __u32 window_size;
> >> };
> >>
> >>+/* for KVM_CAP_SPAPR_TCE_64 */
> >>+struct kvm_create_spapr_tce_64 {
> >>+ __u64 liobn;
> >>+ __u32 page_shift;
> >>+ __u64 offset; /* in pages */
> >>+ __u64 size; /* in pages */
> >>+ __u32 flags;
> >>+};
> >>+
> >> /* for KVM_ALLOCATE_RMA */
> >> struct kvm_allocate_rma {
> >> __u64 rma_size;
> >>diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
> >>index 85ee572..5479446 100644
> >>--- a/arch/powerpc/kvm/book3s_64_vio.c
> >>+++ b/arch/powerpc/kvm/book3s_64_vio.c
> >>@@ -144,20 +144,23 @@ static const struct file_operations kvm_spapr_tce_fops = {
> >> };
> >>
> >> long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
> >>- struct kvm_create_spapr_tce *args)
> >>+ struct kvm_create_spapr_tce_64 *args)
> >> {
> >> struct kvmppc_spapr_tce_table *stt = NULL;
> >> unsigned long npages, size;
> >> int ret = -ENOMEM;
> >> int i;
> >>
> >>+ if (!args->size)
> >>+ return -EINVAL;
> >>+
> >> /* Check this LIOBN hasn't been previously allocated */
> >> list_for_each_entry(stt, &kvm->arch.spapr_tce_tables, list) {
> >> if (stt->liobn == args->liobn)
> >> return -EBUSY;
> >> }
> >>
> >>- size = args->window_size >> IOMMU_PAGE_SHIFT_4K;
> >>+ size = args->size;
> >
> >Doesn't this need some kind of bounds on the allowed size?
>
>
> kvmppc_account_memlimit() below is some kind of bound, not enough?
Ah, yes, that should be enough.
Sorry, missed that.
--
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/20160128/5df35e0d/attachment.sig>
More information about the Linuxppc-dev
mailing list