Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp562014imm; Fri, 31 Aug 2018 07:32:27 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYQrOCtWLVwgsNb/jg+5MwVW5FemHrYQAelxF2v9Qi2cxyTdnbloo2dhK74gpNNGLVGr4TG X-Received: by 2002:a65:5307:: with SMTP id m7-v6mr14402505pgq.431.1535725947873; Fri, 31 Aug 2018 07:32:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535725947; cv=none; d=google.com; s=arc-20160816; b=UpKOcnpAzGs+K0NdGb9v7Lvgl64OusH7zals/xTVVcFe+u+jepLgkgR7PxqReJyJ0Z rjAv3zGYnKZ7PMsWH/q8SkkRqETuIq/2md2hPOUyA91q2x08WgvYM44/J8/IrV2weo2p 0PIqQS7AxZZcxiwnkeceJnnymMzZbWvqbK2H4tbtBs2rs0M4Ead7Grnl+se4qKMEE7bT TFNWLBS07YUT3Kq1fx47uRNw2UmaxU8L3+7gsqc11um1fhs6oLnOXdFPeUPnE7Te4Pyw Um/WSQ6Pawk4aE1lMexxedvtHot7zZHIkOg6EuWgSd9Bx9cSa/VPQk1fxz70pVx+Ncgr QigQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=KFKDFu3o8FhfLAf4Vqz4Ca25hTJBzUVgZOJRc2yJQvo=; b=E7VX9YbNqrJ6Iil4I8zA5gj2fHI5zrqEv46xwvq70fzO6Je+VlpGamrsvWwY3333q9 vR+h/jz5fTjy1WimRKnMz5+au23W+1R5reYSZ9oFqioTFBpGtmmpImjUj3Sjk54TBbcu KOSi6pP4DzerMFUI6Mu98NK7A8BGGWIrsA5kcWnfn83pN373NSO4lJmBO38d8ByHz8iv 8PYARZ6TLS4TSQm/XS4JegcrGwra2syJBeD2cwxcKHxkS+rjFnld4T7pMOpF6mQercj6 fz2TvBQ1KAc8Vhytv4jvKqRee9AD5lD4mqVWqlr7yL4Rw5Mhh2fMPgIiKcWWI/zWjvA9 cQqQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p9-v6si9003786pgj.472.2018.08.31.07.32.13; Fri, 31 Aug 2018 07:32:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728097AbeHaRiJ (ORCPT + 99 others); Fri, 31 Aug 2018 13:38:09 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:60312 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727294AbeHaRiJ (ORCPT ); Fri, 31 Aug 2018 13:38:09 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 124C68190286; Fri, 31 Aug 2018 13:30:38 +0000 (UTC) Received: from dhcp201-121.englab.pnq.redhat.com (dhcp193-198.pnq.redhat.com [10.65.193.198]) by smtp.corp.redhat.com (Postfix) with ESMTP id D102539DDC; Fri, 31 Aug 2018 13:30:22 +0000 (UTC) From: Pankaj Gupta To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, qemu-devel@nongnu.org, linux-nvdimm@ml01.01.org Cc: jack@suse.cz, stefanha@redhat.com, dan.j.williams@intel.com, riel@surriel.com, nilal@redhat.com, kwolf@redhat.com, pbonzini@redhat.com, ross.zwisler@intel.com, david@redhat.com, xiaoguangrong.eric@gmail.com, hch@infradead.org, mst@redhat.com, niteshnarayanlal@hotmail.com, lcapitulino@redhat.com, imammedo@redhat.com, eblake@redhat.com, pagupta@redhat.com Subject: [PATCH 0/3] kvm "fake DAX" device Date: Fri, 31 Aug 2018 19:00:15 +0530 Message-Id: <20180831133019.27579-1-pagupta@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Fri, 31 Aug 2018 13:30:38 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Fri, 31 Aug 2018 13:30:38 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'pagupta@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch series has implementation for "fake DAX". "fake DAX" is fake persistent memory(nvdimm) in guest which allows to bypass the guest page cache. This also implements a VIRTIO based asynchronous flush mechanism. Sharing guest driver and qemu device changes in separate patch sets for easy review and it has been tested together. Details of project idea for 'fake DAX' flushing interface is shared [2] & [3]. Implementation is divided into two parts: New virtio pmem guest driver and qemu code changes for new virtio pmem paravirtualized device. 1. Guest virtio-pmem kernel driver --------------------------------- - Reads persistent memory range from paravirt device and registers with 'nvdimm_bus'. - 'nvdimm/pmem' driver uses this information to allocate persistent memory region and setup filesystem operations to the allocated memory. - virtio pmem driver implements asynchronous flushing interface to flush from guest to host. 2. Qemu virtio-pmem device --------------------------------- - Creates virtio pmem device and exposes a memory range to KVM guest. - At host side this is file backed memory which acts as persistent memory. - Qemu side flush uses aio thread pool API's and virtio for asynchronous guest multi request handling. David Hildenbrand CCed also posted a modified version[4] of qemu virtio-pmem code based on updated Qemu memory device API. Virtio-pmem errors handling: ---------------------------------------- Checked behaviour of virtio-pmem for below types of errors Need suggestions on expected behaviour for handling these errors? - Hardware Errors: Uncorrectable recoverable Errors: a] virtio-pmem: - As per current logic if error page belongs to Qemu process, host MCE handler isolates(hwpoison) that page and send SIGBUS. Qemu SIGBUS handler injects exception to KVM guest. - KVM guest then isolates the page and send SIGBUS to guest userspace process which has mapped the page. b] Existing implementation for ACPI pmem driver: - Handles such errors with MCE notifier and creates a list of bad blocks. Read/direct access DAX operation return EIO if accessed memory page fall in bad block list. - It also starts backgound scrubbing. - Similar functionality can be reused in virtio-pmem with MCE notifier but without scrubbing(no ACPI/ARS)? Need inputs to confirm if this behaviour is ok or needs any change? Changes from RFC v3: [1] - Rebase to latest upstream - Luiz - Call ndregion->flush in place of nvdimm_flush- Luiz - kmalloc return check - Luiz - virtqueue full handling - Stefan - Don't map entire virtio_pmem_req to device - Stefan - request leak,correct sizeof req- Stefan - Move declaration to virtio_pmem.c Changes from RFC v2: - Add flush function in the nd_region in place of switching on a flag - Dan & Stefan - Add flush completion function with proper locking and wait for host side flush completion - Stefan & Dan - Keep userspace API in uapi header file - Stefan, MST - Use LE fields & New device id - MST - Indentation & spacing suggestions - MST & Eric - Remove extra header files & add licensing - Stefan Changes from RFC v1: - Reuse existing 'pmem' code for registering persistent memory and other operations instead of creating an entirely new block driver. - Use VIRTIO driver to register memory information with nvdimm_bus and create region_type accordingly. - Call VIRTIO flush from existing pmem driver. Pankaj Gupta (3): nd: move nd_region to common header libnvdimm: nd_region flush callback support virtio-pmem: Add virtio-pmem guest driver [1] https://lkml.org/lkml/2018/7/13/102 [2] https://www.spinics.net/lists/kvm/msg149761.html [3] https://www.spinics.net/lists/kvm/msg153095.html [4] https://marc.info/?l=qemu-devel&m=153555721901824&w=2 drivers/acpi/nfit/core.c | 7 - drivers/nvdimm/claim.c | 3 drivers/nvdimm/nd.h | 39 ----- drivers/nvdimm/pmem.c | 12 + drivers/nvdimm/region_devs.c | 12 + drivers/virtio/Kconfig | 9 + drivers/virtio/Makefile | 1 drivers/virtio/virtio_pmem.c | 255 +++++++++++++++++++++++++++++++++++++++ include/linux/libnvdimm.h | 4 include/linux/nd.h | 40 ++++++ include/uapi/linux/virtio_ids.h | 1 include/uapi/linux/virtio_pmem.h | 40 ++++++ 12 files changed, 374 insertions(+), 49 deletions(-)