From 5378725f1156bc3f7d75e054f3c3ad61d0b79e93 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Fri, 21 Feb 2020 15:34:53 +0000 Subject: [PATCH] qemu: add pmem flag to memory-backend-file According to QEMU's nvdimm documentation: When 'pmem' is 'on' and QEMU is built with libpmem support, QEMU will take necessary operations to guarantee the persistence of its own writes to the vNVDIMM backend. Signed-off-by: Julio Montes --- qemu/qmp.go | 13 +++++++++++-- qemu/qmp_test.go | 7 ++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/qemu/qmp.go b/qemu/qmp.go index 83ac94a043..bf9a77dda1 100644 --- a/qemu/qmp.go +++ b/qemu/qmp.go @@ -1428,8 +1428,9 @@ func (q *QMP) ExecHotplugMemory(ctx context.Context, qomtype, id, mempath string // a NVDIMM driver with the device_add command. // id is the id of the device to add. It must be a valid QMP identifier. // mempath is the path of the device to add, e.g., /dev/rdb0. size is -// the data size of the device. -func (q *QMP) ExecuteNVDIMMDeviceAdd(ctx context.Context, id, mempath string, size int64) error { +// the data size of the device. pmem is to guarantee the persistence of QEMU writes +// to the vNVDIMM backend. +func (q *QMP) ExecuteNVDIMMDeviceAdd(ctx context.Context, id, mempath string, size int64, pmem *bool) error { args := map[string]interface{}{ "qom-type": "memory-backend-file", "id": "nvdimmbackmem" + id, @@ -1439,6 +1440,14 @@ func (q *QMP) ExecuteNVDIMMDeviceAdd(ctx context.Context, id, mempath string, si "share": true, }, } + + if q.version.Major > 4 || (q.version.Major == 4 && q.version.Minor >= 1) { + if pmem != nil { + props := args["props"].(map[string]interface{}) + props["pmem"] = *pmem + } + } + err := q.executeCommand(ctx, "object-add", args, nil) if err != nil { return err diff --git a/qemu/qmp_test.go b/qemu/qmp_test.go index c7b9c9e4d2..5bc909fd47 100644 --- a/qemu/qmp_test.go +++ b/qemu/qmp_test.go @@ -1617,7 +1617,12 @@ func TestExecuteNVDIMMDeviceAdd(t *testing.T) { cfg := QMPConfig{Logger: qmpTestLogger{}} q := startQMPLoop(buf, cfg, connectedCh, disconnectedCh) checkVersion(t, connectedCh) - err := q.ExecuteNVDIMMDeviceAdd(context.Background(), "nvdimm0", "/dev/rbd0", 1024) + q.version = &QMPVersion{ + Major: 4, + Minor: 1, + } + pmem := true + err := q.ExecuteNVDIMMDeviceAdd(context.Background(), "nvdimm0", "/dev/rbd0", 1024, &pmem) if err != nil { t.Fatalf("Unexpected error: %v", err) }