qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* Core dump happened when starting a VM on arm64 server
@ 2020-06-11  8:46 Haibo Xu
  2020-06-11  9:14 ` Andrew Jones
  0 siblings, 1 reply; 7+ messages in thread
From: Haibo Xu @ 2020-06-11  8:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: drjones, qemu-arm

Hi,

I met a qemu core dump issue when starting a VM with cpu feature
"pmu=on" on an arm server.
The commands to start the machine is:

  ./qemu-system-aarch64 \
           -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
-m 2048M \
           -kernel ./Image \
           -initrd /boot/initrd.img-5.6.0-rc2+ \
           -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
           -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
           -device virtio-blk-device,drive=hd0


And here is the stack dump:

 Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
virt,accel=kvm,gic-version=3 -nograph'.
 Program terminated with signal SIGSEGV, Segmentation fault.
 #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
/root/Downloads/qemu-git/accel/kvm/kvm-all.c:2509
 2509        ret = ioctl(s->fd, type, arg);
 [Current thread is 1 (Thread 0xffffa5108010 (LWP 22057))]
 (gdb) bt
 #0  0x0000aaaadc432950 in kvm_ioctl (s=0x0, type=type@entry=44547) at
/root/Downloads/qemu-git/accel/kvm/kvm-all.c:2509
 #1  0x0000aaaadc432adc in kvm_check_extension (s=<optimized out>,
extension=extension@entry=126) at
/root/Downloads/qemu-git/accel/kvm/kvm-all.c:866
 #2  0x0000aaaadc541ff0 in kvm_arm_pmu_supported (cpu=<optimized out>)
at /root/Downloads/qemu-git/target/arm/kvm.c:212
 #3  0x0000aaaadc53a08c in arm_set_pmu (obj=<optimized out>,
value=<optimized out>, errp=0xfffff2fba6b0) at
/root/Downloads/qemu-git/target/arm/cpu.c:1113
 #4  0x0000aaaadc88facc in property_set_bool (obj=0xaaab0b61a0f0,
v=<optimized out>, name=<optimized out>, opaque=0xaaab0b627690,
errp=0xfffff2fba6b0)
     at /root/Downloads/qemu-git/qom/object.c:2162
 #5  0x0000aaaadc892af4 in object_property_parse
(obj=obj@entry=0xaaab0b61a0f0, string=<optimized out>,
name=0xaaab0b527d00 "pmu", errp=errp@entry=0xfffff2fba6b0)
     at /root/Downloads/qemu-git/qom/object.c:1552
 #6  0x0000aaaadc892bbc in object_apply_global_props
(obj=0xaaab0b61a0f0, props=0xaaab0b473a60, errp=0xaaaadd003930
<error_fatal>)
     at /root/Downloads/qemu-git/qom/object.c:410
 #7  0x0000aaaadc891a64 in object_post_init_with_type
(ti=0xaaab0b20e9f0, obj=0xaaab0b61a0f0) at
/root/Downloads/qemu-git/qom/object.c:383
 #8  0x0000aaaadc891a64 in object_initialize_with_type
(data=data@entry=0xaaab0b61a0f0, size=<optimized out>,
type=type@entry=0xaaab0b212a40)
     at /root/Downloads/qemu-git/qom/object.c:517
 #9  0x0000aaaadc891ba4 in object_new_with_type (type=0xaaab0b212a40)
at /root/Downloads/qemu-git/qom/object.c:681
 #10 0x0000aaaadc4bfd10 in machvirt_init (machine=0xaaaadd003930
<error_fatal>) at /root/Downloads/qemu-git/hw/arm/virt.c:1804
 #11 0x0000aaaadc69ec5c in machine_run_board_init
(machine=0xaaab0b47e950) at
/root/Downloads/qemu-git/hw/core/machine.c:1132
 #12 0x0000aaaadc51f50c in qemu_init (argc=<optimized out>,
argv=<optimized out>, envp=<optimized out>) at
/root/Downloads/qemu-git/softmmu/vl.c:4347
 #13 0x0000aaaadc3d2abc in main (argc=<optimized out>, argv=<optimized
out>, envp=<optimized out>) at
/root/Downloads/qemu-git/softmmu/main.c:48
 (gdb)


The root cause is in the arm_get_pmu() operation which was introduced
in ae502508f83.
After deleting the KVM feature probe operation in this function, the
issue can be fixed.

 diff --git a/target/arm/cpu.c b/target/arm/cpu.c
 index 3801e25b79..ff18db8fd4 100644
 --- a/target/arm/cpu.c
 +++ b/target/arm/cpu.c
 @@ -1110,10 +1110,6 @@ static void arm_set_pmu(Object *obj, bool
value, Error **errp)
      ARMCPU *cpu = ARM_CPU(obj);

      if (value) {
 -        if (kvm_enabled() && !kvm_arm_pmu_supported(CPU(cpu))) {
 -            error_setg(errp, "'pmu' feature not supported by KVM on
this host");
 -            return;
 -        }
          set_feature(&cpu->env, ARM_FEATURE_PMU);
      } else {
          unset_feature(&cpu->env, ARM_FEATURE_PMU);


According to the Qemu document(docs/system/arm/cpu-features.rst), the
pmu is turned on by default when using KVM mode on a V8 host machine,
which means the pmu=on is redundant when starting a VM with PMU support.

  target/arm/kvm64.c
  672     /*
  673      * We can assume any KVM supporting CPU is at least a v8
  674      * with VFPv4+Neon; this in turn implies most of the other
  675      * feature bits.
  676      */
  677     features |= 1ULL << ARM_FEATURE_V8;
  678     features |= 1ULL << ARM_FEATURE_NEON;
  679     features |= 1ULL << ARM_FEATURE_AARCH64;
  680     features |= 1ULL << ARM_FEATURE_PMU;
  681     features |= 1ULL << ARM_FEATURE_GENERIC_TIMER;

But I think we need a better way to handle this when "pmu=on" is
present in the command line, not just trigger a core dump(qemu binary
was built from the current master branch).
Any comments?

Regards,
Haibo


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-11  8:46 Core dump happened when starting a VM on arm64 server Haibo Xu
@ 2020-06-11  9:14 ` Andrew Jones
  2020-06-17  8:23   ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Jones @ 2020-06-11  9:14 UTC (permalink / raw)
  To: Haibo Xu, philmd; +Cc: qemu-arm, qemu-devel

