Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp707861pxb; Thu, 25 Feb 2021 13:01:14 -0800 (PST) X-Google-Smtp-Source: ABdhPJwjtViI+9dX7wYNuBp0AiemeF6PflM1A0yfi9/0/C41zklc0VYvP5XwHb73n0hk9siEywhc X-Received: by 2002:a17:906:b249:: with SMTP id ce9mr4565311ejb.294.1614286874771; Thu, 25 Feb 2021 13:01:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614286874; cv=none; d=google.com; s=arc-20160816; b=BgnpzLKqoxuKeY44OSnYDnmkMMYdlbmKSkQFJ5LsUf5fPVrogBQ5uAY1lGz2ezdoZN rkhvldyotSg3NbM0g8kDsvZnqqudCW26fei17K6zo5VBAmgTZEKuxVNY/5F6iIhmWMbh lg5ZYP3kL3iys0oQpjzRQU/TTK5UWNDfDgNfUdA9VkwpNaGbVTBymn8PRkzAw5aHnFiD UvQnOdNrm9EROh4FgGpXbldNDL1R3z4aH2vo3gyaa/DY1sjvnv6ylMNcza1L2MfHu+ze rknXpIQe5V/5rPTiWzO/ALwj/wyX0SUWZ+8Nwz5NQBfqQTpqPP/yUWsN7a/B4go/rfO2 /uRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:reply-to:sender:dkim-signature; bh=DM1qAEmP5vcSYf3rgtbYxteKXUrb+lcNyYCUDv3yLOQ=; b=aiXtUQmj2qISB3s15x4hbi6LPi/fUl29vM3OKcGe5SYvolMyFHyLVqWatXG8FoxmqV QxgVPQ7lakVeyYPCtS6ChFkcF6VMxHpGh5A0MvQu2DGIhzXUOB3c+iANj0XqM3rkjTRK dX0P0hhblIsTbd9+C52XvChneXX+dJB06zP8VHNv7jHWEaNy/mc0+1gB9JnDlHcljzT0 d5LApIqEEbRZKMJpjCqMg5F3baQa1YSvpQOvzNSU9p0tw9qOgK/3l75g5MTyVzXRTvoS 7bTFURpxRAWXmjiJOjtZSSfqiUnstkvupL17z8qAHl9KV6+KbJ7dVHhAM/giFdvE3mmk /WJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=jFieCwfy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d13si4294418edo.367.2021.02.25.13.00.52; Thu, 25 Feb 2021 13:01:14 -0800 (PST) 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=@google.com header.s=20161025 header.b=jFieCwfy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234680AbhBYU5y (ORCPT + 99 others); Thu, 25 Feb 2021 15:57:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50542 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234022AbhBYUt4 (ORCPT ); Thu, 25 Feb 2021 15:49:56 -0500 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92A1CC061356 for ; Thu, 25 Feb 2021 12:48:17 -0800 (PST) Received: by mail-qt1-x849.google.com with SMTP id x5so5012728qti.23 for ; Thu, 25 Feb 2021 12:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=DM1qAEmP5vcSYf3rgtbYxteKXUrb+lcNyYCUDv3yLOQ=; b=jFieCwfy3h6lwGBHiM8luxx6QrR+gEE6E5SrdJyhG1HUzaUWgCNyBY5g5OBj5LoL78 SQ3SNHuUzw+lziT3yp3jICHEgZtR7Q0Od+Mglfp324M4pTprI8vz8uKDXz8se9nywHj8 I7TMwaB+3ElDgNUTqkX7LGxaFWKrAtZr3uDb/hOp/YQieDkqOGg/cBiaKNkfcnp7GptT vJ+WQRvUqNhtENU8c3zF3S87AHqfaw0/mmkJeL+6v++6+Zwp48BWVuJDpGRln28I6GfP BGPydtbj3SZAHzV1Vqm1iwNvDZOyCsQRLva+TDWvU4R8stNQ6C25AsPyxy3Y7/vQ7avr s+Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=DM1qAEmP5vcSYf3rgtbYxteKXUrb+lcNyYCUDv3yLOQ=; b=B2UGWRe0KV2LlbW3QDyMMwqN5BWkEumNAtrMFZZoV5DU/vTpqlb38CYe7N2taNOv4n QwMrpLMWLlHOgO8wpiqcssoWrTJKwMgipOB34MBJxnfjSMjME0EkvJuKO1sB6QgV1TKs SOXTXE3U4OBzeI6uEYl3oH7aGlpoZSEupdCyMc4+gtTBUdxU7/Vwac9in1iQlT1kPxZQ ua1C446UcqXrtH+LaRi/LaCYkjMvSTYu+pD1+bLyvV0RpwcSXf9bR3XAux/s4olmBUuB Dlw/txeuz+qd3l2yNvIucJQTtmnwnbxayzY89g1N1aZ/7s1M0SlqjMIEEtu5IAiIAhr9 QnVQ== X-Gm-Message-State: AOAM532PHQoH2WZZ3uJepzQaFEQywt6wYjkNTpFzQ8JjKu+V7oUOyKYV LiFnxQZqCTDMt5+BSqyiNFtBYMuduYI= Sender: "seanjc via sendgmr" X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:34c4:7c1d:f9ba:4576]) (user=seanjc job=sendgmr) by 2002:a0c:b526:: with SMTP id d38mr4582364qve.7.1614286096636; Thu, 25 Feb 2021 12:48:16 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 25 Feb 2021 12:47:32 -0800 In-Reply-To: <20210225204749.1512652-1-seanjc@google.com> Message-Id: <20210225204749.1512652-8-seanjc@google.com> Mime-Version: 1.0 References: <20210225204749.1512652-1-seanjc@google.com> X-Mailer: git-send-email 2.30.1.766.gb4fecdf3b7-goog Subject: [PATCH 07/24] KVM: x86/mmu: Handle MMIO SPTEs directly in mmu_set_spte() From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Ben Gardon Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now that it should be impossible to convert a valid SPTE to an MMIO SPTE, handle MMIO SPTEs early in mmu_set_spte() without going through set_spte() and all the logic for removing an existing, valid SPTE. The other caller of set_spte(), FNAME(sync_page)(), explicitly handles MMIO SPTEs prior to calling set_spte(). This simplifies mmu_set_spte() and set_spte(), and also "fixes" an oddity where MMIO SPTEs are traced by both trace_kvm_mmu_set_spte() and trace_mark_mmio_spte(). Note, mmu_spte_set() will WARN if this new approach causes KVM to create an MMIO SPTE overtop a valid SPTE. Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 37c68abc54b8..4a24beefff94 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -236,17 +236,6 @@ static unsigned get_mmio_spte_access(u64 spte) return spte & shadow_mmio_access_mask; } -static bool set_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn, - kvm_pfn_t pfn, unsigned int access) -{ - if (unlikely(is_noslot_pfn(pfn))) { - mark_mmio_spte(vcpu, sptep, gfn, access); - return true; - } - - return false; -} - static bool check_mmio_spte(struct kvm_vcpu *vcpu, u64 spte) { u64 kvm_gen, spte_gen, gen; @@ -2561,9 +2550,6 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, struct kvm_mmu_page *sp; int ret; - if (set_mmio_spte(vcpu, sptep, gfn, pfn, pte_access)) - return 0; - sp = sptep_to_sp(sptep); ret = make_spte(vcpu, pte_access, level, gfn, pfn, *sptep, speculative, @@ -2593,6 +2579,11 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, pgprintk("%s: spte %llx write_fault %d gfn %llx\n", __func__, *sptep, write_fault, gfn); + if (unlikely(is_noslot_pfn(pfn))) { + mark_mmio_spte(vcpu, sptep, gfn, pte_access); + return RET_PF_EMULATE; + } + if (is_shadow_present_pte(*sptep)) { /* * If we overwrite a PTE page pointer with a 2MB PMD, unlink @@ -2626,9 +2617,6 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, kvm_flush_remote_tlbs_with_address(vcpu->kvm, gfn, KVM_PAGES_PER_HPAGE(level)); - if (unlikely(is_mmio_spte(*sptep))) - ret = RET_PF_EMULATE; - /* * The fault is fully spurious if and only if the new SPTE and old SPTE * are identical, and emulation is not required. -- 2.30.1.766.gb4fecdf3b7-goog