Received: by 10.223.176.5 with SMTP id f5csp2195648wra; Thu, 8 Feb 2018 09:56:03 -0800 (PST) X-Google-Smtp-Source: AH8x227Dq733SnU3Mas36GZhhbUc5FzFnoxqo4pER5fuTpZtkEJ2gto5Hlc7yl+uRHhfqZgB2kVN X-Received: by 10.98.206.65 with SMTP id y62mr1302pfg.79.1518112563596; Thu, 08 Feb 2018 09:56:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518112563; cv=none; d=google.com; s=arc-20160816; b=H5H/2Ahw9rvC8UnGxCwKVMOMFt2FImaS5hKXoJqYz60Ua/ZY9h6TcfUu/B9qx03qCH j+XS5k+V1XeYbfwK132xJkyfb7UjLVtlyK/RdtDG7lNFZ+flvLahx/k5kjVjwdxBZZfv 8vEfzGohQMlqizSUBnD9Asc1FEsvCWQdRPnaa4Jhp6F0wHUqjAh0e5nwesS67UzDmSRx 7PWz6EF6WLk71DHdERUNsXSM0QspJyJegaFOVHx3rwg6F5KYJf2MNYkcXak7YGW7qik2 UAiUIJYCJu37xUuBgrhGCu1RWShqUB9ZJoKjiFqWT59ohDD9euwqVGqJBo7ysyOrb9hb wJsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=q3nMq3o2pfbHjJCC0Vg5/2BahxRmpj/5lfDBEZRYlpw=; b=XzCimyQTPvZt/KO9rMnydoqqKkMkVqNPlcD63hLsbbVLGEVCsxdyl2o81pLAilO6Cg 4n/s25vRwDUCv8cdFIni4zgghb1mN+7AhLkFTWuC6SJl55a8y+acyQZ4KLZtM/DnQNAY N/nOzB89FeWUwQeFjQFEj/cutqZ9L5qJbf9gKu8U4HcGw7TgSF8tE2l5Ue5CJBbgYdpY 74ZXiMmsAOtX+DsFhhHA/7c4QXx9xkKKkuUdqRlGu1lLdsPZWDeeCd4ln/or8YvIkzK7 zEwU4X5E6+7Z1xSm3KKE6ID/aD0FMi1Ddg+cqhC46DMQC1SiD5mUF8vey3wQCjQbhTXL yb3w== 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 o20si88858pgc.55.2018.02.08.09.55.48; Thu, 08 Feb 2018 09:56:03 -0800 (PST) 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 S1752483AbeBHRxY (ORCPT + 99 others); Thu, 8 Feb 2018 12:53:24 -0500 Received: from foss.arm.com ([217.140.101.70]:38216 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752411AbeBHRxV (ORCPT ); Thu, 8 Feb 2018 12:53:21 -0500 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 4B1BA80D; Thu, 8 Feb 2018 09:53:21 -0800 (PST) Received: from [10.1.206.28] (e107814-lin.cambridge.arm.com [10.1.206.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DBBF23F24D; Thu, 8 Feb 2018 09:53:18 -0800 (PST) Subject: Re: [PATCH v1 15/16] kvm: arm64: Allow configuring physical address space size To: Christoffer Dall Cc: linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, marc.zyngier@arm.com, linux-kernel@vger.kernel.org, kristina.martsenko@arm.com, peter.maydell@linaro.org, pbonzini@redhat.com, rkrcmar@redhat.com, will.deacon@arm.com, ard.biesheuvel@linaro.org, mark.rutland@arm.com, catalin.marinas@arm.com, Christoffer Dall References: <20180109190414.4017-1-suzuki.poulose@arm.com> <20180109190414.4017-16-suzuki.poulose@arm.com> <20180208111414.GM29286@cbox> From: Suzuki K Poulose Message-ID: <31e5bf40-4fcb-934e-6036-ff2670f793df@arm.com> Date: Thu, 8 Feb 2018 17:53:17 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <20180208111414.GM29286@cbox> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 08/02/18 11:14, Christoffer Dall wrote: > On Tue, Jan 09, 2018 at 07:04:10PM +0000, Suzuki K Poulose wrote: >> Allow the guests to choose a larger physical address space size. >> The default and minimum size is 40bits. A guest can change this >> right after the VM creation, but before the stage2 entry page >> tables are allocated (i.e, before it registers a memory range >> or maps a device address). The size is restricted to the maximum >> supported by the host. Also, the guest can only increase the PA size, >> from the existing value, as reducing it could break the devices which >> may have verified their physical address for validity and may do a >> lazy mapping(e.g, VGIC). >> >> Cc: Marc Zyngier >> Cc: Christoffer Dall >> Cc: Peter Maydell >> Signed-off-by: Suzuki K Poulose >> --- >> Documentation/virtual/kvm/api.txt | 27 ++++++++++++++++++++++++++ >> arch/arm/include/asm/kvm_host.h | 7 +++++++ >> arch/arm64/include/asm/kvm_host.h | 1 + >> arch/arm64/include/asm/kvm_mmu.h | 41 ++++++++++++++++++++++++++++++--------- >> arch/arm64/kvm/reset.c | 28 ++++++++++++++++++++++++++ >> include/uapi/linux/kvm.h | 4 ++++ >> virt/kvm/arm/arm.c | 2 +- >> 7 files changed, 100 insertions(+), 10 deletions(-) >> >> diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt >> index 57d3ee9e4bde..a203faf768c4 100644 >> --- a/Documentation/virtual/kvm/api.txt >> +++ b/Documentation/virtual/kvm/api.txt >> @@ -3403,6 +3403,33 @@ invalid, if invalid pages are written to (e.g. after the end of memory) >> or if no page table is present for the addresses (e.g. when using >> hugepages). >> >> +4.109 KVM_ARM_GET_PHYS_SHIFT >> + >> +Capability: KVM_CAP_ARM_CONFIG_PHYS_SHIFT >> +Architectures: arm64 >> +Type: vm ioctl >> +Parameters: __u32 (out) >> +Returns: 0 on success, a negative value on error >> + >> +This ioctl is used to get the current maximum physical address size for >> +the VM. The value is Log2(Maximum_Physical_Address). This is neither the >> + amount of physical memory assigned to the VM nor the maximum physical address >> +that a real CPU on the host can handle. Rather, this is the upper limit of the >> +guest physical address that can be used by the VM. > > What is the point of this? Presumably if userspace has set the size, it > already knows the size? This can help the userspace know, what the "default" limit is. As such I am not particular about keeping this around. > >> + >> +4.109 KVM_ARM_SET_PHYS_SHIFT >> + >> +Capability: KVM_CAP_ARM_CONFIG_PHYS_SHIFT >> +Architectures: arm64 >> +Type: vm ioctl >> +Parameters: __u32 (in) >> +Returns: 0 on success, a negative value on error >> + >> +This ioctl is used to set the maximum physical address size for >> +the VM. The value is Log2(Maximum_Physical_Address). The value can only >> +be increased from the existing setting. The value cannot be changed >> +after the stage-2 page tables are allocated and will return an error. >> + > > Is there a way for userspace to discover what the underlying hardware > can actually support, beyond trial-and-error on this ioctl? Unfortunately, there is none. We don't expose ID_AA64MMFR0 via mrs emulation. >> +static inline int kvm_reconfig_stage2(struct kvm *kvm, u32 phys_shift) >> +{ >> + int rc = 0; >> + unsigned int pa_max, parange; >> + >> + parange = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1) & 7; >> + pa_max = id_aa64mmfr0_parange_to_phys_shift(parange); >> + /* Raise it to 40bits for backward compatibility */ >> + pa_max = (pa_max < 40) ? 40 : pa_max; >> + /* Make sure the size is supported/available */ >> + if (phys_shift > PHYS_MASK_SHIFT || phys_shift > pa_max) >> + return -EINVAL; >> + /* >> + * The stage2 PGD is dependent on the settings we initialise here >> + * and should be allocated only after this step. We cannot allow >> + * down sizing the IPA size as there could be devices or memory >> + * regions, that depend on the previous size. >> + */ >> + mutex_lock(&kvm->slots_lock); >> + if (kvm->arch.pgd || phys_shift < kvm->arch.phys_shift) { >> + rc = -EPERM; >> + } else if (phys_shift > kvm->arch.phys_shift) { >> + kvm->arch.phys_shift = phys_shift; >> + kvm->arch.s2_levels = stage2_pt_levels(kvm->arch.phys_shift); >> + kvm->arch.vtcr_private = VTCR_EL2_SL0(kvm->arch.s2_levels) | >> + TCR_T0SZ(kvm->arch.phys_shift); >> + } > > I think you can rework the above to make it more obvious what's going on > in this way: > > rc = -EPERM; > if (kvm->arch.pgd || phys_shift < kvm->arch.phys_shift) > goto out_unlock; > > rc = 0; > if (phys_shift == kvm->arch.phys_shift) > goto out_unlock; > > kvm->arch.phys_shift = phys_shift; > kvm->arch.s2_levels = stage2_pt_levels(kvm->arch.phys_shift); > kvm->arch.vtcr_private = VTCR_EL2_SL0(kvm->arch.s2_levels) | > TCR_T0SZ(kvm->arch.phys_shift); > > out_unlock: > Sure. >> --- a/virt/kvm/arm/arm.c >> +++ b/virt/kvm/arm/arm.c >> @@ -1136,7 +1136,7 @@ long kvm_arch_vm_ioctl(struct file *filp, >> return 0; >> } >> default: >> - return -EINVAL; >> + return kvm_arch_dev_vm_ioctl(kvm, ioctl, arg); >> } >> } >> >> -- >> 2.13.6 >> > > Have you considered making this capability a generic capability and > encoding this in the 'type' argument to KVM_CREATE_VM? This would > significantly simplify all the above and would allow you to drop patch 8 > and 9 I think. No. I will take a look. Btw, there were patches flying around to support "userspace" requesting specific values for ID feature registers. But even that doesn't help with the detection part. May be that is another way to configure the size, but not sure about the current status of that work. Cheers Suzuki