Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp896391imm; Fri, 29 Jun 2018 08:06:26 -0700 (PDT) X-Google-Smtp-Source: ADUXVKK7sENDyLCsS/fgzQmfPX8+5tTU5rlCrTm2Kikr2ihcz1z/znEj4eGCLrUcJHaMEGsoBlsW X-Received: by 2002:a17:902:7686:: with SMTP id m6-v6mr15472591pll.340.1530284786781; Fri, 29 Jun 2018 08:06:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530284786; cv=none; d=google.com; s=arc-20160816; b=uzchxngbn8xI54Gq4eRLMEEXnFOrK9TNUPpkKj47UVxVIFJchrx2bQGNHzucaPn2ff kYq2dtq+43JLguvFkHBSm1ex+dudOp1Fx7gCvl+JlSnRPE56UpQQCh63H9iFcoIx46dz 3MR4C29crYwmcD6WEh7CKeIAJ+kLcDm+9mgpfyIufO9/aRGU3W5zNgEgtOkMjcd2B2xr PbNMimd1G4PEWKpdEdla61t0UL8tThEZhobzfCUTwbT8Tmhng0eut+22wg2sKyb1oiUb GpPVMScgTNYZkaJ6XcHIomPWdisi1uHyLm5egARaXeyIWqYZMrJG7ezyB0qWG4IxxXsW MnNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=0XAjWWELLd8JacKnYjiQ4e5bXGBvUYMsbdukw9YRvTA=; b=rKecNb9VKxVhSc2Io22dtlj6FRmDrTUQBLMRJuWuH+X3OSXNhqf6bD1uhpmR4Ke36Z 3aT9eF5x7zOhox8EVEGEsUeiqBBaFQEQrFBQXRuK4Mlocdji5GM0fFVFnMhCpJQdT3aQ pQfib9dauljnxVS2n1+SZ7ltwS86+COAIxhwr0xmY3BYN8//5YQCTTKGyPGsXA+OEHTh wwzxgsF78iXr3w1u6LrBpNszZ1gWqKooyW3fNnV0Aw2FyAabm+EeNT3LvhknNSSvap3Y XVOfYzWkAz31y5r+SMGsFnjbVQKW4rDbSQy7LWpbRU312mG3wC25dlDePVC16Bp+FjHt U90w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f5-v6si10304734pln.414.2018.06.29.08.06.07; Fri, 29 Jun 2018 08:06:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935911AbeF2LQy (ORCPT + 99 others); Fri, 29 Jun 2018 07:16:54 -0400 Received: from foss.arm.com ([217.140.101.70]:60238 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965199AbeF2LQv (ORCPT ); Fri, 29 Jun 2018 07:16:51 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 097EB16A3; Fri, 29 Jun 2018 04:16:51 -0700 (PDT) Received: from en101.cambridge.arm.com (en101.cambridge.arm.com [10.1.206.73]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 835BB3F266; Fri, 29 Jun 2018 04:16:48 -0700 (PDT) From: Suzuki K Poulose To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, james.morse@arm.com, marc.zyngier@arm.com, cdall@kernel.org, eric.auger@redhat.com, julien.grall@arm.com, will.deacon@arm.com, catalin.marinas@arm.com, punit.agrawal@arm.com, qemu-devel@nongnu.org, Suzuki K Poulose , Peter Maydel Subject: [PATCH v3 14/20] kvm: arm/arm64: Expose supported physical address limit for VM Date: Fri, 29 Jun 2018 12:15:34 +0100 Message-Id: <1530270944-11351-15-git-send-email-suzuki.poulose@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530270944-11351-1-git-send-email-suzuki.poulose@arm.com> References: <1530270944-11351-1-git-send-email-suzuki.poulose@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Expose the maximum physical address size supported by the host for a VM. This could be later used by the userspace to choose the appropriate size for a given VM. The limit is determined as the minimum of actual CPU limit, the kernel limit (i.e, either 48 or 52) and the stage2 page table support limit (which is 40bits at the moment). For backward compatibility, we support a minimum of 40bits. The limit will be lifted as we add support for the stage2 to support the host kernel PA limit. This value may be different from what is exposed to the VM via CPU ID registers. The limit only applies to the stage2 page table. Cc: Christoffer Dall Cc: Marc Zyngier Cc: Peter Maydel Signed-off-by: Suzuki K Poulose --- Changes since V2: - Bump the ioctl number --- Documentation/virtual/kvm/api.txt | 15 +++++++++++++++ arch/arm/include/asm/kvm_mmu.h | 5 +++++ arch/arm64/include/asm/kvm_mmu.h | 5 +++++ include/uapi/linux/kvm.h | 6 ++++++ virt/kvm/arm/arm.c | 6 ++++++ 5 files changed, 37 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index d10944e..662374b 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3561,6 +3561,21 @@ Returns: 0 on success, -ENOENT on deassign if the conn_id isn't registered -EEXIST on assign if the conn_id is already registered +4.113 KVM_ARM_GET_MAX_VM_PHYS_SHIFT +Capability: basic +Architectures: arm, arm64 +Type: system ioctl +Parameters: none +Returns: log2(Maximum Guest physical address space size) supported by the +hypervisor. + +This ioctl can be used to identify the maximum guest physical address +space size supported by the hypervisor. The returned value indicates the +maximum size of the address that can be resolved by the stage2 +translation table on arm/arm64. On arm64, the value is decided based +on the host kernel configuration and the system wide safe value of +ID_AA64MMFR0_EL1:PARange. This may not match the value exposed to the +VM in CPU ID registers. 5. The kvm_run structure ------------------------ diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index b2da5a4..d86f8dd 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h @@ -380,6 +380,11 @@ static inline void *stage2_alloc_pgd(struct kvm *kvm) #define kvm_phys_to_vttbr(addr) (addr) +static inline u32 kvm_get_ipa_limit(void) +{ + return KVM_PHYS_SHIFT; +} + #endif /* !__ASSEMBLY__ */ #endif /* __ARM_KVM_MMU_H__ */ diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 813a72a..b4564d8 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -532,5 +532,10 @@ static inline void *stage2_alloc_pgd(struct kvm *kvm) GFP_KERNEL | __GFP_ZERO); } +static inline u32 kvm_get_ipa_limit(void) +{ + return KVM_PHYS_SHIFT; +} + #endif /* __ASSEMBLY__ */ #endif /* __ARM64_KVM_MMU_H__ */ diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index b6270a3..4df9bb6 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -775,6 +775,12 @@ struct kvm_ppc_resize_hpt { #define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list) /* + * Get the maximum physical address size supported by the host. + * Returns log2(Max-Physical-Address-Size) + */ +#define KVM_ARM_GET_MAX_VM_PHYS_SHIFT _IO(KVMIO, 0x0b) + +/* * Extension capability list. */ #define KVM_CAP_IRQCHIP 0 diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c index d2637bb..0d99e67 100644 --- a/virt/kvm/arm/arm.c +++ b/virt/kvm/arm/arm.c @@ -66,6 +66,7 @@ static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); static u32 kvm_next_vmid; static unsigned int kvm_vmid_bits __read_mostly; static DEFINE_RWLOCK(kvm_vmid_lock); +static u32 kvm_ipa_limit; static bool vgic_present; @@ -248,6 +249,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { + if (ioctl == KVM_ARM_GET_MAX_VM_PHYS_SHIFT) + return kvm_ipa_limit; + return -EINVAL; } @@ -1361,6 +1365,8 @@ static int init_common_resources(void) kvm_vmid_bits = kvm_get_vmid_bits(); kvm_info("%d-bit VMID\n", kvm_vmid_bits); + kvm_ipa_limit = kvm_get_ipa_limit(); + return 0; } -- 2.7.4