On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
> Hi,
> 
> I met a qemu core dump issue when starting a VM with cpu feature
> "pmu=on" on an arm server.
> The commands to start the machine is:
> 
>   ./qemu-system-aarch64 \
>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
> -m 2048M \
>            -kernel ./Image \
>            -initrd /boot/initrd.img-5.6.0-rc2+ \
>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
>            -device virtio-blk-device,drive=hd0
> 
> 
> And here is the stack dump:
> 
>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
> virt,accel=kvm,gic-version=3 -nograph'.
>  Program terminated with signal SIGSEGV, Segmentation fault.
>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at

s=0x0 means cpu->kvm_state is NULL

> The root cause is in the arm_get_pmu() operation which was introduced
> in ae502508f83.

Actually the root cause is d70c996df23f ("target/arm/kvm: Use
CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
to work. d70c996df23f changed that saying that "KVMState is already
accessible via CPUState::kvm_state, use it.", but I'm not sure why,
since kvm_init_vcpu() doesn't run until the vcpu thread is created.

Philippe?

Thanks,
drew



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-11  9:14 ` Andrew Jones
@ 2020-06-17  8:23   ` Philippe Mathieu-Daudé
  2020-06-17 10:32     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-17  8:23 UTC (permalink / raw)
  To: Andrew Jones, Haibo Xu; +Cc: qemu-arm, qemu-devel

On 6/11/20 11:14 AM, Andrew Jones wrote:
> On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
>> Hi,
>>
>> I met a qemu core dump issue when starting a VM with cpu feature
>> "pmu=on" on an arm server.
>> The commands to start the machine is:
>>
>>   ./qemu-system-aarch64 \
>>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
>> -m 2048M \
>>            -kernel ./Image \
>>            -initrd /boot/initrd.img-5.6.0-rc2+ \
>>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
>>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
>>            -device virtio-blk-device,drive=hd0
>>
>>
>> And here is the stack dump:
>>
>>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
>> virt,accel=kvm,gic-version=3 -nograph'.
>>  Program terminated with signal SIGSEGV, Segmentation fault.
>>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
> 
> s=0x0 means cpu->kvm_state is NULL
> 
>> The root cause is in the arm_get_pmu() operation which was introduced
>> in ae502508f83.
> 
> Actually the root cause is d70c996df23f ("target/arm/kvm: Use
> CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
> the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
> to work. d70c996df23f changed that saying that "KVMState is already
> accessible via CPUState::kvm_state, use it.", but I'm not sure why,
> since kvm_init_vcpu() doesn't run until the vcpu thread is created.
> 
> Philippe?

Sorry for some reason I missed this email. I'll look at this today.

> 
> Thanks,
> drew
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-17  8:23   ` Philippe Mathieu-Daudé
@ 2020-06-17 10:32     ` Philippe Mathieu-Daudé
  2020-06-17 10:42       ` Thomas Huth
                         ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-17 10:32 UTC (permalink / raw)
  To: Andrew Jones, Haibo Xu
  Cc: Markus Armbruster, Thomas Huth, qemu-arm, qemu-devel, Eduardo Habkost

On 6/17/20 10:23 AM, Philippe Mathieu-Daudé wrote:
> On 6/11/20 11:14 AM, Andrew Jones wrote:
>> On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
>>> Hi,
>>>
>>> I met a qemu core dump issue when starting a VM with cpu feature
>>> "pmu=on" on an arm server.
>>> The commands to start the machine is:
>>>
>>>   ./qemu-system-aarch64 \
>>>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
>>> -m 2048M \
>>>            -kernel ./Image \
>>>            -initrd /boot/initrd.img-5.6.0-rc2+ \
>>>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
>>>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
>>>            -device virtio-blk-device,drive=hd0
>>>
>>>
>>> And here is the stack dump:
>>>
>>>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
>>> virt,accel=kvm,gic-version=3 -nograph'.
>>>  Program terminated with signal SIGSEGV, Segmentation fault.
>>>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
>>
>> s=0x0 means cpu->kvm_state is NULL
>>
>>> The root cause is in the arm_get_pmu() operation which was introduced
>>> in ae502508f83.
>>
>> Actually the root cause is d70c996df23f ("target/arm/kvm: Use
>> CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
>> the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
>> to work. d70c996df23f changed that saying that "KVMState is already
>> accessible via CPUState::kvm_state, use it.", but I'm not sure why,
>> since kvm_init_vcpu() doesn't run until the vcpu thread is created.
>>
>> Philippe?
> 
> Sorry for some reason I missed this email. I'll look at this today.

Quick reproducer:

$ qemu-system-aarch64 -cpu host,pmu=on -M virt,accel=kvm,gic-version=3
Segmentation fault (core dumped)

Eduardo, I thought we had a 'machine' qtest testing for various
combination of properties, but I can't find it, do you remember?
Or maybe it was Thomas? Or Markus? =)

> 
>>
>> Thanks,
>> drew
>>
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-17 10:32     ` Philippe Mathieu-Daudé
@ 2020-06-17 10:42       ` Thomas Huth
  2020-06-17 12:19       ` Andrew Jones
  2020-06-17 13:11       ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 7+ messages in thread
From: Thomas Huth @ 2020-06-17 10:42 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Andrew Jones, Haibo Xu
  Cc: Markus Armbruster, qemu-arm, qemu-devel, Eduardo Habkost

On 17/06/2020 12.32, Philippe Mathieu-Daudé wrote:
> On 6/17/20 10:23 AM, Philippe Mathieu-Daudé wrote:
>> On 6/11/20 11:14 AM, Andrew Jones wrote:
>>> On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
>>>> Hi,
>>>>
>>>> I met a qemu core dump issue when starting a VM with cpu feature
>>>> "pmu=on" on an arm server.
>>>> The commands to start the machine is:
>>>>
>>>>   ./qemu-system-aarch64 \
>>>>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
>>>> -m 2048M \
>>>>            -kernel ./Image \
>>>>            -initrd /boot/initrd.img-5.6.0-rc2+ \
>>>>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
>>>>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
>>>>            -device virtio-blk-device,drive=hd0
>>>>
>>>>
>>>> And here is the stack dump:
>>>>
>>>>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
>>>> virt,accel=kvm,gic-version=3 -nograph'.
>>>>  Program terminated with signal SIGSEGV, Segmentation fault.
>>>>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
>>>
>>> s=0x0 means cpu->kvm_state is NULL
>>>
>>>> The root cause is in the arm_get_pmu() operation which was introduced
>>>> in ae502508f83.
>>>
>>> Actually the root cause is d70c996df23f ("target/arm/kvm: Use
>>> CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
>>> the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
>>> to work. d70c996df23f changed that saying that "KVMState is already
>>> accessible via CPUState::kvm_state, use it.", but I'm not sure why,
>>> since kvm_init_vcpu() doesn't run until the vcpu thread is created.
>>>
>>> Philippe?
>>
>> Sorry for some reason I missed this email. I'll look at this today.
> 
> Quick reproducer:
> 
> $ qemu-system-aarch64 -cpu host,pmu=on -M virt,accel=kvm,gic-version=3
> Segmentation fault (core dumped)
> 
> Eduardo, I thought we had a 'machine' qtest testing for various
> combination of properties, but I can't find it, do you remember?
> Or maybe it was Thomas? Or Markus? =)

You probably remember the scripts/device-crash-test script? ... that's
a) only testing -device options as far as I know, and b) is not run
automatically during "make check", so it certainly is not suitable to
detect these kind of errors automatically.

 Thomas



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-17 10:32     ` Philippe Mathieu-Daudé
  2020-06-17 10:42       ` Thomas Huth
