From patchwork Mon Dec 3 19:25:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Duyck X-Patchwork-Id: 10710405 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 D138B13BF for ; Mon, 3 Dec 2018 19:25:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C28452A962 for ; Mon, 3 Dec 2018 19:25:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B62382AF77; Mon, 3 Dec 2018 19:25:30 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7D1C72A962 for ; Mon, 3 Dec 2018 19:25:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 871CA6B6ABE; Mon, 3 Dec 2018 14:25:28 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 81FAE6B6ABF; Mon, 3 Dec 2018 14:25:28 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7370A6B6AC0; Mon, 3 Dec 2018 14:25:28 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by kanga.kvack.org (Postfix) with ESMTP id 329826B6ABE for ; Mon, 3 Dec 2018 14:25:28 -0500 (EST) Received: by mail-pl1-f200.google.com with SMTP id v12so10794570plp.16 for ; Mon, 03 Dec 2018 11:25:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:subject:from :to:cc:date:message-id:in-reply-to:references:user-agent :mime-version:content-transfer-encoding; bh=LDJ3fWIOYbcK6NTRumfGpPe3ndEpu9Og6F4cNR00A3k=; b=TDIGEL2gXwk7pyR3xJs5Cgm9AYZLKCiJHnmXIgtG5V9W9FfzPTdleK/Tx8Tc7yVUqU p3EoL/GmD4LXasPInggHjkwx3VMNzvXGvGh79QMuPjvD/M7SnFevGsVZjBcnC1uIjGWk 7gcK7mQXlrwFKJTN5S9L5wGHAe0hW4wmiSPbC9Cs026UvwHlBGXAWZV1UVHf55TRZQTp LA0tfNHG9EQRaAmn2FnWDTzMZyhepuaLc4z2RxRuJWAlag2F6NrlAZv8eKwN/QBQklSv sqpOvoBUeirNK56gBEGj34TGJsX1ofFiei6kFDU4wok86g4bq8nHAY+2MfaX9raWr0iI PpkQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of alexander.h.duyck@linux.intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=alexander.h.duyck@linux.intel.com; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: AA+aEWbbIfcfWviLrn8T1QxzNON3Ig5nvCEKvW6tThp6vZ3ToXtAWIJD SFLbFBFRrJKhZRMPqtaWDK03/5HaqQe5qY/m53wvcTnXP4zH5sifEUtvioqbAGFS423XCGEBsLt WuxDSCP79CaVHBf5EJIMRA8+pXtkeciipfVk1YsH5xAcMZ+3WhmgHtrMqARiVuXatQQ== X-Received: by 2002:a17:902:b494:: with SMTP id y20mr17514641plr.178.1543865127842; Mon, 03 Dec 2018 11:25:27 -0800 (PST) X-Google-Smtp-Source: AFSGD/X1ls3pCLM+hwx7wFh4EwQf5KYlXJyPTrfQyvAIRWIYTd5pwg0c03e02YiJ4uP6+d2v2ait X-Received: by 2002:a17:902:b494:: with SMTP id y20mr17514582plr.178.1543865126931; Mon, 03 Dec 2018 11:25:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543865126; cv=none; d=google.com; s=arc-20160816; b=k2cveHwTfx/ywFS0yVEkYam+pAUwBJKrFK1nL0ItonoFSos/BadyH4l1Eu0Wcwy5Zn QF+oisSXIEAbE1doSEHxOwqljnDsFrASUPAgyXhHcnXwx+6TdoVjl6Hiha263veHf5ny qMry8ALQ/3iOH4k5BS/Jp/yOR/4EVJahSv/aEQ3A9uXSk0YefS2A9h1rWHPJitrxBKk4 lZgYbjPW97wNZgCy3xjARZhvfao6AZ2eA1A2C+zELqH1yx/n+xthmKhlcrMRQVgLbVKB BJzKJGfA+oMiPzydyceLqkWIgxqkilNcvRMqJfVCIVfgZ6snqSI17mAw6ldiqwq4fdjn 4/GA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:message-id:date:cc:to:from:subject; bh=LDJ3fWIOYbcK6NTRumfGpPe3ndEpu9Og6F4cNR00A3k=; b=z2RKLxh2XB4VbYBW6yNtM/+NqLGbPzzt/QeOtNTSyCui3RmkzCjW49mbq0N5wKrmfk 2IlMwKTO4fPXaC77oamlLv5uIsOUMNYWdzavOX6hW0BnlPYUbnXekb0W3RiSGo0XTe71 ACtPLZBiivhETX8irT5ntrBDJPKlGdhIaQZPYUn9tWYugewcl5wvD+1+vZIvALElxuL2 duLyxvSikrN7ALlTC5EiMd9K1FI3JypR2L60JTNxUNzHswP9laOdl9nUoe+/pIhSlnCE 8brXW/rhwRR6bLLZuar9O36iy9wYtHNRWojPofwbLdxJ3/sDulKOdI1rgtczXqpsZgDd i0gg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of alexander.h.duyck@linux.intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=alexander.h.duyck@linux.intel.com; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga14.intel.com (mga14.intel.com. [192.55.52.115]) by mx.google.com with ESMTPS id f63si16103419pfg.136.2018.12.03.11.25.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Dec 2018 11:25:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of alexander.h.duyck@linux.intel.com designates 192.55.52.115 as permitted sender) client-ip=192.55.52.115; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of alexander.h.duyck@linux.intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=alexander.h.duyck@linux.intel.com; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Dec 2018 11:25:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,311,1539673200"; d="scan'208";a="115600470" Received: from ahduyck-desk1.amr.corp.intel.com ([10.7.198.76]) by orsmga001.jf.intel.com with ESMTP; 03 Dec 2018 11:25:26 -0800 Subject: [PATCH RFC 1/3] kvm: Split use cases for kvm_is_reserved_pfn to kvm_is_refcounted_pfn From: Alexander Duyck To: dan.j.williams@intel.com, pbonzini@redhat.com, yi.z.zhang@linux.intel.com, brho@google.com, kvm@vger.kernel.org, linux-nvdimm@lists.01.org Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, dave.jiang@intel.com, yu.c.zhang@intel.com, pagupta@redhat.com, david@redhat.com, jack@suse.cz, hch@lst.de, rkrcmar@redhat.com, jglisse@redhat.com Date: Mon, 03 Dec 2018 11:25:26 -0800 Message-ID: <154386512606.27193.13867450982940890636.stgit@ahduyck-desk1.amr.corp.intel.com> In-Reply-To: <154386493754.27193.1300965403157243427.stgit@ahduyck-desk1.amr.corp.intel.com> References: <154386493754.27193.1300965403157243427.stgit@ahduyck-desk1.amr.corp.intel.com> User-Agent: StGit/unknown-version MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP The function kvm_is_reserved_pfn really has two uses. One is to test for if we should be updating the reference count on a page when we are accessing it. The other is to determine if we should be updating the dirty flag or marking pages as accessed. In preparation for blurring the lines between ZONE_DEVICE and system RAM I am splitting out the dirty/accessed cases into their own checks. Doing this allows us to add ZONE_DEVICE to the list of refcounted pages without having to worry about us introducing possible issues with pages being marked as dirty or accessed and possibly causing any issues with attempted LRU accesses on the ZONE_DEVICE pages. Signed-off-by: Alexander Duyck --- arch/x86/kvm/mmu.c | 6 +++--- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 22 +++++++++++++--------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 7c03c0f35444..7c61cc260c23 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -798,7 +798,7 @@ static int mmu_spte_clear_track_bits(u64 *sptep) * kvm mmu, before reclaiming the page, we should * unmap it from mmu first. */ - WARN_ON(!kvm_is_reserved_pfn(pfn) && !page_count(pfn_to_page(pfn))); + WARN_ON(kvm_is_refcounted_pfn(pfn) && !page_count(pfn_to_page(pfn))); if (is_accessed_spte(old_spte)) kvm_set_pfn_accessed(pfn); @@ -3166,7 +3166,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu, * PT_PAGE_TABLE_LEVEL and there would be no adjustment done * here. */ - if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) && + if (!is_error_noslot_pfn(pfn) && kvm_is_refcounted_pfn(pfn) && level == PT_PAGE_TABLE_LEVEL && PageTransCompoundMap(pfn_to_page(pfn)) && !mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) { @@ -5668,7 +5668,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, * mapping if the indirect sp has level = 1. */ if (sp->role.direct && - !kvm_is_reserved_pfn(pfn) && + kvm_is_refcounted_pfn(pfn) && PageTransCompoundMap(pfn_to_page(pfn))) { pte_list_remove(rmap_head, sptep); need_tlb_flush = 1; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index c926698040e0..132e5dbc9049 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -906,7 +906,7 @@ void kvm_arch_sync_events(struct kvm *kvm); int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); void kvm_vcpu_kick(struct kvm_vcpu *vcpu); -bool kvm_is_reserved_pfn(kvm_pfn_t pfn); +bool kvm_is_refcounted_pfn(kvm_pfn_t pfn); struct kvm_irq_ack_notifier { struct hlist_node link; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2679e476b6c3..5e666df5666d 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -146,7 +146,15 @@ __weak int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, return 0; } -bool kvm_is_reserved_pfn(kvm_pfn_t pfn) +bool kvm_is_refcounted_pfn(kvm_pfn_t pfn) +{ + if (pfn_valid(pfn)) + return !PageReserved(pfn_to_page(pfn)); + + return false; +} + +static bool kvm_is_reserved_pfn(kvm_pfn_t pfn) { if (pfn_valid(pfn)) return PageReserved(pfn_to_page(pfn)); @@ -1678,7 +1686,7 @@ EXPORT_SYMBOL_GPL(kvm_release_page_clean); void kvm_release_pfn_clean(kvm_pfn_t pfn) { - if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) + if (!is_error_noslot_pfn(pfn) && kvm_is_refcounted_pfn(pfn)) put_page(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_release_pfn_clean); @@ -1700,12 +1708,8 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); void kvm_set_pfn_dirty(kvm_pfn_t pfn) { - if (!kvm_is_reserved_pfn(pfn)) { - struct page *page = pfn_to_page(pfn); - - if (!PageReserved(page)) - SetPageDirty(page); - } + if (!kvm_is_reserved_pfn(pfn)) + SetPageDirty(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); @@ -1718,7 +1722,7 @@ EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); void kvm_get_pfn(kvm_pfn_t pfn) { - if (!kvm_is_reserved_pfn(pfn)) + if (kvm_is_refcounted_pfn(pfn)) get_page(pfn_to_page(pfn)); } EXPORT_SYMBOL_GPL(kvm_get_pfn);