Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1419752pxk; Fri, 25 Sep 2020 14:28:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy5KNVAq/oPj4N0wEY4E9yI+GxhTkI86QaXDuBeAHzQeghNYU3QR3kNuZV2GZ2LA5W2U401 X-Received: by 2002:a05:6402:64b:: with SMTP id u11mr3341436edx.147.1601069289237; Fri, 25 Sep 2020 14:28:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601069289; cv=none; d=google.com; s=arc-20160816; b=bqyBZ+46KyDGQ72fX+bBD13DxP1NNMnT7v5Rzwio1PvKxZEp8lqNTus71OGdh4ugc6 eDSG2r4zgiQ3FZ3svvqhBWVZcpVnsQzRs+9ljTIkdU8PxTZ6+vtDD+7oLKX4HV/8B97C uoOHrfy7JLk1TMIYmCo1ufL2v2y731NX70E/gJKJHWRHCEqRBJFiEsDlhdR0I/eP6fY8 3Veq6YWhwmxClXh730qYb99YZYpdg1Bu1wPPmbz0g8csJLwD4TFOJsBz038pC2njfsjT fOYClUmzW3rE1WLjvQftfDl/fmeBoUtV66J5HYsqhqRChg+oH6u0HWTwerAmMle8ei2d K07A== 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:sender:dkim-signature; bh=jRVbtRnVunaUbsRIJ3qqaIgFOVHoYWyu7xL6dJMWEVU=; b=y2EyePoIsQ9oZqgIqLFPl+iXl9N7GdZqzr0vAJyr7zHUeBVe4uSeiI+0fSzqrqcaAP SFgXAqUTDZQ49dFonVJYWkgLSuLAaZ4+Xjp391pZQVComXyHD2KQEdVFPX9nlJbQwA0q APyWBCpu6s2g0q6JvbZDPD0fkxFt6lKaqoseLp00XE9/t405y8YyoTUaEy5cz8N0Pg0C yxoeBkZPUHqMzGyM+p9q3SmzzSfA8D6RckBiZKRcZuCLrcDtrLy/USfmOGRf/ftGcQOr /Gdm3Ne8tLgT2b1szS++BqoUBgdVuDV8EL1um5iDw4pSumnsS6I4S5jBxGFhOsxpllZG lohQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=dfKIlNg1; 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 cw21si2723260ejb.392.2020.09.25.14.27.46; Fri, 25 Sep 2020 14:28:09 -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=@google.com header.s=20161025 header.b=dfKIlNg1; 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 S1729473AbgIYVYX (ORCPT + 99 others); Fri, 25 Sep 2020 17:24:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33678 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729260AbgIYVXi (ORCPT ); Fri, 25 Sep 2020 17:23:38 -0400 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 8957EC0613D6 for ; Fri, 25 Sep 2020 14:23:38 -0700 (PDT) Received: by mail-qt1-x849.google.com with SMTP id m13so3232988qtu.10 for ; Fri, 25 Sep 2020 14:23:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=jRVbtRnVunaUbsRIJ3qqaIgFOVHoYWyu7xL6dJMWEVU=; b=dfKIlNg1y7ZqiIyhdvXSMvj8pVfsBfNZKnyiXx9VE5GfVSl8WjprUfryl5rIymrH7i XJ5s8PI7wf36Feoycno1aFCYIdLW1nOpheLf6Ol5H7/wydSBAcGTZrv3yOD6n1ixHN7g TFN8MFXDwstrtpdbz3Bdy/ZmPNuf5BKCWp51ogfcYtoQlKNiODD/+gQTSHj0VUvhme+E bkbmyzK6iDSvJO6R9T1UVGbCqIewIbrTGl5UbW5LhlUfSabrFEF5NAy1jgQY6BDYbK+6 DSoaRk9Y3Z5QYdeDtnAeLl3NLxVPSfu+P6M+YUz3iYag3LHoHwrwwPuebKGPw53HoJUb itpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=jRVbtRnVunaUbsRIJ3qqaIgFOVHoYWyu7xL6dJMWEVU=; b=FPqBsYwanQZrBXSqCrkCcUcxPnE1rOhRO/rrq/F+mH8KxHzDwTpHSFONrwNT+GuBDo 5wfNpdgra6+3BCvo5pt0EqN61Qyb9gSCWCCxLwRxZZNz94Je53Q6TF8ViKf4YNQ8Iba0 MUmdVe/PROSEnpvEgOJ7jhv7qrlmqQDOBInqXedWTIO4JHRe25sqOWF84wwEXNmvy+Hx A/QAFX+2jKv8gPeakKSaEQEU9ytXpeHSy1FWALKQP7Ok2RjQFu1BAHYJHiHaQ5E/w/be E8z7ZGj+OisWB6bDmNRPqOqYV6SOL0qu0MIEezyrcWMEMe5opIRFOh7AE9sYUT2SGJmU z0zg== X-Gm-Message-State: AOAM531wV2oItcKNlzpJtSSD/cN9judpblZtowv8UGcLHBe/5BAAFWzl NBJvHlMd0RJcGAQbZzMPqX9nYB186hOzfmOSX/moOBVy5Nx10zmyrkUG89L/FudzDVJuFqD8xLv vufNWeziJOh3XpPuCjF6S8AxGvHZiXFgR/DgSXTLrUyYb5yQ7QX/QeLn3egTvVeCeU3SXKqcS Sender: "bgardon via sendgmr" X-Received: from bgardon.sea.corp.google.com ([2620:15c:100:202:f693:9fff:fef4:a293]) (user=bgardon job=sendgmr) by 2002:ad4:5745:: with SMTP id q5mr636253qvx.29.1601069017635; Fri, 25 Sep 2020 14:23:37 -0700 (PDT) Date: Fri, 25 Sep 2020 14:22:56 -0700 In-Reply-To: <20200925212302.3979661-1-bgardon@google.com> Message-Id: <20200925212302.3979661-17-bgardon@google.com> Mime-Version: 1.0 References: <20200925212302.3979661-1-bgardon@google.com> X-Mailer: git-send-email 2.28.0.709.gb0816b6eb0-goog Subject: [PATCH 16/22] kvm: mmu: Add dirty logging handler for changed sptes From: Ben Gardon To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Cannon Matthews , Paolo Bonzini , Peter Xu , Sean Christopherson , Peter Shier , Peter Feiner , Junaid Shahid , Jim Mattson , Yulei Zhang , Wanpeng Li , Vitaly Kuznetsov , Xiao Guangrong , Ben Gardon Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a function to handle the dirty logging bookkeeping associated with SPTE changes. This will be important for future commits which will allow the TDP MMU to log dirty pages the same way the x86 shadow paging based MMU does. Tested by running kvm-unit-tests and KVM selftests on an Intel Haswell machine. This series introduced no new failures. This series can be viewed in Gerrit at: https://linux-review.googlesource.com/c/virt/kvm/kvm/+/2538 Signed-off-by: Ben Gardon --- arch/x86/kvm/mmu/tdp_mmu.c | 21 +++++++++++++++++++++ include/linux/kvm_host.h | 1 + virt/kvm/kvm_main.c | 6 ++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 3119583409131..bbe973d3f8084 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -236,6 +236,24 @@ static void handle_changed_spte_acc_track(u64 old_spte, u64 new_spte, int level) kvm_set_pfn_accessed(spte_to_pfn(old_spte)); } +static void handle_changed_spte_dlog(struct kvm *kvm, int as_id, gfn_t gfn, + u64 old_spte, u64 new_spte, int level) +{ + bool pfn_changed; + struct kvm_memory_slot *slot; + + if (level > PG_LEVEL_4K) + return; + + pfn_changed = spte_to_pfn(old_spte) != spte_to_pfn(new_spte); + + if ((!is_writable_pte(old_spte) || pfn_changed) && + is_writable_pte(new_spte)) { + slot = __gfn_to_memslot(__kvm_memslots(kvm, as_id), gfn); + mark_page_dirty_in_slot(slot, gfn); + } +} + /** * handle_changed_spte - handle bookkeeping associated with an SPTE change * @kvm: kvm instance @@ -348,6 +366,7 @@ static void handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, { __handle_changed_spte(kvm, as_id, gfn, old_spte, new_spte, level); handle_changed_spte_acc_track(old_spte, new_spte, level); + handle_changed_spte_dlog(kvm, as_id, gfn, old_spte, new_spte, level); } #define for_each_tdp_pte_root(_iter, _root, _start, _end) \ @@ -685,6 +704,8 @@ static int age_gfn_range(struct kvm *kvm, struct kvm_memory_slot *slot, *iter.sptep = new_spte; __handle_changed_spte(kvm, as_id, iter.gfn, iter.old_spte, new_spte, iter.level); + handle_changed_spte_dlog(kvm, as_id, iter.gfn, iter.old_spte, + new_spte, iter.level); young = true; } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index a460bc712a81c..2f8c3f644d809 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -798,6 +798,7 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn); unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); +void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn); void mark_page_dirty(struct kvm *kvm, gfn_t gfn); struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f9c80351c9efd..b5082ce60a33f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -143,8 +143,6 @@ static void hardware_disable_all(void); static void kvm_io_bus_destroy(struct kvm_io_bus *bus); -static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn); - __visible bool kvm_rebooting; EXPORT_SYMBOL_GPL(kvm_rebooting); @@ -2640,8 +2638,7 @@ int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len) } EXPORT_SYMBOL_GPL(kvm_clear_guest); -static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, - gfn_t gfn) +void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn) { if (memslot && memslot->dirty_bitmap) { unsigned long rel_gfn = gfn - memslot->base_gfn; @@ -2649,6 +2646,7 @@ static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, set_bit_le(rel_gfn, memslot->dirty_bitmap); } } +EXPORT_SYMBOL_GPL(mark_page_dirty_in_slot); void mark_page_dirty(struct kvm *kvm, gfn_t gfn) { -- 2.28.0.709.gb0816b6eb0-goog