diff mbox

Fix segfault with ram_size > 4095M without kvm

Message ID 20101208160110.1b0c7c64@doriath
State New
Headers show

Commit Message

Luiz Capitulino Dec. 8, 2010, 6:01 p.m. UTC
Currently, x86_64-softmmu qemu segfaults when trying to use > 4095M memsize.
This patch adds a simple check and error message (much like the 2047 limit on
32-bit hosts) on ram_size in the control path after we determine we're
not using kvm

Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
the segfault there as well.

Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
NOTE: this patch was applied in the v0.12.x branch, but it seems it got
      lost for master

 vl.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

Comments

Anthony Liguori Dec. 8, 2010, 6:23 p.m. UTC | #1
On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> This patch adds a simple check and error message (much like the 2047 limit on
> 32-bit hosts) on ram_size in the control path after we determine we're
> not using kvm
>
> Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> the segfault there as well.
>
> Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> ---
> NOTE: this patch was applied in the v0.12.x branch, but it seems it got
>        lost for master
>    

No, it was intentional.  We should fix the segv, this is not a known 
limitation but rather a bug.

Regards,

Anthony Liguori

>   vl.c |    6 ++++++
>   1 files changed, 6 insertions(+), 0 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 2dbb6db..bb9c21c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -5792,6 +5792,12 @@ int main(int argc, char **argv, char **envp)
>               fprintf(stderr, "failed to initialize KVM\n");
>               exit(1);
>           }
> +    } else {
> +        /* without kvm enabled, we can only support 4095 MB RAM */
> +        if (ram_size>  (4095UL<<  20)) {
> +            fprintf(stderr, "qemu: without kvm support at most 4095 MB RAM can be simulated\n");
> +            exit(1);
> +        }
>       }
>
>       if (qemu_init_main_loop()) {
>
Luiz Capitulino Dec. 8, 2010, 6:27 p.m. UTC | #2
On Wed, 08 Dec 2010 12:23:12 -0600
Anthony Liguori <aliguori@linux.vnet.ibm.com> wrote:

> On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> > Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> > This patch adds a simple check and error message (much like the 2047 limit on
> > 32-bit hosts) on ram_size in the control path after we determine we're
> > not using kvm
> >
> > Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> > the segfault there as well.
> >
> > Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> > ---
> > NOTE: this patch was applied in the v0.12.x branch, but it seems it got
> >        lost for master
> >    
> 
> No, it was intentional.  We should fix the segv, this is not a known 
> limitation but rather a bug.

A TCG bug, I presume?

> 
> Regards,
> 
> Anthony Liguori
> 
> >   vl.c |    6 ++++++
> >   1 files changed, 6 insertions(+), 0 deletions(-)
> >
> > diff --git a/vl.c b/vl.c
> > index 2dbb6db..bb9c21c 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -5792,6 +5792,12 @@ int main(int argc, char **argv, char **envp)
> >               fprintf(stderr, "failed to initialize KVM\n");
> >               exit(1);
> >           }
> > +    } else {
> > +        /* without kvm enabled, we can only support 4095 MB RAM */
> > +        if (ram_size>  (4095UL<<  20)) {
> > +            fprintf(stderr, "qemu: without kvm support at most 4095 MB RAM can be simulated\n");
> > +            exit(1);
> > +        }
> >       }
> >
> >       if (qemu_init_main_loop()) {
> >    
>
Anthony Liguori Dec. 8, 2010, 6:30 p.m. UTC | #3
On 12/08/2010 12:27 PM, Luiz Capitulino wrote:
> On Wed, 08 Dec 2010 12:23:12 -0600
> Anthony Liguori<aliguori@linux.vnet.ibm.com>  wrote:
>
>    
>> On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
>>      
>>> Currently, x86_64-softmmu qemu segfaults when trying to use>   4095M memsize.
>>> This patch adds a simple check and error message (much like the 2047 limit on
>>> 32-bit hosts) on ram_size in the control path after we determine we're
>>> not using kvm
>>>
>>> Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
>>> the segfault there as well.
>>>
>>> Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
>>> Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
>>> ---
>>> NOTE: this patch was applied in the v0.12.x branch, but it seems it got
>>>         lost for master
>>>
>>>        
>> No, it was intentional.  We should fix the segv, this is not a known
>> limitation but rather a bug.
>>      
> A TCG bug, I presume?
>    

Dunno, that's why we shouldn't just paper over it.

Regards,

Anthony Liguori

>    
>> Regards,
>>
>> Anthony Liguori
>>
>>      
>>>    vl.c |    6 ++++++
>>>    1 files changed, 6 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/vl.c b/vl.c
>>> index 2dbb6db..bb9c21c 100644
>>> --- a/vl.c
>>> +++ b/vl.c
>>> @@ -5792,6 +5792,12 @@ int main(int argc, char **argv, char **envp)
>>>                fprintf(stderr, "failed to initialize KVM\n");
>>>                exit(1);
>>>            }
>>> +    } else {
>>> +        /* without kvm enabled, we can only support 4095 MB RAM */
>>> +        if (ram_size>   (4095UL<<   20)) {
>>> +            fprintf(stderr, "qemu: without kvm support at most 4095 MB RAM can be simulated\n");
>>> +            exit(1);
>>> +        }
>>>        }
>>>
>>>        if (qemu_init_main_loop()) {
>>>
>>>        
>>      
>
Aurelien Jarno Dec. 25, 2010, 10:35 p.m. UTC | #4
On Wed, Dec 08, 2010 at 04:27:45PM -0200, Luiz Capitulino wrote:
> On Wed, 08 Dec 2010 12:23:12 -0600
> Anthony Liguori <aliguori@linux.vnet.ibm.com> wrote:
> 
> > On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> > > Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> > > This patch adds a simple check and error message (much like the 2047 limit on
> > > 32-bit hosts) on ram_size in the control path after we determine we're
> > > not using kvm
> > >
> > > Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> > > the segfault there as well.
> > >
> > > Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> > > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> > > ---
> > > NOTE: this patch was applied in the v0.12.x branch, but it seems it got
> > >        lost for master
> > >    
> > 
> > No, it was intentional.  We should fix the segv, this is not a known 
> > limitation but rather a bug.
> 
> A TCG bug, I presume?
> 

Do you have more details about this issue and how to reproduce it? 

Support for more than 4GB of memory has been added a few years ago, 
and I am not able to reproduce the problem anymore (I have booted a 
64-bit guest with 6GB of RAM, and make sure the guest use the whole 
memory). I guess TCG itself is fine, but there might be a bug in
the MMU emulation in some cases.

I also noticed that now i386-softmmu has been artificially limited to
2047MB. Tthis configuration used to support up to 64GB of RAM (PAE)
on 64-bit hosts.
Ryan Harper Jan. 4, 2011, 3:49 p.m. UTC | #5
* Aurelien Jarno <aurelien@aurel32.net> [2010-12-25 16:37]:
> On Wed, Dec 08, 2010 at 04:27:45PM -0200, Luiz Capitulino wrote:
> > On Wed, 08 Dec 2010 12:23:12 -0600
> > Anthony Liguori <aliguori@linux.vnet.ibm.com> wrote:
> > 
> > > On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> > > > Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> > > > This patch adds a simple check and error message (much like the 2047 limit on
> > > > 32-bit hosts) on ram_size in the control path after we determine we're
> > > > not using kvm
> > > >
> > > > Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> > > > the segfault there as well.
> > > >
> > > > Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> > > > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> > > > ---
> > > > NOTE: this patch was applied in the v0.12.x branch, but it seems it got
> > > >        lost for master
> > > >    
> > > 
> > > No, it was intentional.  We should fix the segv, this is not a known 
> > > limitation but rather a bug.
> > 
> > A TCG bug, I presume?
> > 
> 
> Do you have more details about this issue and how to reproduce it? 

At the time of the bug, it was something simple like:

qemu-system-x86_64 -m 4097 -hda /dev/null

we'd get an imediate segfault.  As you say, I'm not seeing it now on
current git; I'll see about bisecting to see if we did get a fix for the
issue.

> 
> Support for more than 4GB of memory has been added a few years ago, 
> and I am not able to reproduce the problem anymore (I have booted a 
> 64-bit guest with 6GB of RAM, and make sure the guest use the whole 
> memory). I guess TCG itself is fine, but there might be a bug in
> the MMU emulation in some cases.
> 
> I also noticed that now i386-softmmu has been artificially limited to
> 2047MB. Tthis configuration used to support up to 64GB of RAM (PAE)
> on 64-bit hosts.
> 
> -- 
> Aurelien Jarno                          GPG: 1024D/F1BCDB73
> aurelien@aurel32.net                 http://www.aurel33.net
Ryan Harper Jan. 5, 2011, 7:04 p.m. UTC | #6
* Ryan Harper <ryanh@us.ibm.com> [2011-01-04 09:49]:
> * Aurelien Jarno <aurelien@aurel32.net> [2010-12-25 16:37]:
> > On Wed, Dec 08, 2010 at 04:27:45PM -0200, Luiz Capitulino wrote:
> > > On Wed, 08 Dec 2010 12:23:12 -0600
> > > Anthony Liguori <aliguori@linux.vnet.ibm.com> wrote:
> > > 
> > > > On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> > > > > Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> > > > > This patch adds a simple check and error message (much like the 2047 limit on
> > > > > 32-bit hosts) on ram_size in the control path after we determine we're
> > > > > not using kvm
> > > > >
> > > > > Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> > > > > the segfault there as well.
> > > > >
> > > > > Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> > > > > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> > > > > ---
> > > > > NOTE: this patch was applied in the v0.12.x branch, but it seems it got
> > > > >        lost for master
> > > > >    
> > > > 
> > > > No, it was intentional.  We should fix the segv, this is not a known 
> > > > limitation but rather a bug.
> > > 
> > > A TCG bug, I presume?
> > > 
> > 
> > Do you have more details about this issue and how to reproduce it? 
> 
> At the time of the bug, it was something simple like:
> 
> qemu-system-x86_64 -m 4097 -hda /dev/null
> 
> we'd get an imediate segfault.  As you say, I'm not seeing it now on
> current git; I'll see about bisecting to see if we did get a fix for the
> issue.

I attempted to bisect, but there a couple commits around where the issue
was fixed that broke git bisect =(  That narrowed it down to about 5
commits to check.

This the last git commit where I can reproduce the segfault with the
above test case (qemu invocation).

commit 0aef4261ac0ec9089ade0e3a92f986cb4ba7317e
Author: Aurelien Jarno <aurelien@aurel32.net>
Date:   Thu Mar 11 21:29:42 2010 +0100

    target-ppc: fix evsrwu and evsrws (second try)
    
    Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>


The next 4 commits don't compile so they are untest-able:

commit 14f24e1465edc44b9b4d89fbbea66e06088154e1
 - fails to build with:
    - ./configure --target-list=x86_64-softmmu && make clean && make
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
/home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
/home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
make[1]: *** [exec.o] Error 1
make: *** [subdir-x86_64-softmmu] Error 2

commit 7bc7b099dfa38a856b1bc892c0f9f3d6fe28e170
 - fails to build with:
    - ./configure --target-list=x86_64-softmmu && make clean && make
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
/home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
/home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
make[1]: *** [exec.o] Error 1
make: *** [subdir-x86_64-softmmu] Error 2

commit b9f83121a13153536d886305414b540460c34508
 - fails to build with:
    - ./configure --target-list=x86_64-softmmu && make clean && make
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
/home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
/home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
make[1]: *** [exec.o] Error 1
make: *** [subdir-x86_64-softmmu] Error 2

commit 5270589032f450ae7c3448730855aa18ff68ccff
 - fails to build with:
    - ./configure --target-list=x86_64-softmmu && make clean && make
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
/home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
/home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
/home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
make[1]: *** [exec.o] Error 1
make: *** [subdir-x86_64-softmmu] Error 2


And this commit compiles and the test case no longer segfaults.  So I'd
say things are fixed at this point.

commit 5cd2c5b6ad75c46d40118ac67c0c09d4e7930a65
- compiles and issue is no longer present.
    - ./configure --target-list=x86_64-softmmu && make clean && make &&
    sudo x86_64-softmmu/qemu-syem-x86_64 -L pc-bios -hda /dev/null -m 4097
Aurelien Jarno Jan. 6, 2011, 2:48 p.m. UTC | #7
On Wed, Jan 05, 2011 at 01:04:51PM -0600, Ryan Harper wrote:
> * Ryan Harper <ryanh@us.ibm.com> [2011-01-04 09:49]:
> > * Aurelien Jarno <aurelien@aurel32.net> [2010-12-25 16:37]:
> > > On Wed, Dec 08, 2010 at 04:27:45PM -0200, Luiz Capitulino wrote:
> > > > On Wed, 08 Dec 2010 12:23:12 -0600
> > > > Anthony Liguori <aliguori@linux.vnet.ibm.com> wrote:
> > > > 
> > > > > On 12/08/2010 12:01 PM, Luiz Capitulino wrote:
> > > > > > Currently, x86_64-softmmu qemu segfaults when trying to use>  4095M memsize.
> > > > > > This patch adds a simple check and error message (much like the 2047 limit on
> > > > > > 32-bit hosts) on ram_size in the control path after we determine we're
> > > > > > not using kvm
> > > > > >
> > > > > > Upstream qemu-kvm is affected if using the -no-kvm option; this patch address
> > > > > > the segfault there as well.
> > > > > >
> > > > > > Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
> > > > > > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> > > > > > ---
> > > > > > NOTE: this patch was applied in the v0.12.x branch, but it seems it got
> > > > > >        lost for master
> > > > > >    
> > > > > 
> > > > > No, it was intentional.  We should fix the segv, this is not a known 
> > > > > limitation but rather a bug.
> > > > 
> > > > A TCG bug, I presume?
> > > > 
> > > 
> > > Do you have more details about this issue and how to reproduce it? 
> > 
> > At the time of the bug, it was something simple like:
> > 
> > qemu-system-x86_64 -m 4097 -hda /dev/null
> > 
> > we'd get an imediate segfault.  As you say, I'm not seeing it now on
> > current git; I'll see about bisecting to see if we did get a fix for the
> > issue.
> 
> I attempted to bisect, but there a couple commits around where the issue
> was fixed that broke git bisect =(  That narrowed it down to about 5
> commits to check.
> 
> This the last git commit where I can reproduce the segfault with the
> above test case (qemu invocation).
> 
> commit 0aef4261ac0ec9089ade0e3a92f986cb4ba7317e
> Author: Aurelien Jarno <aurelien@aurel32.net>
> Date:   Thu Mar 11 21:29:42 2010 +0100
> 
>     target-ppc: fix evsrwu and evsrws (second try)
>     
>     Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> 
> 
> The next 4 commits don't compile so they are untest-able:
> 
> commit 14f24e1465edc44b9b4d89fbbea66e06088154e1
>  - fails to build with:
>     - ./configure --target-list=x86_64-softmmu && make clean && make
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
> /home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
> /home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> make[1]: *** [exec.o] Error 1
> make: *** [subdir-x86_64-softmmu] Error 2
> 
> commit 7bc7b099dfa38a856b1bc892c0f9f3d6fe28e170
>  - fails to build with:
>     - ./configure --target-list=x86_64-softmmu && make clean && make
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
> /home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
> /home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> make[1]: *** [exec.o] Error 1
> make: *** [subdir-x86_64-softmmu] Error 2
> 
> commit b9f83121a13153536d886305414b540460c34508
>  - fails to build with:
>     - ./configure --target-list=x86_64-softmmu && make clean && make
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
> /home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
> /home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> make[1]: *** [exec.o] Error 1
> make: *** [subdir-x86_64-softmmu] Error 2
> 
> commit 5270589032f450ae7c3448730855aa18ff68ccff
>  - fails to build with:
>     - ./configure --target-list=x86_64-softmmu && make clean && make
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_find_alloc':
> /home/rharper/work/git/qemu/exec.c:341: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> /home/rharper/work/git/qemu/exec.c: In function 'phys_page_for_each':
> /home/rharper/work/git/qemu/exec.c:1670: error: #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
> make[1]: *** [exec.o] Error 1
> make: *** [subdir-x86_64-softmmu] Error 2
> 
> 
> And this commit compiles and the test case no longer segfaults.  So I'd
> say things are fixed at this point.
> 
> commit 5cd2c5b6ad75c46d40118ac67c0c09d4e7930a65
> - compiles and issue is no longer present.
>     - ./configure --target-list=x86_64-softmmu && make clean && make &&
>     sudo x86_64-softmmu/qemu-syem-x86_64 -L pc-bios -hda /dev/null -m 4097
> 

It's more likely this commit which fixes the bug.
diff mbox

Patch

diff --git a/vl.c b/vl.c
index 2dbb6db..bb9c21c 100644
--- a/vl.c
+++ b/vl.c
@@ -5792,6 +5792,12 @@  int main(int argc, char **argv, char **envp)
             fprintf(stderr, "failed to initialize KVM\n");
             exit(1);
         }
+    } else {
+        /* without kvm enabled, we can only support 4095 MB RAM */
+        if (ram_size > (4095UL << 20)) {
+            fprintf(stderr, "qemu: without kvm support at most 4095 MB RAM can be simulated\n");
+            exit(1);
+        }
     }
 
     if (qemu_init_main_loop()) {