All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: [Qemu-devel] Re: [PATCH 1/2] Move KVM init to arch_init.c, compile  vl.c once
Date: Fri, 02 Apr 2010 17:01:18 +0200	[thread overview]
Message-ID: <4BB606BE.9000508@redhat.com> (raw)
In-Reply-To: <z2uf43fc5581004011327jfcf55ba6vc866442197896955@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1173 bytes --]

On 04/01/2010 10:27 PM, Blue Swirl wrote:
> It will not be safe to use kvm_enabled() in vl.c, so there needs to be
> a target dependent helper. The call to kvm_init could remain in vl.c,
> likewise it's not strictly needed to move kvm_allowed to arch_init.c.

Not really, because kvm_allowed _can_ be used from once-compiled files. 
  The attached patch makes kvm-all.c be compiled always, even if 
!CONFIG_KVM; functions that require kvm are almost always omitted for 
now (so checking kvm_enabled() is required to call them).  However, 
kvm_init is stubbed so that vl.c can call it.

In the future we could add more stubbing and ultimately do this 
unconditionally:

    #define kvm_enabled() kvm_allowed

With this patch vl.c can already be compiled once, but I did not include 
it because it would conflict with my balloon.c series; I'm doing enough 
rebasing these days.  Also, qemu-kvm is a bit behind qemu and all these 
patches are nightmares for the merges, so it's better IMO if things are 
left to calm down a bit.

> They just caused problems with the poisoning check in patch 2/2.

Poisoning kvm_enabled is right, but poisoning kvm_allowed is overkill.

Paolo

[-- Attachment #2: 0001-provide-a-stub-version-of-kvm-all.c-if-CONFIG_KVM.patch --]
[-- Type: text/plain, Size: 4689 bytes --]

From e9bd21893633365567b7c0d468a9971ab02e46f0 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Fri, 2 Apr 2010 09:29:54 +0200
Subject: [PATCH] provide a stub version of kvm-all.c if !CONFIG_KVM

This allows limited use of kvm functions (which will return ENOSYS)
even in once-compiled modules.  The patch also improves a bit the error
messages for KVM initialization.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 Makefile.target |    4 ++--
 kvm-all.c       |   16 ++++++++++++++--
 kvm.h           |    4 +++-
 vl.c            |   16 +++++++---------
 4 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index 167fc8d..3943de1 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -168,8 +168,8 @@ obj-y += virtio-blk.o virtio-balloon.o virtio-net.o virtio-pci.o virtio-serial-b
 obj-y += event_notifier.o
 obj-y += vhost_net.o
 obj-$(CONFIG_VHOST_NET) += vhost.o
-obj-y += rwhandler.o
-obj-$(CONFIG_KVM) += kvm.o kvm-all.o
+obj-y += rwhandler.o kvm-all.o
+obj-$(CONFIG_KVM) += kvm.o
 LIBS+=-lz
 
 QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
diff --git a/kvm-all.c b/kvm-all.c
index 7aa5e57..53f58a6 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -13,14 +13,16 @@
  *
  */
 
+#include "qemu-common.h"
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <stdarg.h>
 
+#ifdef CONFIG_KVM
 #include <linux/kvm.h>
+#endif
 
-#include "qemu-common.h"
 #include "qemu-barrier.h"
 #include "sysemu.h"
 #include "hw/hw.h"
@@ -73,6 +75,7 @@ struct KVMState
 
 static KVMState *kvm_state;
 
+#ifdef CONFIG_KVM
 static KVMSlot *kvm_alloc_slot(KVMState *s)
 {
     int i;
@@ -282,7 +285,7 @@ static int kvm_set_migration_log(int enable)
     return 0;
 }
 
-static int test_le_bit(unsigned long nr, unsigned char *addr)
+static inline int test_le_bit(unsigned long nr, unsigned char *addr)
 {
     return (addr[nr >> 3] >> (nr & 7)) & 1;
 }
@@ -561,9 +564,11 @@ static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
 	.sync_dirty_bitmap = kvm_client_sync_dirty_bitmap,
 	.migration_log = kvm_client_migration_log,
 };
