You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.1 KiB
55 lines
2.1 KiB
From fa2237b9987c39147704274937895547c8c8d647 Mon Sep 17 00:00:00 2001 |
|
From: Andrew Jones <drjones@redhat.com> |
|
Date: Tue, 31 Mar 2015 11:08:13 +0200 |
|
Subject: [PATCH] ARM: detect-virt: detect QEMU/KVM |
|
|
|
QEMU/KVM guests do not have hypervisor nodes, but they do have |
|
fw-cfg nodes (since qemu v2.3.0-rc0). fw-cfg nodes are documented, |
|
see kernel doc Documentation/devicetree/bindings/arm/fw-cfg.txt, |
|
and therefore we should be able to rely on it in this detection. |
|
|
|
Unfortunately, we currently don't have enough information in the |
|
DT, or elsewhere, to determine if we're using KVM acceleration |
|
with QEMU or not, so we can only report 'qemu' at this time, even |
|
if KVM is in use. This shouldn't really matter in practice though, |
|
because if detect-virt is used interactively it will be clear to |
|
the user whether or not KVM acceleration is present by the overall |
|
speed of the guest. If used by a script, then the script's behavior |
|
should not change whether it's 'qemu' or 'kvm'. QEMU emulated |
|
guests and QEMU/KVM guests of the same type should behave |
|
identically, only the speed at which they run should differ. |
|
|
|
Cherry-picked from: ce09c71d56a11 |
|
Resolves: #1207773 |
|
--- |
|
src/shared/virt.c | 17 +++++++++++++++++ |
|
1 file changed, 17 insertions(+) |
|
|
|
diff --git a/src/shared/virt.c b/src/shared/virt.c |
|
index 712523210..54c465520 100644 |
|
--- a/src/shared/virt.c |
|
+++ b/src/shared/virt.c |
|
@@ -115,6 +115,23 @@ static int detect_vm_devicetree(const char **_id) { |
|
*_id = "xen"; |
|
return 1; |
|
} |
|
+ } else if (r == -ENOENT) { |
|
+ _cleanup_closedir_ DIR *dir = NULL; |
|
+ struct dirent *dent; |
|
+ |
|
+ dir = opendir("/proc/device-tree"); |
|
+ if (!dir) { |
|
+ if (errno == ENOENT) |
|
+ return 0; |
|
+ return -errno; |
|
+ } |
|
+ |
|
+ FOREACH_DIRENT(dent, dir, return -errno) { |
|
+ if (strstr(dent->d_name, "fw-cfg")) { |
|
+ *_id = "qemu"; |
|
+ return 1; |
|
+ } |
|
+ } |
|
} |
|
#endif |
|
return 0;
|
|
|