From patchwork Tue Dec 12 17:31:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 10107927 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 EAEDA602B3 for ; Tue, 12 Dec 2017 17:32:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D43702985D for ; Tue, 12 Dec 2017 17:32:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C8CF5298C1; Tue, 12 Dec 2017 17:32:46 +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=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A0A62985D for ; Tue, 12 Dec 2017 17:32:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752291AbdLLRcd (ORCPT ); Tue, 12 Dec 2017 12:32:33 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:45898 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751688AbdLLRcb (ORCPT ); Tue, 12 Dec 2017 12:32:31 -0500 Received: by mail-wr0-f195.google.com with SMTP id h1so21922647wre.12; Tue, 12 Dec 2017 09:32:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=c2ZWD9Bm9b0X31qvOLpKkMhcCWAVVqwP79rvSlYjU2U=; b=WMJ6CJjaPyOaAMUIEqxfWluZCvF4e7Pyw/zzUeLbHgkTQF6xBLgLLvC2yMxwMo7chJ mW8YJh9J52p85cMRVyStFQQWem2ybeE0qS0x1YM0GQbwmjUa1foeRFsUkeyByv5nkOq1 C9qh+hzmSi3bRPXqGFF7o+vUa4Dst4MHTonQF/rgNOhjMBrG43lkTQS12KiJEIwSVw89 rVzjf08ub+hRyYYUhBdHWCqv3zE4QjSlgQC3UXbjxHUbyLu/Pz9GaZ9xIcNVynM4fpOw I1oHl5lb6nfp1Vhz2rlsJIJe2B3J5a4XUFt+KK8Gz/2GlksGuq6eb6vnpXG6FnwnhLBl 65Og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=c2ZWD9Bm9b0X31qvOLpKkMhcCWAVVqwP79rvSlYjU2U=; b=f4tW1cHF2VdiRa+NwdIR9cqaOoJGMl5ohP5i4ZYXdtNrUFs6P4iWblPkK2P7aQYmoB KOONQN4n9T4ScLzmiaWCTDsOU2YpTp29FztVf6Egc4Mc/hj0/Y2wY1nN/RDeDvS6nQbz urkm2Mj+Jik9wVeT65DvCOp7ku0YrGmpHGcvOZGHh7Iqx0oVFWKGnroFyzy4xbNx5uny FejbxkPoiNNCALanJeqS+jC6L7wueb8pTdTOYtId+/TY1FLzaamZXP1MOxSDFTtWaYvP X2dRwNphCXHrntw/8wWZ5x3VqFZofQVRO/LLC7azai+aUoifX/XSIMtR0t0QESBLNZ+5 WIdQ== X-Gm-Message-State: AKGB3mKO1prKSm3gW3m22Lyh+o1uhdJtMMZqAHr+HhMOf8wrJzOrpMd/ NZze5qu1tuCXRgSGhI/zHk0cy53A X-Google-Smtp-Source: ACJfBotF+ub6+d1kTcsBcLMKjiWEPoNtgAfD7IEUvVJw0xUI2ppAa20eIFyS/OWFeImerv9+7+CNPg== X-Received: by 10.223.186.197 with SMTP id w5mr4248153wrg.201.1513099949612; Tue, 12 Dec 2017 09:32:29 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-251-125.clienti.tiscali.it. [78.12.251.125]) by smtp.gmail.com with ESMTPSA id w76sm23463832wrc.79.2017.12.12.09.32.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Dec 2017 09:32:28 -0800 (PST) From: Paolo Bonzini To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: kvm-ppc@vger.kernel.org, cohuck@redhat.com, christoffer.dall@linaro.org, James Hogan , Paul Mackerras , Christian Borntraeger Subject: [PATCH] KVM: introduce kvm_arch_vcpu_async_ioctl Date: Tue, 12 Dec 2017 18:31:55 +0100 Message-Id: <1513099915-107126-1-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP After the vcpu_load/vcpu_put pushdown, the handling of asynchronous VCPU ioctl is already much clearer in that it is obvious that they bypass vcpu_load and vcpu_put. However, it is still not perfect in that the different state of the VCPU mutex is still hidden in the caller. Separate those ioctls into a new function kvm_arch_vcpu_async_ioctl that returns -ENOIOCTLCMD for more "traditional" synchronous ioctls. Cc: James Hogan Cc: Paul Mackerras Cc: Christian Borntraeger Suggested-by: Cornelia Huck Signed-off-by: Paolo Bonzini Reviewed-by: Christoffer Dall Reviewed-by: Cornelia Huck --- arch/mips/kvm/mips.c | 15 ++++++++++++--- arch/powerpc/kvm/powerpc.c | 14 +++++++++++--- arch/s390/kvm/kvm-s390.c | 16 ++++++++++++---- include/linux/kvm_host.h | 2 ++ virt/kvm/kvm_main.c | 8 ++++---- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c index 9200b3def440..2549fdd27ee1 100644 --- a/arch/mips/kvm/mips.c +++ b/arch/mips/kvm/mips.c @@ -903,12 +903,11 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, return r; } -long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, - unsigned long arg) +long kvm_arch_vcpu_async_ioctl(struct file *filp, unsigned int ioctl, + unsigned long arg) { struct kvm_vcpu *vcpu = filp->private_data; void __user *argp = (void __user *)arg; - long r; if (ioctl == KVM_INTERRUPT) { struct kvm_mips_interrupt irq; @@ -921,6 +920,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, return kvm_vcpu_ioctl_interrupt(vcpu, &irq); } + return -ENOIOCTLCMD; +} + +long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, + unsigned long arg) +{ + struct kvm_vcpu *vcpu = filp->private_data; + void __user *argp = (void __user *)arg; + long r; + vcpu_load(vcpu); switch (ioctl) { diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index ba8134a989c1..2e700753e35c 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -1607,12 +1607,11 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, return -EINVAL; } -long kvm_arch_vcpu_ioctl(struct file *filp, - unsigned int ioctl, unsigned long arg) +long kvm_arch_vcpu_async_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg) { struct kvm_vcpu *vcpu = filp->private_data; void __user *argp = (void __user *)arg; - long r; if (ioctl == KVM_INTERRUPT) { struct kvm_interrupt irq; @@ -1620,6 +1619,15 @@ long kvm_arch_vcpu_ioctl(struct file *filp, return -EFAULT; return kvm_vcpu_ioctl_interrupt(vcpu, &irq); } + return -ENOIOCTLCMD; +} + +long kvm_arch_vcpu_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg) +{ + struct kvm_vcpu *vcpu = filp->private_data; + void __user *argp = (void __user *)arg; + long r; vcpu_load(vcpu); diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 9700d71cb691..40f0ae5a883f 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3725,13 +3725,11 @@ static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu, return r; } -long kvm_arch_vcpu_ioctl(struct file *filp, - unsigned int ioctl, unsigned long arg) +long kvm_arch_vcpu_async_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg) { struct kvm_vcpu *vcpu = filp->private_data; void __user *argp = (void __user *)arg; - int idx; - long r; switch (ioctl) { case KVM_S390_IRQ: { @@ -3752,6 +3750,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp, return kvm_s390_inject_vcpu(vcpu, &s390irq); } } + return -ENOIOCTLCMD; +} + +long kvm_arch_vcpu_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg) +{ + struct kvm_vcpu *vcpu = filp->private_data; + void __user *argp = (void __user *)arg; + int idx; + long r; vcpu_load(vcpu); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 09de0ff3d677..a900d20a5320 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -736,6 +736,8 @@ long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); +long kvm_arch_vcpu_async_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg); int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf); int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 19c184fa1839..262d6c910fe7 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2547,13 +2547,13 @@ static long kvm_vcpu_ioctl(struct file *filp, #if defined(CONFIG_S390) || defined(CONFIG_PPC) || defined(CONFIG_MIPS) /* * Special cases: vcpu ioctls that are asynchronous to vcpu execution, - * so vcpu_load() would break it. + * so mutex_lock() would break it. */ - if (ioctl == KVM_S390_INTERRUPT || ioctl == KVM_S390_IRQ || ioctl == KVM_INTERRUPT) - return kvm_arch_vcpu_ioctl(filp, ioctl, arg); + r = kvm_arch_vcpu_async_ioctl(filp, ioctl, arg); + if (r != -ENOIOCTLCMD) + return r; #endif - if (mutex_lock_killable(&vcpu->mutex)) return -EINTR; switch (ioctl) {