From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, URIBL_SBL,URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D02DC43381 for ; Wed, 13 Mar 2019 08:12:40 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 23CD72177E for ; Wed, 13 Mar 2019 08:12:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 23CD72177E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kaod.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 44K4MT6vWpzDqHZ for ; Wed, 13 Mar 2019 19:12:37 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=kaod.org (client-ip=46.105.58.60; helo=3.mo68.mail-out.ovh.net; envelope-from=clg@kaod.org; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=kaod.org Received: from 3.mo68.mail-out.ovh.net (3.mo68.mail-out.ovh.net [46.105.58.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 44K4Km6cdvzDqGQ for ; Wed, 13 Mar 2019 19:11:07 +1100 (AEDT) Received: from player793.ha.ovh.net (unknown [10.109.143.232]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id 9003711D643 for ; Wed, 13 Mar 2019 09:02:25 +0100 (CET) Received: from kaod.org (lfbn-1-2226-17.w90-76.abo.wanadoo.fr [90.76.48.17]) (Authenticated sender: clg@kaod.org) by player793.ha.ovh.net (Postfix) with ESMTPSA id 03B693B2F201; Wed, 13 Mar 2019 08:02:11 +0000 (UTC) Subject: Re: [PATCH v2 15/16] KVM: introduce a KVM_DESTROY_DEVICE ioctl To: David Gibson References: <20190222112840.25000-1-clg@kaod.org> <20190222112840.25000-16-clg@kaod.org> <20190225041507.GS7668@umbus.fritz.box> From: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= Message-ID: Date: Wed, 13 Mar 2019 09:02:09 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <20190225041507.GS7668@umbus.fritz.box> Content-Type: text/plain; charset=windows-1252 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Ovh-Tracer-Id: 13335439974972296142 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedutddrgeelgdduudehucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddm X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kvm@vger.kernel.org, kvm-ppc@vger.kernel.org, Paul Mackerras , Paolo Bonzini , linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On 2/25/19 5:15 AM, David Gibson wrote: > On Fri, Feb 22, 2019 at 12:28:39PM +0100, Cédric Le Goater wrote: >> The 'destroy' method is currently used to destroy all devices when the >> VM is destroyed after the vCPUs have been freed. >> >> This new KVM ioctl exposes the same KVM device method. It acts as a >> software reset of the VM to 'destroy' selected devices when necessary >> and perform the required cleanups on the vCPUs. Called with the >> kvm->lock. >> >> The 'destroy' method could be improved by returning an error code. >> >> Signed-off-by: Cédric Le Goater > > Again, has this been discussed with Paolo and/or other KVM core > people? Not yet. Adding Paolo for feedback. >> --- >> include/uapi/linux/kvm.h | 7 ++++++ >> virt/kvm/kvm_main.c | 38 +++++++++++++++++++++++++++++++ >> Documentation/virtual/kvm/api.txt | 19 ++++++++++++++++ >> 3 files changed, 64 insertions(+) >> >> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h >> index 52bf74a1616e..d78fafa54274 100644 >> --- a/include/uapi/linux/kvm.h >> +++ b/include/uapi/linux/kvm.h >> @@ -1183,6 +1183,11 @@ struct kvm_create_device { >> __u32 flags; /* in: KVM_CREATE_DEVICE_xxx */ >> }; >> >> +struct kvm_destroy_device { >> + __u32 fd; /* in: device handle */ >> + __u32 flags; /* in: unused */ >> +}; >> + >> struct kvm_device_attr { >> __u32 flags; /* no flags currently defined */ >> __u32 group; /* device-defined */ >> @@ -1331,6 +1336,8 @@ struct kvm_s390_ucas_mapping { >> #define KVM_GET_DEVICE_ATTR _IOW(KVMIO, 0xe2, struct kvm_device_attr) >> #define KVM_HAS_DEVICE_ATTR _IOW(KVMIO, 0xe3, struct kvm_device_attr) >> >> +#define KVM_DESTROY_DEVICE _IOWR(KVMIO, 0xf0, struct kvm_destroy_device) >> + >> /* >> * ioctls for vcpu fds >> */ >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >> index 84717d8cb5e4..983d5c37f710 100644 >> --- a/virt/kvm/kvm_main.c >> +++ b/virt/kvm/kvm_main.c >> @@ -3026,6 +3026,30 @@ static int kvm_ioctl_create_device(struct kvm *kvm, >> return 0; >> } >> >> +static int kvm_ioctl_destroy_device(struct kvm *kvm, >> + struct kvm_destroy_device *dd) >> +{ >> + struct fd f; >> + struct kvm_device *dev; >> + >> + f = fdget(dd->fd); >> + if (!f.file) >> + return -EBADF; >> + >> + dev = kvm_device_from_filp(f.file); >> + fdput(f); >> + >> + if (!dev) >> + return -ENODEV; > > Don't you need to verify that the device belongs to this KVM instance? ah yes. I should at least check : dev->kvm == kvm >> + mutex_lock(&kvm->lock); >> + list_del(&dev->vm_node); >> + dev->ops->destroy(dev); >> + mutex_unlock(&kvm->lock); And there, I should problably drop a ref count on the VM. I am not sure of that. Thanks, C. >> + return 0; >> +} >> + >> static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) >> { >> switch (arg) { >> @@ -3270,6 +3294,20 @@ static long kvm_vm_ioctl(struct file *filp, >> r = 0; >> break; >> } >> + case KVM_DESTROY_DEVICE: { >> + struct kvm_destroy_device dd; >> + >> + r = -EFAULT; >> + if (copy_from_user(&dd, argp, sizeof(dd))) >> + goto out; >> + >> + r = kvm_ioctl_destroy_device(kvm, &dd); >> + if (r) >> + goto out; >> + >> + r = 0; >> + break; >> + } >> case KVM_CHECK_EXTENSION: >> r = kvm_vm_ioctl_check_extension_generic(kvm, arg); >> break; >> diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt >> index 1db1435769b4..c2ba18279298 100644 >> --- a/Documentation/virtual/kvm/api.txt >> +++ b/Documentation/virtual/kvm/api.txt >> @@ -3857,6 +3857,25 @@ number of valid entries in the 'entries' array, which is then filled. >> 'index' and 'flags' fields in 'struct kvm_cpuid_entry2' are currently reserved, >> userspace should not expect to get any particular value there. >> >> +4.119 KVM_DESTROY_DEVICE >> + >> +Capability: KVM_CAP_DEVICE_CTRL >> +Type: vm ioctl >> +Parameters: struct kvm_destroy_device (in) >> +Returns: 0 on success, -1 on error >> +Errors: >> + ENODEV: The device type is unknown or unsupported >> + >> + Other error conditions may be defined by individual device types or >> + have their standard meanings. >> + >> +Destroys an emulated device in the kernel. >> + >> +struct kvm_destroy_device { >> + __u32 fd; /* in: device handle */ >> + __u32 flags; /* unused */ >> +}; >> + >> 5. The kvm_run structure >> ------------------------ >> >