summaryrefslogtreecommitdiffstats
path: root/results/classifier/zero-shot-user-mode/output/instruction/1362635
diff options
context:
space:
mode:
Diffstat (limited to 'results/classifier/zero-shot-user-mode/output/instruction/1362635')
-rw-r--r--results/classifier/zero-shot-user-mode/output/instruction/136263548
1 files changed, 48 insertions, 0 deletions
diff --git a/results/classifier/zero-shot-user-mode/output/instruction/1362635 b/results/classifier/zero-shot-user-mode/output/instruction/1362635
new file mode 100644
index 00000000..2e1104a3
--- /dev/null
+++ b/results/classifier/zero-shot-user-mode/output/instruction/1362635
@@ -0,0 +1,48 @@
+instruction: 0.607
+runtime: 0.229
+syscall: 0.164
+
+
+
+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