From patchwork Fri Apr 6 15:01:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Martin X-Patchwork-Id: 10326999 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5AE5460545 for ; Fri, 6 Apr 2018 15:02:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4937C29426 for ; Fri, 6 Apr 2018 15:02:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D44929447; Fri, 6 Apr 2018 15:02:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 92B2129438 for ; Fri, 6 Apr 2018 15:02:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=l/0AHrX5sJsftm3oga7mkwy1esfPesj8lRSEeFFUD2w=; b=grZJXnOacVnoqNDyv49wodREUk NN6eId74POZBwXHEl8EnihhQnVkM+vHUJInS2Bu2IQgiojanZOK+NIrvW8InuimKe10fe+SLyfA6c 7dDN0AAFKaaF7z3rtzX88F2k+NtUnonrcWYLcQIKsRUS+xqMiyLbh0Nfch28WIktHoGbN7uH1+zUH Kq/TythzGLoi/2Lqyy1Q1Ti1FmlKaYH0u7FPRdKziyOzwmR5YaWyfbAv+TGTD7KzUfIKSyQKcTpRo cLDdm2fCl3fA9UA6/QnlwB8D2GxIGzcV+sfqFWyx6ctODt98MySupH995PiReIHWAOvbjDzQQ9apT OsSeThdQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1f4St2-00071y-5B; Fri, 06 Apr 2018 15:02:44 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1f4Srp-0006Ub-CT for linux-arm-kernel@bombadil.infradead.org; Fri, 06 Apr 2018 15:01:29 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=QU6SR+nQJ874wtMeCvhQK7Dm7QG5s/bhC6qzn5Qy/Fg=; b=yqRe6CgGo+w51vs/qMM0q9tcL 4ptkisVQjROHIcmF0iBa35iTypfqqwd9fySkIyRk6sJbkC6jdzbXGvTi60bedfy4rufG7ytSgo0wW 5G9TafKUNRVP804cm0dLVQWhKUZBAMbt/U++c8ZXQZnAlrcJ9KMM5NQ/ldoCcfZkGeOrChM3ftUXu lx/IZleAnKh0XGq4YEyTPx6HsbZ1jAIZj/6X/ae2YL60N05faUcSsXnPGod7KUH1f5VOw8a76X5XW pZ965An+DP7CqPGG7Ml4+aV4m9AGX/R60Pbpt6q25ch7NZps0aV8D52T4A1Bwz1QJYJcpHenfF+QB AU+ptSBhw==; Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70] helo=foss.arm.com) by merlin.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1f4Srl-0000Su-Aj for linux-arm-kernel@lists.infradead.org; Fri, 06 Apr 2018 15:01:27 +0000 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 37CBE15AD; Fri, 6 Apr 2018 08:01:12 -0700 (PDT) Received: from e103592.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 29FB23F6CA; Fri, 6 Apr 2018 08:01:11 -0700 (PDT) From: Dave Martin To: kvmarm@lists.cs.columbia.edu Subject: [RFC PATCH v2 1/3] KVM: arm/arm64: Introduce kvm_arch_vcpu_run_pid_change Date: Fri, 6 Apr 2018 16:01:02 +0100 Message-Id: <1523026864-15413-2-git-send-email-Dave.Martin@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1523026864-15413-1-git-send-email-Dave.Martin@arm.com> References: <1523026864-15413-1-git-send-email-Dave.Martin@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180406_110125_513275_5D99C899 X-CRM114-Status: GOOD ( 21.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marc Zyngier , Christoffer Dall , Christoffer Dall , linux-arm-kernel@lists.infradead.org, Ard Biesheuvel MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Christoffer Dall KVM/ARM differs from other architectures in having to maintain an additional virtual address space from that of the host and the guest, because we split the execution of KVM across both EL1 and EL2. This results in a need to explicitly map data structures into EL2 (hyp) which are accessed from the hyp code. As we are about to be more clever with our FPSIMD handling, which stores data on the task struct and uses thread_info flags, we have to map the currently executing task struct into the EL2 virtual address space. However, we don't want to do this on every KVM_RUN, because it is a fairly expensive operation to walk the page tables, and the common execution mode is to map a single thread to a VCPU. By introducing a hook that architectures can select with HAVE_KVM_VCPU_RUN_PID_CHANGE, we do not introduce overhead for other architectures, but have a simple way to only map the data we need when required for arm64. Signed-off-by: Christoffer Dall Signed-off-by: Dave Martin --- Since RFCv1: Back out setting of hyp_current, which isn't introduced to struct vcpu_arch by this patch. This series takes the approach of only mapping current->thread_info instead in a later patch, which is sufficient. --- arch/arm64/kvm/Kconfig | 1 + include/linux/kvm_host.h | 9 +++++++++ virt/kvm/Kconfig | 3 +++ virt/kvm/arm/arm.c | 10 ++++++++++ virt/kvm/kvm_main.c | 7 ++++++- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 2257dfc..5b2c8d8 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -39,6 +39,7 @@ config KVM select HAVE_KVM_IRQ_ROUTING select IRQ_BYPASS_MANAGER select HAVE_KVM_IRQ_BYPASS + select HAVE_KVM_VCPU_RUN_PID_CHANGE ---help--- Support hosting virtualized guest machines. We don't support KVM with 16K page tables yet, due to the multiple diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 6930c63..4268ace 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1276,4 +1276,13 @@ static inline long kvm_arch_vcpu_async_ioctl(struct file *filp, void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, unsigned long start, unsigned long end); +#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE +int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu); +#else +static inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) +{ + return 0; +} +#endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */ + #endif diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index cca7e06..72143cf 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -54,3 +54,6 @@ config HAVE_KVM_IRQ_BYPASS config HAVE_KVM_VCPU_ASYNC_IOCTL bool + +config HAVE_KVM_VCPU_RUN_PID_CHANGE + bool diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c index 5357230..d3af3f4 100644 --- a/virt/kvm/arm/arm.c +++ b/virt/kvm/arm/arm.c @@ -816,6 +816,16 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) return ret; } +#ifdef CONFIG_ARM64 +int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) +{ + struct task_struct *tsk = current; + + /* Make sure the host task fpsimd state is visible to hyp: */ + return create_hyp_mappings(tsk, tsk + 1, PAGE_HYP); +} +#endif + static int vcpu_interrupt_line(struct kvm_vcpu *vcpu, int number, bool level) { int bit_index; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 65dea3f..de33a32 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2550,8 +2550,13 @@ static long kvm_vcpu_ioctl(struct file *filp, oldpid = rcu_access_pointer(vcpu->pid); if (unlikely(oldpid != current->pids[PIDTYPE_PID].pid)) { /* The thread running this VCPU changed. */ - struct pid *newpid = get_task_pid(current, PIDTYPE_PID); + struct pid *newpid; + r = kvm_arch_vcpu_run_pid_change(vcpu); + if (r) + break; + + newpid = get_task_pid(current, PIDTYPE_PID); rcu_assign_pointer(vcpu->pid, newpid); if (oldpid) synchronize_rcu();