Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp4197897ybg; Mon, 8 Jun 2020 01:23:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzyYszdOiHeUyXukF+1/xv3JOFPQlOuZATebqq8kcykswxrPnxVdpHDP+BlXwFQgyUYBTYw X-Received: by 2002:a17:906:c952:: with SMTP id fw18mr19358950ejb.505.1591604599092; Mon, 08 Jun 2020 01:23:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591604599; cv=none; d=google.com; s=arc-20160816; b=iwpZpJ+NNHoCzKTjbYKPqhNKY4ZJlpQH6wTIAXyOZrXZQzoK5873GyNcO29u6tpVT1 ywUK5SfC6pYF4RvDD6lHQY/rP/2eEMkSO1Euuww2gcfCjACpGYv6n9FqfcFYj1Y7Fz3B JD9nfbq6Cp6rcoWcREZwY4JOLoudd84w+BzNw+rACjpLpoMmxx/VT8C1HlOBAvGtnnl+ 4wyHheM8uHnsDmdhK3eOAWpGKiha4dbm47/49jakMpl7nfskG18eNlEKCaeCaEKpIeOy zqyyMyLF7UaAYMvAg80xYjngwxe1vmZioAFy5AvXx7MAIvJGmIyvFswd63j2NBiKoxAx 5/6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:dkim-signature; bh=PgnSUhvnGmVlTMkExDgba+ehKY/BZAg587suJPnB15E=; b=qSP5J1kqsekB1Jzi3m75wfhadX02yc7lbnYCYw1o6pLnxMwH7KthjCIh8bVnnE/Hi9 0HEXlzvunXB8MjRDh4Ha7wdDWRwPTGFtDzRaVM0z+7qn/BgljB4+yiW4I5+iq9yVMX4N zeG9dGmmew2Yz8SREpWVBX7rftvC3UqWOJ0sGwUAHn1jILqTWy2T911hRXQ6OiyC6n9/ GYaQ/Wxrcx1N7+42vdE6vxRdS0ynxUXyByWGzQiXHehV4wcC5mhIazj9yY+gsWEzxLSD ox8HOg8ShzaTe1GSPjRy2smKmr1OKA8AkkQwydDS/SwC6hNFl/+azCgP09lE2qEDm/RQ e4LA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=gEfDgzG2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n16si8527923eja.95.2020.06.08.01.22.56; Mon, 08 Jun 2020 01:23:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=gEfDgzG2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729090AbgFHIUw (ORCPT + 99 others); Mon, 8 Jun 2020 04:20:52 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:40210 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729060AbgFHIUv (ORCPT ); Mon, 8 Jun 2020 04:20:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1591604449; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=PgnSUhvnGmVlTMkExDgba+ehKY/BZAg587suJPnB15E=; b=gEfDgzG24JxLPS13ESMPnCEyt4DCqpQjFQOQyL1R9JAjxvmbcDfFXzzMwFsLVPflI+khmz qFbQgnmSR1ia9F6wZOHb1+jdMc2/kHDsHk87O+D7g/gWWywsVuveTERuB9XtCTlJ0EWq6a JqBA6YeFqoaNcYzk7NPqEwtWkbfgFK0= Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-101-ZZa4ILpHMkCRCni0ctJX_Q-1; Mon, 08 Jun 2020 04:20:47 -0400 X-MC-Unique: ZZa4ILpHMkCRCni0ctJX_Q-1 Received: by mail-ej1-f69.google.com with SMTP id hj12so5757862ejb.13 for ; Mon, 08 Jun 2020 01:20:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=PgnSUhvnGmVlTMkExDgba+ehKY/BZAg587suJPnB15E=; b=ZVpBvWZNQQtTV4h/ob8o9bMUxgkMJNIPKDZpKNDCiqPp0uHftU70GEJIQFDvFugY89 VosO/Wg/Au0qIRSmwQlxooDusWUhjcQL3X8fcaZnCiEBkQlADcWb8FGLQYKwhyQ5mCUw kED3eihFpVv1UxADNuMF9IACm8PUjmWIX8EVPBcDJouwH3s73NsXQhl1QW6ZhUr/XyDn dZYwmgf2Hc3ywAefL6zXy+JtA3N+C+x9ft1RXTr7j/1FXS7all0O3QBbU68BHldWdXTG dyTIBsQ89KzQ5PZ/+Ykg+3JUfih6DREHicSJrLr1aF6xhci9o8U6Pz8QR8fbydq19yA8 VcSQ== X-Gm-Message-State: AOAM530YM+2ipm4EewmyS/Guasn8r9XCdxygRdubQSRsH3lzvyvJvSLm sZNazhxBmiJV+OD5xFZ+Ard8McFhtcwBvfJxaomkwDjFcdwVEsqu/MEyqg9J/PGAGsAKTxcvABf vOY2T4Chs4kH76d8dtxXR8LVz X-Received: by 2002:aa7:cd4b:: with SMTP id v11mr21652714edw.356.1591604446386; Mon, 08 Jun 2020 01:20:46 -0700 (PDT) X-Received: by 2002:aa7:cd4b:: with SMTP id v11mr21652704edw.356.1591604446164; Mon, 08 Jun 2020 01:20:46 -0700 (PDT) Received: from vitty.brq.redhat.com (g-server-2.ign.cz. [91.219.240.2]) by smtp.gmail.com with ESMTPSA id d11sm7157315edy.79.2020.06.08.01.20.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Jun 2020 01:20:45 -0700 (PDT) From: Vitaly Kuznetsov To: Sean Christopherson Cc: kvm@vger.kernel.org, Paolo Bonzini , Wanpeng Li , Jim Mattson , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/2] KVM: nVMX: Properly handle kvm_read/write_guest_virt*() result In-Reply-To: <20200605200651.GC11449@linux.intel.com> References: <20200605115906.532682-1-vkuznets@redhat.com> <20200605200651.GC11449@linux.intel.com> Date: Mon, 08 Jun 2020 10:20:44 +0200 Message-ID: <878sgyc6jn.fsf@vitty.brq.redhat.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sean Christopherson writes: > On Fri, Jun 05, 2020 at 01:59:05PM +0200, Vitaly Kuznetsov wrote: >> Introduce vmx_handle_memory_failure() as an interim solution. > > Heh, "interim". I'll take the over on that :-D. > We just need a crazy but real use-case to start acting :-) >> Note, nested_vmx_get_vmptr() now has three possible outcomes: OK, PF, >> KVM_EXIT_INTERNAL_ERROR and callers need to know if userspace exit is >> needed (for KVM_EXIT_INTERNAL_ERROR) in case of failure. We don't seem >> to have a good enum describing this tristate, just add "int *ret" to >> nested_vmx_get_vmptr() interface to pass the information. On a loosely related note, while writing this patch I was struggling with our exit handlers calling convention (that the return value is '1' - return to the guest, '0' - return to userspace successfully, '< 0' - return to userspace with an error). This is intertwined with normal int/bool functions and make it hard to read. At the very minimum we can introduce an enum for 0/1 return values from exit handlers. Or, maybe, we can introduce KVM_REQ_USERSPACE_EXIT/KVM_REQ_INTERNAL_ERROR/.. and make all the exit handlers normal functions returning 0/error? >> >> Reported-by: syzbot+2a7156e11dc199bdbd8a@syzkaller.appspotmail.com >> Suggested-by: Sean Christopherson >> Signed-off-by: Vitaly Kuznetsov >> --- > > ... > >> +/* >> + * Handles kvm_read/write_guest_virt*() result and either injects #PF or returns >> + * KVM_EXIT_INTERNAL_ERROR for cases not currently handled by KVM. Return value >> + * indicates whether exit to userspace is needed. >> + */ >> +int vmx_handle_memory_failure(struct kvm_vcpu *vcpu, int r, >> + struct x86_exception *e) >> +{ >> + if (r == X86EMUL_PROPAGATE_FAULT) { >> + kvm_inject_emulated_page_fault(vcpu, e); >> + return 1; >> + } >> + >> + /* >> + * In case kvm_read/write_guest_virt*() failed with X86EMUL_IO_NEEDED >> + * while handling a VMX instruction KVM could've handled the request > > A nit similar to your observation on the shortlog, this isn't limited to VMX > instructions. > Yea, it all started with nested_vmx_get_vmptr() then Paolo discovered vmwrite/vmread/vmptrst/invept/invvpid and then I discovered invpcid but forgot to update the comment ... >> + * correctly by exiting to userspace and performing I/O but there >> + * doesn't seem to be a real use-case behind such requests, just return >> + * KVM_EXIT_INTERNAL_ERROR for now. >> + */ >> + vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR; >> + vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION; >> + vcpu->run->internal.ndata = 0; >> + >> + return 0; >> +} > -- Vitaly