This patch series has implementation for "virtio pmem" device. "virtio pmem" is persistent memory(nvdimm) device in guest which allows to bypass the guest page cache. This also implements a VIRTIO based asynchronous flush mechanism. Details of project idea for 'virtio pmem' flushing interface is shared [2] & [3].
Sharing Qemu device emulation in this patchset. Tested with guest kernel driver [1]. This series is based on David's memory device refactoring [5] work with modified version of my initial virtio pmem [4] series. Usage: ./qemu -name test -machine pc -m 8G,slots=240,maxmem=20G -object memory-backend-file,id=mem1,share,mem-path=test.img, size=4G,share -device virtio-pmem-pci,memdev=mem1,id=nv1 (qemu) info memory-devices Memory device [virtio-pmem]: "nv1" memaddr: 0x240000000 size: 4294967296 memdev: /objects/mem1 Implementation is divided into two parts: New virtio pmem guest driver and qemu code changes for new virtio pmem paravirtualized device. In this series we are sharing Qemu device emulation. 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. Virtio-pmem security implications and suggested countermeasures: --------------------------------------------------------------- In previous posting of kernel driver, there was discussion [7] on possible implications of page cache side channel attacks with virtio pmem. After thorough analysis of details of known side channel attacks, below are the suggestions: - Depends entirely on how host backing image file is mapped into guest address space. - virtio-pmem device emulation, by default shared mapping is used to map host backing file. It is recommended to use separate backing file at host side for every guest. This will prevent any possibility of executing common code from multiple guests and any chance of inferring guest local data based based on execution time. - If backing file is required to be shared among multiple guests it is recommended to don't support host page cache eviction commands from the guest driver. This will avoid any possibility of inferring guest local data or host data from another guest. - Proposed device specification [6] for virtio-pmem device with details of possible security implications and suggested countermeasures for device emulation. Changes from PATCH v1: - Change proposed version from qemu 4.0 to 4.1 - Eric - Remove virtio queue_add from unrealize function - Cornelia [1] https://lkml.org/lkml/2019/6/12/624 [2] https://www.spinics.net/lists/kvm/msg149761.html [3] https://www.spinics.net/lists/kvm/msg153095.html [4] https://marc.info/?l=linux-kernel&m=153572228719237&w=2 [5] https://marc.info/?l=qemu-devel&m=153555721901824&w=2 [6] https://lists.oasis-open.org/archives/virtio-dev/201903/msg00083.html [7] https://lkml.org/lkml/2019/1/9/1191 Pankaj Gupta (3): virtio-pmem: add virtio device virtio-pmem: sync linux headers virtio-pci: proxy for virtio-pmem David Hildenbrand (4): virtio-pci: Allow to specify additional interfaces for the base type hmp: Handle virtio-pmem when printing memory device infos numa: Handle virtio-pmem in NUMA stats pc: Support for virtio-pmem-pci hmp.c | 27 ++- hw/i386/Kconfig | 1 hw/i386/pc.c | 72 ++++++++++ hw/virtio/Kconfig | 10 + hw/virtio/Makefile.objs | 2 hw/virtio/virtio-pci.c | 1 hw/virtio/virtio-pci.h | 1 hw/virtio/virtio-pmem-pci.c | 131 ++++++++++++++++++ hw/virtio/virtio-pmem-pci.h | 34 ++++ hw/virtio/virtio-pmem.c | 189 +++++++++++++++++++++++++++ include/hw/pci/pci.h | 1 include/hw/virtio/virtio-pmem.h | 49 +++++++ include/standard-headers/linux/virtio_ids.h | 1 include/standard-headers/linux/virtio_pmem.h | 35 +++++ numa.c | 24 +-- qapi/misc.json | 28 +++- 16 files changed, 580 insertions(+), 26 deletions(-) ----