summary refs log tree commit diff stats
path: root/results/classifier/gemma3:27b/runtime/1362635
diff options
context:
space:
mode:
Diffstat (limited to 'results/classifier/gemma3:27b/runtime/1362635')
-rw-r--r--results/classifier/gemma3:27b/runtime/136263545
1 files changed, 45 insertions, 0 deletions
diff --git a/results/classifier/gemma3:27b/runtime/1362635 b/results/classifier/gemma3:27b/runtime/1362635
new file mode 100644
index 00000000..9536b6de
--- /dev/null
+++ b/results/classifier/gemma3:27b/runtime/1362635
@@ -0,0 +1,45 @@
+
+
+
+bdrv_read co-routine re-entered recursively
+
+calling bdrv_read in a loop leads to the follwing situation:
+
+bs->drv->bdrv_aio_readv is called, and finally calls bdrv_co_io_em_complete in other thread context.
+there is a possibility of calling bdrv_co_io_em_complete before calling qemu_coroutine_yield in bdrv_co_io_em. And qemu fails with "co-routine re-entered recursively".
+
+static void bdrv_co_io_em_complete(void *opaque, int ret)
+{
+    CoroutineIOCompletion *co = opaque;
+
+    co->ret = ret;
+    qemu_coroutine_enter(co->coroutine, NULL);
+}
+
+static int coroutine_fn bdrv_co_io_em(BlockDriverState *bs, int64_t sector_num,
+                                      int nb_sectors, QEMUIOVector *iov,
+                                      bool is_write)
+{
+    CoroutineIOCompletion co = {
+        .coroutine = qemu_coroutine_self(),
+    };
+    BlockDriverAIOCB *acb;
+
+    if (is_write) {
+        acb = bs->drv->bdrv_aio_writev(bs, sector_num, iov, nb_sectors,
+                                       bdrv_co_io_em_complete, &co);
+    } else {
+        acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors,
+                                      bdrv_co_io_em_complete, &co);
+    }
+
+    trace_bdrv_co_io_em(bs, sector_num, nb_sectors, is_write, acb);
+    if (!acb) {
+        return -EIO;
+    }
+    qemu_coroutine_yield();
+
+    return co.ret;
+}
+
+is it a bug, or may be I don't understand something?
\ No newline at end of file