@ 2020-06-17 12:19       ` Andrew Jones
  2020-06-17 13:11       ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 7+ messages in thread
From: Andrew Jones @ 2020-06-17 12:19 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Thomas Huth, Eduardo Habkost, Markus Armbruster, qemu-devel,
	qemu-arm, Haibo Xu

On Wed, Jun 17, 2020 at 12:32:09PM +0200, Philippe Mathieu-Daudé wrote:
> On 6/17/20 10:23 AM, Philippe Mathieu-Daudé wrote:
> > On 6/11/20 11:14 AM, Andrew Jones wrote:
> >> On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
> >>> Hi,
> >>>
> >>> I met a qemu core dump issue when starting a VM with cpu feature
> >>> "pmu=on" on an arm server.
> >>> The commands to start the machine is:
> >>>
> >>>   ./qemu-system-aarch64 \
> >>>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
> >>> -m 2048M \
> >>>            -kernel ./Image \
> >>>            -initrd /boot/initrd.img-5.6.0-rc2+ \
> >>>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
> >>>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
> >>>            -device virtio-blk-device,drive=hd0
> >>>
> >>>
> >>> And here is the stack dump:
> >>>
> >>>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
> >>> virt,accel=kvm,gic-version=3 -nograph'.
> >>>  Program terminated with signal SIGSEGV, Segmentation fault.
> >>>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
> >>
> >> s=0x0 means cpu->kvm_state is NULL
> >>
> >>> The root cause is in the arm_get_pmu() operation which was introduced
> >>> in ae502508f83.
> >>
> >> Actually the root cause is d70c996df23f ("target/arm/kvm: Use
> >> CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
> >> the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
> >> to work. d70c996df23f changed that saying that "KVMState is already
> >> accessible via CPUState::kvm_state, use it.", but I'm not sure why,
> >> since kvm_init_vcpu() doesn't run until the vcpu thread is created.
> >>
> >> Philippe?
> > 
> > Sorry for some reason I missed this email. I'll look at this today.
> 
> Quick reproducer:
> 
> $ qemu-system-aarch64 -cpu host,pmu=on -M virt,accel=kvm,gic-version=3
> Segmentation fault (core dumped)
> 
> Eduardo, I thought we had a 'machine' qtest testing for various
> combination of properties, but I can't find it, do you remember?
> Or maybe it was Thomas? Or Markus? =)

For arm cpu properties we have tests/qtest/arm-cpu-features. We can
add a regression test for this and other properties there. I just
tried it. I needed to add a new macro (see below), but otherwise it
worked to reproduce the problem.

Thanks,
drew

diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
index 469217367661..d6bdbc171893 100644
--- a/tests/qtest/arm-cpu-features.c
+++ b/tests/qtest/arm-cpu-features.c
@@ -159,16 +159,35 @@ static bool resp_get_feature(QDict *resp, const char *feature)
     qobject_unref(_resp);                                              \
 })
 
-#define assert_feature(qts, cpu_type, feature, expected_value)         \
+#define resp_assert_feature(resp, feature, expected_value)             \
 ({                                                                     \
-    QDict *_resp, *_props;                                             \
+    QDict *_props;                                                     \
                                                                        \
-    _resp = do_query_no_props(qts, cpu_type);                          \
     g_assert(_resp);                                                   \
     g_assert(resp_has_props(_resp));                                   \
     _props = resp_get_props(_resp);                                    \
     g_assert(qdict_get(_props, feature));                              \
     g_assert(qdict_get_bool(_props, feature) == (expected_value));     \
+})
+
+#define assert_feature(qts, cpu_type, feature, expected_value)         \
+({                                                                     \
+    QDict *_resp;                                                      \
+                                                                       \
+    _resp = do_query_no_props(qts, cpu_type);                          \
+    g_assert(_resp);                                                   \
+    resp_assert_feature(_resp, feature, expected_value);               \
+    qobject_unref(_resp);                                              \
+})
+
+#define assert_set_feature(qts, cpu_type, feature, value)              \
+({                                                                     \
+    const char *_fmt = (value) ? "{ %s: true }" : "{ %s: false }";     \
+    QDict *_resp;                                                      \
+                                                                       \
+    _resp = do_query(qts, cpu_type, _fmt, feature);                    \
+    g_assert(_resp);                                                   \
+    resp_assert_feature(_resp, feature, value);                        \
     qobject_unref(_resp);                                              \
 })
 
@@ -464,7 +483,10 @@ static void test_query_cpu_model_expansion_kvm(const void *data)
         return;
     }
 
+    /* Enabling and disabling kvm-no-adjvtime should always work. */
     assert_has_feature_disabled(qts, "host", "kvm-no-adjvtime");
+    assert_set_feature(qts, "host", "kvm-no-adjvtime", true);
+    assert_set_feature(qts, "host", "kvm-no-adjvtime", false);
 
     if (g_str_equal(qtest_get_arch(), "aarch64")) {
         bool kvm_supports_sve;
@@ -475,7 +497,11 @@ static void test_query_cpu_model_expansion_kvm(const void *data)
         char *error;
 
         assert_has_feature_enabled(qts, "host", "aarch64");
+
+        /* Enabling and disabling pmu should always work. */
         assert_has_feature_enabled(qts, "host", "pmu");
+        assert_set_feature(qts, "host", "pmu", true);
+        assert_set_feature(qts, "host", "pmu", false);
 
         assert_error(qts, "cortex-a15",
             "We cannot guarantee the CPU type 'cortex-a15' works "



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: Core dump happened when starting a VM on arm64 server
  2020-06-17 10:32     ` Philippe Mathieu-Daudé
  2020-06-17 10:42       ` Thomas Huth
  2020-06-17 12:19       ` Andrew Jones