+#endif
 
 int kvm_init(int smp_cpus)
 {
+#ifdef CONFIG_KVM
     static const char upgrade_note[] =
         "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
         "(see http://sourceforge.net/projects/kvm).\n";
@@ -683,8 +688,12 @@ err:
     qemu_free(s);
 
     return ret;
+#else
+    return -ENOSYS;
+#endif
 }
 
+#ifdef CONFIG_KVM
 static int kvm_handle_io(uint16_t port, void *data, int direction, int size,
                          uint32_t count)
 {
@@ -866,6 +875,7 @@ int kvm_cpu_exec(CPUState *env)
 
     return ret;
 }
+#endif
 
 int kvm_ioctl(KVMState *s, int type, ...)
 {
@@ -1139,6 +1149,7 @@ void kvm_remove_all_breakpoints(CPUState *current_env)
 }
 #endif /* !KVM_CAP_SET_GUEST_DEBUG */
 
+#ifdef CONFIG_KVM
 int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset)
 {
     struct kvm_signal_mask *sigmask;
@@ -1156,6 +1167,7 @@ int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset)
 
     return r;
 }
+#endif
 
 #ifdef KVM_IOEVENTFD
 int kvm_set_ioeventfd_pio_word(int fd, uint16_t addr, uint16_t val, bool assign)
diff --git a/kvm.h b/kvm.h
index 1e5be27..2477cfd 100644
--- a/kvm.h
+++ b/kvm.h
@@ -18,13 +18,15 @@
 #include <errno.h>
 #include "config-host.h"
 #include "qemu-queue.h"
+#include "cpu-common.h"
 
 #ifdef CONFIG_KVM
 #include <linux/kvm.h>
 #endif
 
-#ifdef CONFIG_KVM
 extern int kvm_allowed;
+
+#ifdef CONFIG_KVM
 #define kvm_enabled() (kvm_allowed)
 #else
 #define kvm_enabled() (0)
diff --git a/vl.c b/vl.c
index 6768cf1..9fe4682 100644
--- a/vl.c
+++ b/vl.c
@@ -3235,10 +3235,6 @@ int main(int argc, char **argv, char **envp)
                 do_smbios_option(optarg);
                 break;
             case QEMU_OPTION_enable_kvm:
-                if (!(kvm_available())) {
-                    printf("Option %s not supported for this target\n", popt->name);
-                    exit(1);
-                }
                 kvm_allowed = 1;
                 break;
             case QEMU_OPTION_usb:
@@ -3585,12 +3581,14 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
-    if (kvm_enabled()) {
-        int ret;
-
-        ret = kvm_init(smp_cpus);
+    if (kvm_allowed) {
+        int ret = kvm_init(smp_cpus);
         if (ret < 0) {
-            fprintf(stderr, "failed to initialize KVM\n");
+            if (!kvm_available()) {
+                printf("KVM not supported for this target\n");
+            } else {
+                fprintf(stderr, "failed to initialize KVM: %s\n", strerror(-ret));
+            }
             exit(1);
         }
     }
-- 
1.6.6.1


  reply	other threads:[~2010-04-02 15:01 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-01 20:07 [Qemu-devel] [PATCH 1/2] Move KVM init to arch_init.c, compile vl.c once Blue Swirl
2010-04-01 20:15 ` Anthony Liguori
2010-04-01 20:27   ` Blue Swirl
2010-04-02 15:01     ` Paolo Bonzini [this message]
2010-04-02 15:08       ` [Qemu-devel] " Anthony Liguori
2010-04-02 15:11         ` Paolo Bonzini
2010-04-02 15:20           ` Anthony Liguori
2010-04-02 16:01             ` Paolo Bonzini
2010-04-02 15:43         ` Blue Swirl
2010-04-01 20:23 ` Paolo Bonzini
2010-04-02 14:20   ` Blue Swirl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BB606BE.9000508@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.