[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5 7/9] block: don't make snapshots for filters
From: |
Pavel Dovgalyuk |
Subject: |
Re: [Qemu-devel] [PATCH v5 7/9] block: don't make snapshots for filters |
Date: |
Wed, 16 Nov 2016 16:50:58 +0300 |
> From: Paolo Bonzini [mailto:address@hidden
> > I've investigated this issue.
> > This command line works ok:
> > -drive
> >
> > driver=blkreplay,if=none,image.driver=file,image.filename=testdisk.qcow,id=img-blkreplay
> > -device ide-hd,drive=img-blkreplay
> >
> > And this does not:
> > -drive
> >
> driver=blkreplay,if=none,image.driver=qcow2,image.file.driver=file,image.file.filename=testdis
> k.qcow
> > ,id=img-blkreplay
> > -device ide-hd,drive=img-blkreplay
> >
> > QEMU hangs at some moment of replay.
> >
> > I found that some dma requests do not pass through the blkreplay driver
> > due to the following line in block-backend.c:
> > return bdrv_co_preadv(blk->root, offset, bytes, qiov, flags);
> >
> > This line passes read request directly to qcow driver and blkreplay cannot
> > process it to make deterministic.
>
> I don't understand, blk->root should be the blkreplay here.
I've got some more logs. I used the disk image which references the backing
file.
It seems that some weird things happen with both command lines.
== For the first command line (blkreplay separated from image):
blk_co_preadv(img-blkreplay)
-> bdrv_co_preadv(qcow2, temp_overlay1)
-> bdrv_co_preadv(blkreplay, temp_overlay)
-> bdrv_co_preadv(qcow2, temp_overlay2)
-> bdrv_co_preadv(qcow2, image_overlay)
-> bdrv_co_preadv(qcow2, image_backing)
-> bdrv_co_preadv(file, image_backing)
But sometimes it changes to:
blk_co_preadv(img-blkreplay)
-> bdrv_co_preadv(qcow2, temp_overlay1)
-> bdrv_co_preadv(file, temp_overlay1)
== For the second command line (blkreplay combined with image):
In most cases we have the following call stack:
blk_co_preadv(img-blkreplay)
-> bdrv_co_preadv(qcow2, temp_overlay)
-> bdrv_co_preadv(blkreplay, image_overlay)
-> bdrv_co_preadv(qcow2, image_overlay)
-> bdrv_co_preadv(qcow2, image_backing)
-> bdrv_co_preadv(file, image_backing)
But sometimes it changes to:
blk_co_preadv(img-blkreplay)
-> bdrv_co_preadv(qcow2, temp overlay)
-> bdrv_co_preadv(file, temp overlay)
========
It seems, that temporary overlay is created over blkreplay, which
it intended to work as a simple filter. Is that correct?
Pavel Dovgalyuk