mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
Block pull request
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJTxTFNAAoJEJykq7OBq3PIti0IALlbGEfEjysUSmKbmnhJg5pH MoEkGJ8FZ7nIaaLfKPfVIzc5oeZVTWrtyckJLuLdxGOA1BYGXMQ/41Qs64UyT6NA TIFE9nZX6h5hQrLXt9u0O6smpkq7wt7M9a3RhVxUZ27Rujf8q+8V2KmgdEy8tchq vesyeDXBBx/G6tDGQey7WoRq1s6NafdNm9V0V8pkhonQ3uVErqhz5ZAaTV0zDZIr 7CreUitr0XPsMx+FIAwEsRcFxw1uD5c5LQVWzBtNJUTMIjcmhauXH8YkreDYCJVY 4Q555XvMGbEe/4OTqfhq5LI065uTpwYC1cvM16rVksa7KN25salupUn2MBVTbOI= =dnaT -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging Block pull request # gpg: Signature made Tue 15 Jul 2014 14:49:01 BST using RSA key ID 81AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" * remotes/stefanha/tags/block-pull-request: virtio-blk: dataplane: notify guest as a batch virtio-blk: data-plane: fix save/set .complete_request in start linux-aio: Fix laio resource leak Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
2c65ebe646
2 changed files with 28 additions and 4 deletions
|
@ -310,5 +310,10 @@ void laio_cleanup(void *s_)
|
||||||
struct qemu_laio_state *s = s_;
|
struct qemu_laio_state *s = s_;
|
||||||
|
|
||||||
event_notifier_cleanup(&s->e);
|
event_notifier_cleanup(&s->e);
|
||||||
|
|
||||||
|
if (io_destroy(s->ctx) != 0) {
|
||||||
|
fprintf(stderr, "%s: destroy AIO context %p failed\n",
|
||||||
|
__func__, &s->ctx);
|
||||||
|
}
|
||||||
g_free(s);
|
g_free(s);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ struct VirtIOBlockDataPlane {
|
||||||
VirtIODevice *vdev;
|
VirtIODevice *vdev;
|
||||||
Vring vring; /* virtqueue vring */
|
Vring vring; /* virtqueue vring */
|
||||||
EventNotifier *guest_notifier; /* irq */
|
EventNotifier *guest_notifier; /* irq */
|
||||||
|
QEMUBH *bh; /* bh for guest notification */
|
||||||
|
|
||||||
/* Note that these EventNotifiers are assigned by value. This is
|
/* Note that these EventNotifiers are assigned by value. This is
|
||||||
* fine as long as you do not call event_notifier_cleanup on them
|
* fine as long as you do not call event_notifier_cleanup on them
|
||||||
|
@ -61,13 +62,28 @@ static void notify_guest(VirtIOBlockDataPlane *s)
|
||||||
event_notifier_set(s->guest_notifier);
|
event_notifier_set(s->guest_notifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void notify_guest_bh(void *opaque)
|
||||||
|
{
|
||||||
|
VirtIOBlockDataPlane *s = opaque;
|
||||||
|
|
||||||
|
notify_guest(s);
|
||||||
|
}
|
||||||
|
|
||||||
static void complete_request_vring(VirtIOBlockReq *req, unsigned char status)
|
static void complete_request_vring(VirtIOBlockReq *req, unsigned char status)
|
||||||
{
|
{
|
||||||
|
VirtIOBlockDataPlane *s = req->dev->dataplane;
|
||||||
stb_p(&req->in->status, status);
|
stb_p(&req->in->status, status);
|
||||||
|
|
||||||
vring_push(&req->dev->dataplane->vring, &req->elem,
|
vring_push(&req->dev->dataplane->vring, &req->elem,
|
||||||
req->qiov.size + sizeof(*req->in));
|
req->qiov.size + sizeof(*req->in));
|
||||||
notify_guest(req->dev->dataplane);
|
|
||||||
|
/* Suppress notification to guest by BH and its scheduled
|
||||||
|
* flag because requests are completed as a batch after io
|
||||||
|
* plug & unplug is introduced, and the BH can still be
|
||||||
|
* executed in dataplane aio context even after it is
|
||||||
|
* stopped, so needn't worry about notification loss with BH.
|
||||||
|
*/
|
||||||
|
qemu_bh_schedule(s->bh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_notify(EventNotifier *e)
|
static void handle_notify(EventNotifier *e)
|
||||||
|
@ -125,7 +141,6 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
VirtIOBlockDataPlane *s;
|
VirtIOBlockDataPlane *s;
|
||||||
VirtIOBlock *vblk = VIRTIO_BLK(vdev);
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
||||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||||
|
@ -173,13 +188,12 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
|
||||||
s->iothread = &s->internal_iothread_obj;
|
s->iothread = &s->internal_iothread_obj;
|
||||||
}
|
}
|
||||||
s->ctx = iothread_get_aio_context(s->iothread);
|
s->ctx = iothread_get_aio_context(s->iothread);
|
||||||
|
s->bh = aio_bh_new(s->ctx, notify_guest_bh, s);
|
||||||
|
|
||||||
error_setg(&s->blocker, "block device is in use by data plane");
|
error_setg(&s->blocker, "block device is in use by data plane");
|
||||||
bdrv_op_block_all(blk->conf.bs, s->blocker);
|
bdrv_op_block_all(blk->conf.bs, s->blocker);
|
||||||
|
|
||||||
*dataplane = s;
|
*dataplane = s;
|
||||||
s->saved_complete_request = vblk->complete_request;
|
|
||||||
vblk->complete_request = complete_request_vring;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Context: QEMU global mutex held */
|
/* Context: QEMU global mutex held */
|
||||||
|
@ -193,6 +207,7 @@ void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s)
|
||||||
bdrv_op_unblock_all(s->blk->conf.bs, s->blocker);
|
bdrv_op_unblock_all(s->blk->conf.bs, s->blocker);
|
||||||
error_free(s->blocker);
|
error_free(s->blocker);
|
||||||
object_unref(OBJECT(s->iothread));
|
object_unref(OBJECT(s->iothread));
|
||||||
|
qemu_bh_delete(s->bh);
|
||||||
g_free(s);
|
g_free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +216,7 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
|
||||||
{
|
{
|
||||||
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s->vdev)));
|
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(s->vdev)));
|
||||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||||
|
VirtIOBlock *vblk = VIRTIO_BLK(s->vdev);
|
||||||
VirtQueue *vq;
|
VirtQueue *vq;
|
||||||
|
|
||||||
if (s->started) {
|
if (s->started) {
|
||||||
|
@ -234,6 +250,9 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
|
||||||
}
|
}
|
||||||
s->host_notifier = *virtio_queue_get_host_notifier(vq);
|
s->host_notifier = *virtio_queue_get_host_notifier(vq);
|
||||||
|
|
||||||
|
s->saved_complete_request = vblk->complete_request;
|
||||||
|
vblk->complete_request = complete_request_vring;
|
||||||
|
|
||||||
s->starting = false;
|
s->starting = false;
|
||||||
s->started = true;
|
s->started = true;
|
||||||
trace_virtio_blk_data_plane_start(s);
|
trace_virtio_blk_data_plane_start(s);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue