提交 9dc44aa5 编写于 作者: D Daniel P. Berrange 提交者: Stefan Hajnoczi

os: don't corrupt pre-existing memory-backend data with prealloc

When using a memory-backend object with prealloc turned on, QEMU
will memset() the first byte in every memory page to zero. While
this might have been acceptable for memory backends associated
with RAM, this corrupts application data for NVDIMMs.

Instead of setting every page to zero, read the current byte
value and then just write that same value back, so we are not
corrupting the original data. Directly write the value instead
of memset()ing it, since there's no benefit to memset for a
single byte write.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
Reviewed-by: NAndrea Arcangeli <aarcange@redhat.com>
Message-id: 20170303113255.28262-1-berrange@redhat.com
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 d84f714e
......@@ -361,7 +361,19 @@ static void *do_touch_pages(void *arg)
memset_thread_failed = true;
} else {
for (i = 0; i < numpages; i++) {
memset(addr, 0, 1);
/*
* Read & write back the same value, so we don't
* corrupt existing user/app data that might be
* stored.
*
* 'volatile' to stop compiler optimizing this away
* to a no-op
*
* TODO: get a better solution from kernel so we
* don't need to write at all so we don't cause
* wear on the storage backing the region...
*/
*(volatile char *)addr = *addr;
addr += hpagesize;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册