| 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 712523210d..54c465520d 100644 |
| |
| |
| @@ -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; |