From patchwork Wed Jul 4 15:30:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Yi" X-Patchwork-Id: 10506007 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8DCB7602BC for ; Wed, 4 Jul 2018 06:52:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 71CBA28BD9 for ; Wed, 4 Jul 2018 06:52:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 63FD828CBF; Wed, 4 Jul 2018 06:52:15 +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=-1.0 required=2.0 tests=BAYES_00, DATE_IN_FUTURE_06_12, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham 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 EE89028BD9 for ; Wed, 4 Jul 2018 06:52:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 695EE6B026D; Wed, 4 Jul 2018 02:52:13 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 646196B026E; Wed, 4 Jul 2018 02:52:13 -0400 (EDT) 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 536586B026F; Wed, 4 Jul 2018 02:52:13 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl0-f70.google.com (mail-pl0-f70.google.com [209.85.160.70]) by kanga.kvack.org (Postfix) with ESMTP id 0A06C6B026D for ; Wed, 4 Jul 2018 02:52:13 -0400 (EDT) Received: by mail-pl0-f70.google.com with SMTP id t19-v6so2561329plo.9 for ; Tue, 03 Jul 2018 23:52:13 -0700 (PDT) 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:from:to:cc :subject:date:message-id:in-reply-to:references; bh=aU0qqdBzxPkb3AgEupYfKDTDp+hj15YMHJKhn/7aWE4=; b=MAO6ZcVAMw5z/uFzX9ok850vVA5IHyWrYlQwJHpUbPpQbmq9OOMMD6cOjX4/cKVtc1 XkNk9tecNFFgI5YxRTOdELmG87S8AYvB53KZfRe9PuxSbwdRUsfcg8bAV06V45FEzQVJ 4KcwULopK82mm6AoN0ZKlGZW5E7QAOTicOkPVCjfi430+/X47IbCHGruSlnStAtZnmpz //NhXcDxyMQA5YscaM56t/uyW/gNQcfP/PIJvON/97uXGWQrefjV9MK3KC0ZJyrU08C+ wp2LHKcSwwRNoWHZ0q39vH18nyvhkQDy09lx3aw6tBFfIFjyUCqPdWINE48MdXkduHvj peZQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of yi.z.zhang@linux.intel.com designates 192.55.52.136 as permitted sender) smtp.mailfrom=yi.z.zhang@linux.intel.com; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APt69E2Tmw2EZ6oW3GCjvLPtVV4LxZ5VbeyqooSB6EJKWcg8s57Nh3ha XBAUyNH7UvqQ3VuJX2BbdqsuWkuO2ORs6HzcjWVGPIQDQFn0UmN6CH5gysYy3vyvIagcoYQvELf 2dQdfY22XuCvd5UyuP93VcddehVAXf0FePl+n7M9CROOZRbzC/3mmy43hIrExBjrECQ== X-Received: by 2002:a63:121a:: with SMTP id h26-v6mr800412pgl.316.1530687132726; Tue, 03 Jul 2018 23:52:12 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcWNXW+r7oLZYrsfffMv4Uu1WpfTQN7s2NmOx6+EpbbEUik0wCKC+BR37BB/IP+f/aA7MfE X-Received: by 2002:a63:121a:: with SMTP id h26-v6mr800386pgl.316.1530687131980; Tue, 03 Jul 2018 23:52:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530687131; cv=none; d=google.com; s=arc-20160816; b=KkWsF63YUUhULSQe0AWjRl6/s7BDPVcAdL0Bcx/t/g98hg0Ly5Puu+QGF9MCsqXMbW JqDHdZrVZvNPVCsr1pRoKoe2p3tS7vpr8ctofyJkXWciG6FHsH4+SB7sb23R2M5IO+HX PI5NuqEJ6hIzt68bDt+rp83l+0bxCdGqcDGL0iUA5B6hiQCqXctFoLPF1bvOELvKzohw 4ULgZlDVoij4D2XgRJdwmdnfOZCo+TwscZnDZTgKZEP0UGLfwDd9Rqy/MCaLwokOjx+S XOHiXBjQL0ojbs3E2AkTgSV98KrXOxNg/LiYovWRGryHxfXF4e9YR3kLK0KkMPLaUTbb SaaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=aU0qqdBzxPkb3AgEupYfKDTDp+hj15YMHJKhn/7aWE4=; b=zrQ7O20FBTWEMVuzW+2gbqg+8/gxd3uZnr1Qhq982UCe32aruTtzGvSSfzujGFm4S3 psV4qlEKoOu4IpBbHk2cb/YKCyL/EHYAuSMsfzIUlGBCwimAm+2Z46daI4LEphvvOnH9 9AtvAVnA8wpCJwCgzLGMEC21A32Vaul3JN8f9SFRqV3as/80uZWzXJ/w7gmr6RozVOww TUbQwEP2IQ4EFSeuZbISMUX/cSbBFdTZORhgPx/iX9wDNv1ojtBKAK2LyvmujfIQNu7V rdK8bPauwT6u8WUmE5FKznAR+8CNRwF8f4ajsAz/Lz1DKEmWlOlkE5jxQKObaUUsnb9Z d55A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of yi.z.zhang@linux.intel.com designates 192.55.52.136 as permitted sender) smtp.mailfrom=yi.z.zhang@linux.intel.com; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga12.intel.com (mga12.intel.com. [192.55.52.136]) by mx.google.com with ESMTPS id v18-v6si2803525pff.248.2018.07.03.23.52.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 23:52:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of yi.z.zhang@linux.intel.com designates 192.55.52.136 as permitted sender) client-ip=192.55.52.136; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of yi.z.zhang@linux.intel.com designates 192.55.52.136 as permitted sender) smtp.mailfrom=yi.z.zhang@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 fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Jul 2018 23:52:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,306,1526367600"; d="scan'208";a="242489814" Received: from linux.intel.com ([10.54.29.200]) by fmsmga005.fm.intel.com with ESMTP; 03 Jul 2018 23:52:11 -0700 Received: from dazhang1-ssd.sh.intel.com (unknown [10.239.48.78]) by linux.intel.com (Postfix) with ESMTP id 55A41580117; Tue, 3 Jul 2018 23:52:09 -0700 (PDT) From: Zhang Yi To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, pbonzini@redhat.com, dan.j.williams@intel.com, jack@suse.cz, hch@lst.de, yu.c.zhang@intel.com Cc: linux-mm@kvack.org, rkrcmar@redhat.com, yi.z.zhang@intel.com, Zhang Yi Subject: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem. Date: Wed, 4 Jul 2018 23:30:28 +0800 Message-Id: <359fdf0103b61014bf811d88d4ce36bc793d18f2.1530716899.git.yi.z.zhang@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: 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 For device specific memory space, when we move these area of pfn to memory zone, we will set the page reserved flag at that time, some of these reserved for device mmio, and some of these are not, such as NVDIMM pmem. Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM backend, since these pages are reserved. the check of kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX, to indentify these pages are from NVDIMM pmem. and let kvm treat these as normal pages. Without this patch, Many operations will be missed due to this mistreatment to pmem pages. For example, a page may not have chance to be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc. Signed-off-by: Zhang Yi Signed-off-by: Zhang Yu --- virt/kvm/kvm_main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index afb2e6e..1365d18 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, { } +static bool kvm_is_nd_pfn(kvm_pfn_t pfn) +{ + struct page *page = pfn_to_page(pfn); + + return is_zone_device_page(page) && + ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) || + (page->pgmap->type == MEMORY_DEVICE_DEV_DAX)); +} + bool kvm_is_reserved_pfn(kvm_pfn_t pfn) { - if (pfn_valid(pfn)) - return PageReserved(pfn_to_page(pfn)); + struct page *page; + + if (pfn_valid(pfn)) { + page = pfn_to_page(pfn); + return kvm_is_nd_pfn(pfn) ? false : PageReserved(page); + } return true; }