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.
[1] https://lkml.org/lkml/2019/5/21/569
[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 | 190 +++++++++++++++++++++++++++
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, 581 insertions(+), 26 deletions(-)
----
P.S: Sending this patch series before going for vacations, please
expect a delay in response.