@ 2020-06-17 13:11       ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-17 13:11 UTC (permalink / raw)
  To: Andrew Jones, Haibo Xu
  Cc: Markus Armbruster, Thomas Huth, qemu-arm, qemu-devel, Eduardo Habkost

On 6/17/20 12:32 PM, Philippe Mathieu-Daudé wrote:
> On 6/17/20 10:23 AM, Philippe Mathieu-Daudé wrote:
>> On 6/11/20 11:14 AM, Andrew Jones wrote:
>>> On Thu, Jun 11, 2020 at 04:46:45PM +0800, Haibo Xu wrote:
>>>> Hi,
>>>>
>>>> I met a qemu core dump issue when starting a VM with cpu feature
>>>> "pmu=on" on an arm server.
>>>> The commands to start the machine is:
>>>>
>>>>   ./qemu-system-aarch64 \
>>>>            -cpu host,pmu=on -M virt,accel=kvm,gic-version=3 -nographic
>>>> -m 2048M \
>>>>            -kernel ./Image \
>>>>            -initrd /boot/initrd.img-5.6.0-rc2+ \
>>>>            -append "root=/dev/vda rw console=ttyAMA0" -nodefaults -serial stdio\
>>>>            -drive if=none,file=./xenial.rootfs.ext4,id=hd0,format=raw \
>>>>            -device virtio-blk-device,drive=hd0
>>>>
>>>>
>>>> And here is the stack dump:
>>>>
>>>>  Core was generated by `./qemu-system-aarch64 -cpu host,pmu=on -M
>>>> virt,accel=kvm,gic-version=3 -nograph'.
>>>>  Program terminated with signal SIGSEGV, Segmentation fault.
>>>>  #0  kvm_ioctl (s=0x0, type=type@entry=44547) at
>>>
>>> s=0x0 means cpu->kvm_state is NULL
>>>
>>>> The root cause is in the arm_get_pmu() operation which was introduced
>>>> in ae502508f83.
>>>
>>> Actually the root cause is d70c996df23f ("target/arm/kvm: Use
>>> CPUState::kvm_state in kvm_arm_pmu_supported()"). ae502508f83 used
>>> the machine kvm_state, not the cpu kvm_state, and that allows pmu=on
>>> to work. d70c996df23f changed that saying that "KVMState is already
>>> accessible via CPUState::kvm_state, use it.", but I'm not sure why,
>>> since kvm_init_vcpu() doesn't run until the vcpu thread is created.
>>>
>>> Philippe?
>>
>> Sorry for some reason I missed this email. I'll look at this today.
> 
> Quick reproducer:
> 
> $ qemu-system-aarch64 -cpu host,pmu=on -M virt,accel=kvm,gic-version=3
> Segmentation fault (core dumped)

Fix sent:
https://www.mail-archive.com/qemu-devel@nongnu.org/msg713249.html



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-06-17 13:12 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-11  8:46 Core dump happened when starting a VM on arm64 server Haibo Xu
2020-06-11  9:14 ` Andrew Jones
2020-06-17  8:23   ` Philippe Mathieu-Daudé
2020-06-17 10:32     ` Philippe Mathieu-Daudé
2020-06-17 10:42       ` Thomas Huth
2020-06-17 12:19       ` Andrew Jones
2020-06-17 13:11       ` Philippe Mathieu-Daudé

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).