diff mbox

qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back to non-accelerated mode

Message ID d9c105ea0909031031g463aa731j846dd73d4c158ebc@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dustin Kirkland Sept. 3, 2009, 5:31 p.m. UTC
qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
to non-accelerated mode

We're seeing segfaults on systems without access to /dev/kvm.  It
looks like the global kvm_allowed is being set just a little too late
in vl.c.  This patch moves the kvm initialization a bit higher in the
vl.c main, just after options processing, and solves the segfaults.
We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
upstream, or advise if and why this might not be the optimal solution.

Signed-off-by: Dustin Kirkland <kirkland@canonical.com>

Comments

Marcelo Tosatti Sept. 3, 2009, 7:55 p.m. UTC | #1
On Thu, Sep 03, 2009 at 12:31:33PM -0500, Dustin Kirkland wrote:
> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> to non-accelerated mode
> 
> We're seeing segfaults on systems without access to /dev/kvm.  It
> looks like the global kvm_allowed is being set just a little too late
> in vl.c.  This patch moves the kvm initialization a bit higher in the
> vl.c main, just after options processing, and solves the segfaults.
> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> upstream, or advise if and why this might not be the optimal solution.
> 
> Signed-off-by: Dustin Kirkland <kirkland@canonical.com>

Dustin,

I think its safer to move it just after fork() from -daemonize, to 
make sure no state initialized by kvm_init is lost in the child.

