From patchwork Sat Oct 20 03:15:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junaid Shahid X-Patchwork-Id: 10650247 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 331BE13A9 for ; Sat, 20 Oct 2018 03:16:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 22A5620415 for ; Sat, 20 Oct 2018 03:16:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 177F1205F6; Sat, 20 Oct 2018 03:16:14 +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=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham 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 A4CBD20415 for ; Sat, 20 Oct 2018 03:16:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726534AbeJTLZD (ORCPT ); Sat, 20 Oct 2018 07:25:03 -0400 Received: from mail-qt1-f201.google.com ([209.85.160.201]:53613 "EHLO mail-qt1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726489AbeJTLZC (ORCPT ); Sat, 20 Oct 2018 07:25:02 -0400 Received: by mail-qt1-f201.google.com with SMTP id c33-v6so40015075qta.20 for ; Fri, 19 Oct 2018 20:16:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=FBsiMrI6AsfuK7l4bcXtob4sNeXsB4lggR41Yy+CnYg=; b=YpZrjqvPXuZMc8w7xaGAFbIFd3TublsEuShvDFpWiMobhEr0LaFj+vOTuLK8nzJGcU 4/yIfqeoXRVqJm2XlyWkMF+YCIC7gAnpolV+94YiwwAEKtWsjkoHRKWF6K6R64DDoiY8 FJr49EqyURSuvJWd+8cZny/QOeVi34o4ire+9cHaQuItstzCxGgB+KRzFzm+Jga1CW9L abMFuU+DsLpg3g/zS0On//uoZGSQvymnb66voH5/gnDiH/02jSIyVszG5oJwSrGA0Ww0 JzOhkGP6Ki62qHEbwVnNhpHb8JpM3MNe2LY9jiFPlM2LS++s1W4fKDMNNlvauEJCc6X8 M3xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=FBsiMrI6AsfuK7l4bcXtob4sNeXsB4lggR41Yy+CnYg=; b=rgnQ1X+embmAoUhmp69Srx6moCZIvnhmxmZNxBZDz0jQIZNZf6gli/8uh86zQvb5+C usiyAmzvKmGNzr40fQqWjFh0NafqkxGcb9pldyvfc8herKWY1ocRuCll2/fl18H6IBdx Jwt0U7ieh8z4C6dyzrFq8yKrbjlw7hY0Nw8uN1DmQCFmTpslIigq4tOVEjKLqo1uZi5S aMICefXENYILU/iprRkWbbgZrEdbfSXAp02Jxn0Cr7Dt/VC0iCv04Lji3Cx8lnCYjHiv SYM7lekjCZd0krxAKfo+cgqXWns5JdT+At7P9lP+SGwGQKyzWD2rhpgYSjeWnvLiEvtG yL9Q== X-Gm-Message-State: ABuFfojVEGZ0ewO9pDxZaB2zbBzaWt3N0QqL2zRuANCKa6TmDgvE8OUZ +fo9A972yZFhoAiouwskPCLh1Ssp17Hf X-Google-Smtp-Source: ACcGV60Dakxu+Txo/JWZAAZfucIiLpaFGSgXaapDjh3cSd2KcVSnEAJlvk4QqsPyLn6s385BA9ps2scGbBUH X-Received: by 2002:ac8:6a13:: with SMTP id t19-v6mr58064qtr.12.1540005370261; Fri, 19 Oct 2018 20:16:10 -0700 (PDT) Date: Fri, 19 Oct 2018 20:15:36 -0700 In-Reply-To: <20181020031543.124399-1-junaids@google.com> Message-Id: <20181020031543.124399-4-junaids@google.com> Mime-Version: 1.0 References: <20181020031543.124399-1-junaids@google.com> X-Mailer: git-send-email 2.19.1.568.g152ad8e336-goog Subject: [PATCH 03/10] kvm: x86: mmu: Change __rmap_clear_dirty to __rmap_test_and_clear_dirty From: Junaid Shahid To: pbonzini@redhat.com Cc: kvm@vger.kernel.org, pfeiner@google.com Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Make it explicit that the dirty bit is tested and the old value is returned after clearing, even though in practice the function already did that. Signed-off-by: Junaid Shahid --- arch/x86/kvm/mmu.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 752508892b08..0d71a775763e 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1521,15 +1521,19 @@ static bool __rmap_write_protect(struct kvm *kvm, return flush; } -static bool spte_clear_dirty(u64 *sptep) +static bool spte_test_and_clear_dirty(u64 *sptep) { - u64 spte = *sptep; + int dirty_bit = ffs(shadow_dirty_mask) - 1; + bool dirty; - rmap_printk("rmap_clear_dirty: spte %p %llx\n", sptep, *sptep); + BUG_ON(shadow_dirty_mask == 0); + rmap_printk("%s: spte %p %llx\n", __func__, sptep, *sptep); - spte &= ~shadow_dirty_mask; + dirty = test_and_clear_bit(dirty_bit, (unsigned long *)sptep); + if (dirty) + kvm_set_pfn_dirty(spte_to_pfn(*sptep)); - return mmu_spte_update(sptep, spte); + return dirty; } static bool wrprot_ad_disabled_spte(u64 *sptep) @@ -1548,19 +1552,20 @@ static bool wrprot_ad_disabled_spte(u64 *sptep) * - W bit on ad-disabled SPTEs. * Returns true iff any D or W bits were cleared. */ -static bool __rmap_clear_dirty(struct kvm *kvm, struct kvm_rmap_head *rmap_head) +static bool __rmap_test_and_clear_dirty(struct kvm *kvm, + struct kvm_rmap_head *rmap_head) { u64 *sptep; struct rmap_iterator iter; - bool flush = false; + bool dirty = false; for_each_rmap_spte(rmap_head, &iter, sptep) if (spte_ad_enabled(*sptep)) - flush |= spte_clear_dirty(sptep); + dirty |= spte_test_and_clear_dirty(sptep); else - flush |= wrprot_ad_disabled_spte(sptep); + dirty |= wrprot_ad_disabled_spte(sptep); - return flush; + return dirty; } static bool spte_set_dirty(u64 *sptep) @@ -1632,7 +1637,7 @@ void kvm_mmu_clear_dirty_pt_masked(struct kvm *kvm, while (mask) { rmap_head = __gfn_to_rmap(slot->base_gfn + gfn_offset + __ffs(mask), PT_PAGE_TABLE_LEVEL, slot); - __rmap_clear_dirty(kvm, rmap_head); + __rmap_test_and_clear_dirty(kvm, rmap_head); /* clear the first set bit */ mask &= mask - 1; @@ -5740,7 +5745,8 @@ void kvm_mmu_slot_leaf_clear_dirty(struct kvm *kvm, bool flush; spin_lock(&kvm->mmu_lock); - flush = slot_handle_leaf(kvm, memslot, __rmap_clear_dirty, false); + flush = slot_handle_leaf(kvm, memslot, __rmap_test_and_clear_dirty, + false); spin_unlock(&kvm->mmu_lock); lockdep_assert_held(&kvm->slots_lock);