|
|
5544c1 |
From e688bfbda0f6893b08d1e51f4fb26d4b38e922d4 Mon Sep 17 00:00:00 2001
|
|
|
5544c1 |
From: Christian Borntraeger <borntraeger@de.ibm.com>
|
|
|
5544c1 |
Date: Fri, 10 Aug 2012 15:11:45 +0200
|
|
|
5544c1 |
Subject: [PATCH] qemu: Use valgrind annotations to mark kvm guest memory as
|
|
|
5544c1 |
defined
|
|
|
5544c1 |
|
|
|
5544c1 |
valgrind with kvm produces a big amount of false positives regarding
|
|
|
5544c1 |
"Conditional jump or move depends on uninitialised value(s)". This
|
|
|
5544c1 |
happens because the guest memory is allocated with qemu_vmalloc which
|
|
|
5544c1 |
boils down posix_memalign etc. This function is (correctly) considered
|
|
|
5544c1 |
by valgrind as returning undefined memory.
|
|
|
5544c1 |
|
|
|
5544c1 |
Since valgrind is based on jitting code, it will not be able to see
|
|
|
5544c1 |
changes made by the guest to guest memory if this is done by KVM_RUN,
|
|
|
5544c1 |
thus keeping most of the guest memory undefined.
|
|
|
5544c1 |
|
|
|
5544c1 |
Now lots of places in qemu will then use guest memory to change behaviour.
|
|
|
5544c1 |
To avoid the flood of these messages, lets declare the whole guest
|
|
|
5544c1 |
memory as defined. This will reduce the noise and allows us to see real
|
|
|
5544c1 |
problems.
|
|
|
5544c1 |
|
|
|
5544c1 |
In the future we might want to make this conditional, since there
|
|
|
5544c1 |
is actually something that we can use those false positives for:
|
|
|
5544c1 |
These messages will point to code that depends on guest memory, so
|
|
|
5544c1 |
we can use these backtraces to actually make an audit that is focussed
|
|
|
5544c1 |
only at those code places. For normal development we dont want to
|
|
|
5544c1 |
see those messages, though.
|
|
|
5544c1 |
|
|
|
5544c1 |
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
|
|
|
5544c1 |
Signed-off-by: Avi Kivity <avi@redhat.com>
|
|
|
5544c1 |
(cherry picked from commit 62fe83318d2fc5b31f473d66326910d94c1c4907)
|
|
|
5544c1 |
|
|
|
5544c1 |
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
|
|
|
5544c1 |
---
|
|
|
5544c1 |
configure | 3 ++-
|
|
|
5544c1 |
kvm-all.c | 7 +++++++
|
|
|
5544c1 |
2 files changed, 9 insertions(+), 1 deletion(-)
|
|
|
5544c1 |
|
|
|
5544c1 |
diff --git a/configure b/configure
|
|
|
5544c1 |
index d7a948f..8874eff 100755
|
|
|
5544c1 |
--- a/configure
|
|
|
5544c1 |
+++ b/configure
|
|
|
5544c1 |
@@ -2937,11 +2937,12 @@ if compile_prog "-Werror" "" ; then
|
|
|
5544c1 |
fi
|
|
|
5544c1 |
|
|
|
5544c1 |
########################################
|
|
|
5544c1 |
-# check if we have valgrind/valgrind.h
|
|
|
5544c1 |
+# check if we have valgrind/valgrind.h and valgrind/memcheck.h
|
|
|
5544c1 |
|
|
|
5544c1 |
valgrind_h=no
|
|
|
5544c1 |
cat > $TMPC << EOF
|
|
|
5544c1 |
#include <valgrind/valgrind.h>
|
|
|
5544c1 |
+#include <valgrind/memcheck.h>
|
|
|
5544c1 |
int main(void) {
|
|
|
5544c1 |
return 0;
|
|
|
5544c1 |
}
|
|
|
5544c1 |
diff --git a/kvm-all.c b/kvm-all.c
|
|
|
5544c1 |
index badf1d8..90c71f9 100644
|
|
|
5544c1 |
--- a/kvm-all.c
|
|
|
5544c1 |
+++ b/kvm-all.c
|
|
|
5544c1 |
@@ -39,6 +39,10 @@
|
|
|
5544c1 |
#include <sys/eventfd.h>
|
|
|
5544c1 |
#endif
|
|
|
5544c1 |
|
|
|
5544c1 |
+#ifdef CONFIG_VALGRIND_H
|
|
|
5544c1 |
+#include <valgrind/memcheck.h>
|
|
|
5544c1 |
+#endif
|
|
|
5544c1 |
+
|
|
|
5544c1 |
/* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
|
|
|
5544c1 |
#define PAGE_SIZE TARGET_PAGE_SIZE
|
|
|
5544c1 |
|
|
|
5544c1 |
@@ -1769,6 +1773,9 @@ void *kvm_vmalloc(ram_addr_t size)
|
|
|
5544c1 |
|
|
|
5544c1 |
void kvm_setup_guest_memory(void *start, size_t size)
|
|
|
5544c1 |
{
|
|
|
5544c1 |
+#ifdef CONFIG_VALGRIND_H
|
|
|
5544c1 |
+ VALGRIND_MAKE_MEM_DEFINED(start, size);
|
|
|
5544c1 |
+#endif
|
|
|
5544c1 |
if (!kvm_has_sync_mmu()) {
|
|
|
5544c1 |
int ret = qemu_madvise(start, size, QEMU_MADV_DONTFORK);
|
|
|
5544c1 |
|
|
|
5544c1 |
--
|
|
|
5544c1 |
1.7.12.1
|
|
|
5544c1 |
|