> Move the kvm_init() call a bit higher to fix a segfault when
> /dev/kvm is not available.  The kvm_allowed global needs
> to be set correctly a little earlier.
> 
> Signed-off-by: Dustin Kirkland <kirkland@canonical.com>
> 
> 
> --- qemu-kvm-0.11.0~rc1.orig/vl.c
> +++ qemu-kvm-0.11.0~rc1/vl.c
> @@ -5748,6 +5748,20 @@
>          }
>      }
>  
> +    if (kvm_enabled()) {
> +        int ret;
> +
> +        ret = kvm_init(smp_cpus);
> +        if (ret < 0) {
> +#if defined(KVM_UPSTREAM) || defined(NO_CPU_EMULATION)
> +            fprintf(stderr, "failed to initialize KVM\n");
> +            exit(1);
> +#endif
> +            fprintf(stderr, "Could not initialize KVM, will disable KVM support\n");
> +            kvm_allowed = 0;
> +        }
> +    }
> +
>      /* If no data_dir is specified then try to find it relative to the
>         executable path.  */
>      if (!data_dir) {
> @@ -6008,20 +6022,6 @@
>          }
>      }
>  
> -    if (kvm_enabled()) {
> -        int ret;
> -
> -        ret = kvm_init(smp_cpus);
> -        if (ret < 0) {
> -#if defined(KVM_UPSTREAM) || defined(NO_CPU_EMULATION)
> -            fprintf(stderr, "failed to initialize KVM\n");
> -            exit(1);
> -#endif
> -            fprintf(stderr, "Could not initialize KVM, will disable KVM support\n");
> -	     kvm_allowed = 0;
> -        }
> -    }
> -
>      if (monitor_device) {
>          monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
>          if (!monitor_hd) {

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark McLoughlin Sept. 3, 2009, 8:01 p.m. UTC | #2
On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> to non-accelerated mode
> 
> We're seeing segfaults on systems without access to /dev/kvm.  It
> looks like the global kvm_allowed is being set just a little too late
> in vl.c.  This patch moves the kvm initialization a bit higher in the
> vl.c main, just after options processing, and solves the segfaults.
> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> upstream, or advise if and why this might not be the optimal solution.

Ah discussion about an alternative fix for this fizzled out recently:

  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html

Cheers,
Mark.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luiz Capitulino Sept. 3, 2009, 8:05 p.m. UTC | #3
On Thu, 3 Sep 2009 12:31:33 -0500
Dustin Kirkland <kirkland@canonical.com> wrote:

> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> to non-accelerated mode
> 
> We're seeing segfaults on systems without access to /dev/kvm.  It
> looks like the global kvm_allowed is being set just a little too late
> in vl.c.  This patch moves the kvm initialization a bit higher in the
> vl.c main, just after options processing, and solves the segfaults.
> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> upstream, or advise if and why this might not be the optimal solution.
> 
> Signed-off-by: Dustin Kirkland <kirkland@canonical.com>

 Fixes the problem to me:

 Tested-by: Luiz Capitulino <lcapitulino@redhat.com>

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dustin Kirkland Sept. 3, 2009, 9:48 p.m. UTC | #4
On Thu, Sep 3, 2009 at 3:01 PM, Mark McLoughlin<markmc@redhat.com> wrote:
> On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
>> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
>> to non-accelerated mode
>>
>> We're seeing segfaults on systems without access to /dev/kvm.  It
>> looks like the global kvm_allowed is being set just a little too late
>> in vl.c.  This patch moves the kvm initialization a bit higher in the
>> vl.c main, just after options processing, and solves the segfaults.
>> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
>> upstream, or advise if and why this might not be the optimal solution.
>
> Ah discussion about an alternative fix for this fizzled out recently:
>
>  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html

Ah, thanks Mark.  In that thread, I found Daniel's suggestion the most
reasonable, and user-friendly:

On Mon, Jul 27, 2009 at 1:44 PM, Daniel P. Berrange<berrange@redhat.com> wrote:
> Well, we could go for logic like:
>
>  * No arg given          => try kvm, try kqemu, try tcg
>  * --accelmode arg given => try $arg, and fail if unavailable
>
> then libvirt would simply always supply --accelmode for all VMs,
> while people running qemu manually would get best available



:-Dustin
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Glauber Costa Sept. 3, 2009, 10:18 p.m. UTC | #5
On Thu, Sep 3, 2009 at 6:48 PM, Dustin Kirkland<kirkland@canonical.com> wrote:
> On Thu, Sep 3, 2009 at 3:01 PM, Mark McLoughlin<markmc@redhat.com> wrote:
>> On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
>>> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
>>> to non-accelerated mode
>>>
>>> We're seeing segfaults on systems without access to /dev/kvm.  It
>>> looks like the global kvm_allowed is being set just a little too late
>>> in vl.c.  This patch moves the kvm initialization a bit higher in the
>>> vl.c main, just after options processing, and solves the segfaults.
>>> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
>>> upstream, or advise if and why this might not be the optimal solution.
>>
>> Ah discussion about an alternative fix for this fizzled out recently:
>>
>>  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html
>
> Ah, thanks Mark.  In that thread, I found Daniel's suggestion the most
> reasonable, and user-friendly:
>
> On Mon, Jul 27, 2009 at 1:44 PM, Daniel P. Berrange<berrange@redhat.com> wrote:
>> Well, we could go for logic like:
>>
>>  * No arg given          => try kvm, try kqemu, try tcg
>>  * --accelmode arg given => try $arg, and fail if unavailable
>>
>> then libvirt would simply always supply --accelmode for all VMs,
>> while people running qemu manually would get best available
I sent some patches to do that, but they were incomplete, and I was
preempted by something else.
If you want, you can wait for my cycles to come back, or pick from where I left
Mark McLoughlin Sept. 4, 2009, 7:22 a.m. UTC | #6
On Thu, 2009-09-03 at 19:18 -0300, Glauber Costa wrote:
> On Thu, Sep 3, 2009 at 6:48 PM, Dustin Kirkland<kirkland@canonical.com> wrote:
> > On Thu, Sep 3, 2009 at 3:01 PM, Mark McLoughlin<markmc@redhat.com> wrote:
> >> On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
> >>> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> >>> to non-accelerated mode
> >>>
> >>> We're seeing segfaults on systems without access to /dev/kvm.  It
> >>> looks like the global kvm_allowed is being set just a little too late
> >>> in vl.c.  This patch moves the kvm initialization a bit higher in the
> >>> vl.c main, just after options processing, and solves the segfaults.
> >>> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> >>> upstream, or advise if and why this might not be the optimal solution.
> >>
> >> Ah discussion about an alternative fix for this fizzled out recently:
> >>
> >>  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html
> >
> > Ah, thanks Mark.  In that thread, I found Daniel's suggestion the most
> > reasonable, and user-friendly:
> >
> > On Mon, Jul 27, 2009 at 1:44 PM, Daniel P. Berrange<berrange@redhat.com> wrote:
> >> Well, we could go for logic like:
> >>
> >>  * No arg given          => try kvm, try kqemu, try tcg
> >>  * --accelmode arg given => try $arg, and fail if unavailable
> >>
> >> then libvirt would simply always supply --accelmode for all VMs,
> >> while people running qemu manually would get best available
> I sent some patches to do that, but they were incomplete, and I was
> preempted by something else.
> If you want, you can wait for my cycles to come back, or pick from where I left

In the meantime, can we commit to stable-0.11 either Dustin's fix or
this:

  http://git.et.redhat.com/?p=qemu-fedora.git;a=commitdiff;h=aa1620047b

Cheers,
Mark.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dustin Kirkland Sept. 4, 2009, 4:06 p.m. UTC | #7
On Fri, 2009-09-04 at 08:22 +0100, Mark McLoughlin wrote:
> On Thu, 2009-09-03 at 19:18 -0300, Glauber Costa wrote:
> > On Thu, Sep 3, 2009 at 6:48 PM, Dustin Kirkland<kirkland@canonical.com> wrote:
> > > On Thu, Sep 3, 2009 at 3:01 PM, Mark McLoughlin<markmc@redhat.com> wrote:
> > >> On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
> > >>> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> > >>> to non-accelerated mode
> > >>>
> > >>> We're seeing segfaults on systems without access to /dev/kvm.  It
> > >>> looks like the global kvm_allowed is being set just a little too late
> > >>> in vl.c.  This patch moves the kvm initialization a bit higher in the
> > >>> vl.c main, just after options processing, and solves the segfaults.
> > >>> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> > >>> upstream, or advise if and why this might not be the optimal solution.
> > >>
> > >> Ah discussion about an alternative fix for this fizzled out recently:
> > >>
> > >>  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html
> > >
> > > Ah, thanks Mark.  In that thread, I found Daniel's suggestion the most
> > > reasonable, and user-friendly:
> > >
> > > On Mon, Jul 27, 2009 at 1:44 PM, Daniel P. Berrange<berrange@redhat.com> wrote:
> > >> Well, we could go for logic like:
> > >>
> > >>  * No arg given          => try kvm, try kqemu, try tcg
> > >>  * --accelmode arg given => try $arg, and fail if unavailable
> > >>
> > >> then libvirt would simply always supply --accelmode for all VMs,
> > >> while people running qemu manually would get best available
> > I sent some patches to do that, but they were incomplete, and I was
> > preempted by something else.
> > If you want, you can wait for my cycles to come back, or pick from where I left

Thanks for the pointer, Glauber.  My cycles a bit constrained too, but
I'll have a look when I get a chance.

> In the meantime, can we commit to stable-0.11 either Dustin's fix or
> this:
> 
>   http://git.et.redhat.com/?p=qemu-fedora.git;a=commitdiff;h=aa1620047b

+1.  We're looking for something agreeable in stable-0.11, that solves
the segfault and proceeds without VT acceleration.
Marcelo Tosatti Sept. 4, 2009, 4:36 p.m. UTC | #8
On Fri, Sep 04, 2009 at 11:06:38AM -0500, Dustin Kirkland wrote:
> On Fri, 2009-09-04 at 08:22 +0100, Mark McLoughlin wrote:
> > On Thu, 2009-09-03 at 19:18 -0300, Glauber Costa wrote:
> > > On Thu, Sep 3, 2009 at 6:48 PM, Dustin Kirkland<kirkland@canonical.com> wrote:
> > > > On Thu, Sep 3, 2009 at 3:01 PM, Mark McLoughlin<markmc@redhat.com> wrote:
> > > >> On Thu, 2009-09-03 at 12:31 -0500, Dustin Kirkland wrote:
> > > >>> qemu-kvm: fix segfault when running kvm without /dev/kvm, falling back
> > > >>> to non-accelerated mode
> > > >>>
> > > >>> We're seeing segfaults on systems without access to /dev/kvm.  It
> > > >>> looks like the global kvm_allowed is being set just a little too late
> > > >>> in vl.c.  This patch moves the kvm initialization a bit higher in the
> > > >>> vl.c main, just after options processing, and solves the segfaults.
> > > >>> We're carrying this patch in Ubuntu 9.10 Alpha.  Please apply
> > > >>> upstream, or advise if and why this might not be the optimal solution.
> > > >>
> > > >> Ah discussion about an alternative fix for this fizzled out recently:
> > > >>
> > > >>  http://www.mail-archive.com/kvm@vger.kernel.org/msg19890.html
> > > >
> > > > Ah, thanks Mark.  In that thread, I found Daniel's suggestion the most
> > > > reasonable, and user-friendly:
> > > >
> > > > On Mon, Jul 27, 2009 at 1:44 PM, Daniel P. Berrange<berrange@redhat.com> wrote:
> > > >> Well, we could go for logic like:
> > > >>
> > > >>  * No arg given          => try kvm, try kqemu, try tcg
> > > >>  * --accelmode arg given => try $arg, and fail if unavailable
> > > >>
> > > >> then libvirt would simply always supply --accelmode for all VMs,
> > > >> while people running qemu manually would get best available
> > > I sent some patches to do that, but they were incomplete, and I was
> > > preempted by something else.
> > > If you want, you can wait for my cycles to come back, or pick from where I left
> 
> Thanks for the pointer, Glauber.  My cycles a bit constrained too, but
> I'll have a look when I get a chance.
> 
> > In the meantime, can we commit to stable-0.11 either Dustin's fix or
> > this:
> > 
> >   http://git.et.redhat.com/?p=qemu-fedora.git;a=commitdiff;h=aa1620047b
> 
> +1.  We're looking for something agreeable in stable-0.11, that solves
> the segfault and proceeds without VT acceleration.

Dustin,

Can you please resend the patch with the suggestion i made earlier, for
stable-0.11?


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Move the kvm_init() call a bit higher to fix a segfault when
/dev/kvm is not available.  The kvm_allowed global needs
to be set correctly a little earlier.

Signed-off-by: Dustin Kirkland <kirkland@canonical.com>


--- qemu-kvm-0.11.0~rc1.orig/vl.c
+++ qemu-kvm-0.11.0~rc1/vl.c
@@ -5748,6 +5748,20 @@ 
         }
     }
 
+    if (kvm_enabled()) {
+        int ret;
+
+        ret = kvm_init(smp_cpus);
+        if (ret < 0) {
+#if defined(KVM_UPSTREAM) || defined(NO_CPU_EMULATION)
+            fprintf(stderr, "failed to initialize KVM\n");
+            exit(1);
+#endif
+            fprintf(stderr, "Could not initialize KVM, will disable KVM support\n");
+            kvm_allowed = 0;
+        }
+    }
+
     /* If no data_dir is specified then try to find it relative to the
        executable path.  */
     if (!data_dir) {
@@ -6008,20 +6022,6 @@ 
         }
     }
 
-    if (kvm_enabled()) {
-        int ret;
-
-        ret = kvm_init(smp_cpus);
-        if (ret < 0) {
-#if defined(KVM_UPSTREAM) || defined(NO_CPU_EMULATION)
-            fprintf(stderr, "failed to initialize KVM\n");
-            exit(1);
-#endif
-            fprintf(stderr, "Could not initialize KVM, will disable KVM support\n");
-	     kvm_allowed = 0;
-        }
-    }
-
     if (monitor_device) {
         monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
         if (!monitor_hd) {