diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-06-05 06:55:18 +0000 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-06-05 06:55:18 +0000 |
| commit | 993a7c1ea28968a4479a87ad6c2637a7045d2d51 (patch) | |
| tree | 024d7266fc695c4f93ab6ce0fcd52326f3ac379d /results/classifier/108/other/2344 | |
| parent | 2773b5e236e2217a35a53dbc298757610c7bbbc6 (diff) | |
| download | emulator-bug-study-993a7c1ea28968a4479a87ad6c2637a7045d2d51.tar.gz emulator-bug-study-993a7c1ea28968a4479a87ad6c2637a7045d2d51.zip | |
add new classifier result
Diffstat (limited to 'results/classifier/108/other/2344')
| -rw-r--r-- | results/classifier/108/other/2344 | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/results/classifier/108/other/2344 b/results/classifier/108/other/2344 new file mode 100644 index 00000000..3636a69d --- /dev/null +++ b/results/classifier/108/other/2344 @@ -0,0 +1,60 @@ +performance: 0.878 +graphic: 0.855 +device: 0.758 +semantic: 0.758 +socket: 0.736 +PID: 0.661 +vnc: 0.630 +boot: 0.585 +network: 0.546 +files: 0.483 +debug: 0.462 +KVM: 0.412 +permissions: 0.388 +other: 0.185 + +Plugin scoreboard deadlock (plugin.lock vs start_exclusive) +Description of problem: +Deadlock + +In frame 9 the thread grabs the plugin.lock, and starts to wait for other cpus to enter exclusive idle. +``` +#7 0x00005555555a1295 in start_exclusive () at ../hw/core/cpu-common.c:199 +#8 plugin_grow_scoreboards__locked (cpu=0x7fff0c2b4720) at ../plugins/core.c:238 +#9 qemu_plugin_vcpu_init_hook (cpu=0x7fff0c2b4720) at ../plugins/core.c:258 +``` + +The other thread just finished a TB and do the callback to the plugin, so it will not become exclusive idle until it finishes. +That callback tries to create a new 'scoreboard', but plugin.lock is already taken. +``` +#7 qemu_plugin_scoreboard_new (element_size=element_size@entry=8) at ../plugins/api.c:464 +#8 0x00007ffff7fb973d in vcpu_tb_trans (id=<optimized out>, tb=0x555555858d60) at /home/rehn/source/qemu/contrib/plugins/hotblocks.c:125 +#9 0x00005555557394f1 in qemu_plugin_tb_trans_cb (cpu=<optimized out>, tb=0x555555858d60) at ../plugins/core.c:418 +``` + +Locally I'm using this fix, reverse order so we enter exclusive idle before grabbing the plugin.lock: +``` +diff --git a/plugins/core.c b/plugins/core.c +index 1e58a57bf1..0e41c4ef22 100644 +--- a/plugins/core.c ++++ b/plugins/core.c +@@ -236,4 +236,2 @@ static void plugin_grow_scoreboards__locked(CPUState *cpu) + +- /* cpus must be stopped, as tb might still use an existing scoreboard. */ +- start_exclusive(); + struct qemu_plugin_scoreboard *score; +@@ -244,3 +242,2 @@ static void plugin_grow_scoreboards__locked(CPUState *cpu) + tb_flush(cpu); +- end_exclusive(); + } +@@ -250,2 +247,4 @@ void qemu_plugin_vcpu_init_hook(CPUState *cpu) + bool success; ++ /* cpus must be stopped, as tb might still use an existing scoreboard. */ ++ start_exclusive(); + +@@ -259,2 +258,3 @@ void qemu_plugin_vcpu_init_hook(CPUState *cpu) + qemu_rec_mutex_unlock(&plugin.lock); ++ end_exclusive(); +``` +Steps to reproduce: +Run command a few times and get 'unlucky' |
