All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] barriers: block layer preparations
Date: Tue, 5 May 2009 14:08:17 +0200	[thread overview]
Message-ID: <20090505120817.GA30721@lst.de> (raw)
In-Reply-To: <20090505120804.GA30651@lst.de>

Add a flag to BlockDriverState to advertise barriers support, and add a flags
argument to bdrv_aio_readv/writev to allow passing down the barrier flag.

Note that the flags argument to bdrv_aio_readv is for now actually superflous
because write barriers obviously only apply to writes.  I kept the read side
argument so the API is symmetric and we can easily add more flags to both
of them.


Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/block-qcow.c
===================================================================
--- qemu.orig/block-qcow.c	2009-04-26 16:38:30.509074899 +0200
+++ qemu/block-qcow.c	2009-05-05 11:29:11.545784130 +0200
@@ -587,7 +587,7 @@ static void qcow_aio_read_cb(void *opaqu
             acb->hd_iov.iov_len = acb->n * 512;
             qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
             acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
-                &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
+                &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb, 0);
             if (acb->hd_aiocb == NULL)
                 goto done;
         } else {
@@ -612,7 +612,7 @@ static void qcow_aio_read_cb(void *opaqu
         qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
         acb->hd_aiocb = bdrv_aio_readv(s->hd,
                             (acb->cluster_offset >> 9) + index_in_cluster,
-                            &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
+                            &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb, 0);
         if (acb->hd_aiocb == NULL)
             goto done;
     }
@@ -630,7 +630,7 @@ done:
 
 static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     QCowAIOCB *acb;
 
@@ -708,7 +708,7 @@ static void qcow_aio_write_cb(void *opaq
     acb->hd_aiocb = bdrv_aio_writev(s->hd,
                                     (cluster_offset >> 9) + index_in_cluster,
                                     &acb->hd_qiov, acb->n,
-                                    qcow_aio_write_cb, acb);
+                                    qcow_aio_write_cb, acb, 0);
     if (acb->hd_aiocb == NULL)
         goto done;
     return;
@@ -722,7 +722,7 @@ done:
 
 static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     BDRVQcowState *s = bs->opaque;
     QCowAIOCB *acb;
Index: qemu/block-qcow2.c
===================================================================
--- qemu.orig/block-qcow2.c	2009-04-26 16:47:40.682949219 +0200
+++ qemu/block-qcow2.c	2009-05-05 11:29:11.546784118 +0200
@@ -1349,7 +1349,7 @@ static void qcow_aio_read_cb(void *opaqu
                 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
                 acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
                                     &acb->hd_qiov, acb->n,
-				    qcow_aio_read_cb, acb);
+				    qcow_aio_read_cb, acb, 0);
                 if (acb->hd_aiocb == NULL)
                     goto done;
             } else {
@@ -1384,7 +1384,7 @@ static void qcow_aio_read_cb(void *opaqu
         qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
         acb->hd_aiocb = bdrv_aio_readv(s->hd,
                             (acb->cluster_offset >> 9) + index_in_cluster,
-                            &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
+                            &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb, 0);
         if (acb->hd_aiocb == NULL)
             goto done;
     }
@@ -1427,7 +1427,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDr
 
 static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     QCowAIOCB *acb;
 
@@ -1498,7 +1498,7 @@ static void qcow_aio_write_cb(void *opaq
     acb->hd_aiocb = bdrv_aio_writev(s->hd,
                                     (acb->cluster_offset >> 9) + index_in_cluster,
                                     &acb->hd_qiov, acb->n,
-                                    qcow_aio_write_cb, acb);
+                                    qcow_aio_write_cb, acb, 2);
     if (acb->hd_aiocb == NULL)
         goto done;
 
@@ -1513,7 +1513,7 @@ done:
 
 static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     BDRVQcowState *s = bs->opaque;
     QCowAIOCB *acb;
Index: qemu/block.c
===================================================================
--- qemu.orig/block.c	2009-04-26 16:38:30.513074989 +0200
+++ qemu/block.c	2009-05-05 11:29:11.547817490 +0200
@@ -59,10 +59,10 @@ typedef struct BlockDriverAIOCBSync {
 
 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque);
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags);
 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque);
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags);
 static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb);
 static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
                         uint8_t *buf, int nb_sectors);
@@ -1309,7 +1309,8 @@ char *bdrv_snapshot_dump(char *buf, int 
 
 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
                                  QEMUIOVector *qiov, int nb_sectors,
-                                 BlockDriverCompletionFunc *cb, void *opaque)
+                                 BlockDriverCompletionFunc *cb, void *opaque,
+                                 unsigned flags)
 {
     BlockDriver *drv = bs->drv;
     BlockDriverAIOCB *ret;
@@ -1320,7 +1321,7 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDr
         return NULL;
 
     ret = drv->bdrv_aio_readv(bs, sector_num, qiov, nb_sectors,
-                              cb, opaque);
+                              cb, opaque, flags);
 
     if (ret) {
 	/* Update stats even though technically transfer has not happened. */
@@ -1333,7 +1334,8 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDr
 
 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
                                   QEMUIOVector *qiov, int nb_sectors,
-                                  BlockDriverCompletionFunc *cb, void *opaque)
+                                  BlockDriverCompletionFunc *cb, void *opaque,
+                                  unsigned flags)
 {
     BlockDriver *drv = bs->drv;
     BlockDriverAIOCB *ret;
@@ -1346,7 +1348,7 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockD
         return NULL;
 
     ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
-                               cb, opaque);
+                               cb, opaque, flags);
 
     if (ret) {
 	/* Update stats even though technically transfer has not happened. */
@@ -1411,14 +1413,14 @@ static BlockDriverAIOCB *bdrv_aio_rw_vec
 
 static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
 }
 
 static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
 }
@@ -1454,7 +1456,7 @@ static int bdrv_read_em(BlockDriverState
     iov.iov_len = nb_sectors * 512;
     qemu_iovec_init_external(&qiov, &iov, 1);
     acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
-        bdrv_rw_em_cb, &async_ret);
+        bdrv_rw_em_cb, &async_ret, 0);
     if (acb == NULL)
         return -1;
 
@@ -1478,7 +1480,7 @@ static int bdrv_write_em(BlockDriverStat
     iov.iov_len = nb_sectors * 512;
     qemu_iovec_init_external(&qiov, &iov, 1);
     acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
-        bdrv_rw_em_cb, &async_ret);
+        bdrv_rw_em_cb, &async_ret, 0);
     if (acb == NULL)
         return -1;
     while (async_ret == NOT_DONE) {
Index: qemu/block.h
===================================================================
--- qemu.orig/block.h	2009-04-26 16:38:30.513074989 +0200
+++ qemu/block.h	2009-05-05 11:29:11.549784011 +0200
@@ -54,6 +54,12 @@ typedef struct QEMUSnapshotInfo {
 
 #define BDRV_O_CACHE_MASK  (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_CACHE_DEF)
 
+
+/*
+ * Flags for bdrv_aio_readv/bdrv_aio_writev.
+ */
+#define BDRV_IO_BARRIER    0x0001
+
 void bdrv_info(Monitor *mon);
 void bdrv_info_stats(Monitor *mon);
 
@@ -93,10 +99,12 @@ typedef void BlockDriverCompletionFunc(v
 
 BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
                                  QEMUIOVector *iov, int nb_sectors,
-                                 BlockDriverCompletionFunc *cb, void *opaque);
+                                 BlockDriverCompletionFunc *cb, void *opaque,
+                                 unsigned flags);
 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
                                   QEMUIOVector *iov, int nb_sectors,
-                                  BlockDriverCompletionFunc *cb, void *opaque);
+                                  BlockDriverCompletionFunc *cb, void *opaque,
+                                  unsigned flags);
 void bdrv_aio_cancel(BlockDriverAIOCB *acb);
 
 /* sg packet commands */
Index: qemu/dma-helpers.c
===================================================================
--- qemu.orig/dma-helpers.c	2009-04-26 16:38:30.531074417 +0200
+++ qemu/dma-helpers.c	2009-05-05 11:29:11.550836309 +0200
@@ -120,10 +120,10 @@ static void dma_bdrv_cb(void *opaque, in
 
     if (dbs->is_write) {
         dbs->acb = bdrv_aio_writev(dbs->bs, dbs->sector_num, &dbs->iov,
-                                   dbs->iov.size / 512, dma_bdrv_cb, dbs);
+                                   dbs->iov.size / 512, dma_bdrv_cb, dbs, 0);
     } else {
         dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov,
-                                  dbs->iov.size / 512, dma_bdrv_cb, dbs);
+                                  dbs->iov.size / 512, dma_bdrv_cb, dbs, 0);
     }
     if (!dbs->acb) {
         dma_bdrv_unmap(dbs);
Index: qemu/hw/ide.c
===================================================================
--- qemu.orig/hw/ide.c	2009-05-04 17:02:14.367783478 +0200
+++ qemu/hw/ide.c	2009-05-05 11:29:11.552783415 +0200
@@ -1473,7 +1473,7 @@ static void ide_atapi_cmd_read_dma_cb(vo
     bm->iov.iov_len = n * 4 * 512;
     qemu_iovec_init_external(&bm->qiov, &bm->iov, 1);
     bm->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, &bm->qiov,
-                               n * 4, ide_atapi_cmd_read_dma_cb, bm);
+                               n * 4, ide_atapi_cmd_read_dma_cb, bm, 0);
     if (!bm->aiocb) {
         /* Note: media not present is the most likely case */
         ide_atapi_cmd_error(s, SENSE_NOT_READY,
Index: qemu/hw/scsi-disk.c
===================================================================
--- qemu.orig/hw/scsi-disk.c	2009-04-26 16:38:30.592081973 +0200
+++ qemu/hw/scsi-disk.c	2009-05-05 11:29:11.554836260 +0200
@@ -210,7 +210,7 @@ static void scsi_read_data(SCSIDevice *d
     r->iov.iov_len = n * 512;
     qemu_iovec_init_external(&r->qiov, &r->iov, 1);
     r->aiocb = bdrv_aio_readv(s->bdrv, r->sector, &r->qiov, n,
-                              scsi_read_complete, r);
+                              scsi_read_complete, r, 0);
     if (r->aiocb == NULL)
         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
     r->sector += n;
@@ -275,7 +275,7 @@ static void scsi_write_request(SCSIReque
     if (n) {
         qemu_iovec_init_external(&r->qiov, &r->iov, 1);
         r->aiocb = bdrv_aio_writev(s->bdrv, r->sector, &r->qiov, n,
-                                   scsi_write_complete, r);
+                                   scsi_write_complete, r, 0);
         if (r->aiocb == NULL)
             scsi_command_complete(r, STATUS_CHECK_CONDITION,
                                   SENSE_HARDWARE_ERROR);
Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c	2009-05-04 17:02:14.374784160 +0200
+++ qemu/hw/virtio-blk.c	2009-05-05 13:21:24.196784347 +0200
@@ -212,13 +212,13 @@ static void virtio_blk_handle_scsi(VirtI
 static void virtio_blk_handle_write(VirtIOBlockReq *req)
 {
     bdrv_aio_writev(req->dev->bs, req->out->sector, &req->qiov,
-                    req->qiov.size / 512, virtio_blk_rw_complete, req);
+                    req->qiov.size / 512, virtio_blk_rw_complete, req, 0);
 }
 
 static void virtio_blk_handle_read(VirtIOBlockReq *req)
 {
     bdrv_aio_readv(req->dev->bs, req->out->sector, &req->qiov,
-                   req->qiov.size / 512, virtio_blk_rw_complete, req);
+                   req->qiov.size / 512, virtio_blk_rw_complete, req, 0);
 }
 
 static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
Index: qemu/hw/xen_disk.c
===================================================================
--- qemu.orig/hw/xen_disk.c	2009-04-26 16:38:30.612075090 +0200
+++ qemu/hw/xen_disk.c	2009-05-05 11:29:11.556785880 +0200
@@ -397,14 +397,14 @@ static int ioreq_runio_qemu_aio(struct i
         ioreq->aio_inflight++;
         bdrv_aio_readv(blkdev->bs, ioreq->start / BLOCK_SIZE,
                        &ioreq->v, ioreq->v.size / BLOCK_SIZE,
-                       qemu_aio_complete, ioreq);
+                       qemu_aio_complete, ioreq, 0);
 	break;
     case BLKIF_OP_WRITE:
     case BLKIF_OP_WRITE_BARRIER:
         ioreq->aio_inflight++;
         bdrv_aio_writev(blkdev->bs, ioreq->start / BLOCK_SIZE,
                         &ioreq->v, ioreq->v.size / BLOCK_SIZE,
-                        qemu_aio_complete, ioreq);
+                        qemu_aio_complete, ioreq, 0);
 	break;
     default:
 	/* unknown operation (shouldn't happen -- parse catches this) */
Index: qemu/qemu-io.c
===================================================================
--- qemu.orig/qemu-io.c	2009-05-04 17:02:14.381783935 +0200
+++ qemu/qemu-io.c	2009-05-05 11:31:57.159659916 +0200
@@ -148,7 +148,7 @@ static int do_aio_readv(QEMUIOVector *qi
 	int async_ret = NOT_DONE;
 
 	acb = bdrv_aio_readv(bs, offset >> 9, qiov, qiov->size >> 9,
-			     aio_rw_done, &async_ret);
+			     aio_rw_done, &async_ret, 0);
 	if (!acb)
 		return -EIO;
 
@@ -165,7 +165,7 @@ static int do_aio_writev(QEMUIOVector *q
 	int async_ret = NOT_DONE;
 
 	acb = bdrv_aio_writev(bs, offset >> 9, qiov, qiov->size >> 9,
-			      aio_rw_done, &async_ret);
+			      aio_rw_done, &async_ret, 0);
 	if (!acb)
 		return -EIO;
 
Index: qemu/block-raw-posix.c
===================================================================
--- qemu.orig/block-raw-posix.c	2009-04-28 11:42:09.257949541 +0200
+++ qemu/block-raw-posix.c	2009-05-05 13:21:23.136784385 +0200
@@ -654,7 +654,7 @@ static void raw_aio_remove(RawAIOCB *acb
 
 static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     RawAIOCB *acb;
 
@@ -670,7 +670,7 @@ static BlockDriverAIOCB *raw_aio_readv(B
 
 static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags)
 {
     RawAIOCB *acb;
 
Index: qemu/block_int.h
===================================================================
--- qemu.orig/block_int.h	2009-04-26 16:38:30.513074989 +0200
+++ qemu/block_int.h	2009-05-05 13:23:37.599695377 +0200
@@ -56,10 +56,10 @@ struct BlockDriver {
     /* aio */
     BlockDriverAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque);
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags);
     BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs,
         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque);
+        BlockDriverCompletionFunc *cb, void *opaque, unsigned flags);
     void (*bdrv_aio_cancel)(BlockDriverAIOCB *acb);
     int aiocb_size;
 
@@ -117,6 +117,7 @@ struct BlockDriverState {
     int encrypted; /* if true, the media is encrypted */
     int valid_key; /* if true, a valid encryption key has been set */
     int sg;        /* if true, the device is a /dev/sg* */
+    int barrier_support;  /* if true, the device supports barrier requests */
     /* event callback when inserting/removing */
     void (*change_cb)(void *opaque);
     void *change_opaque;

  reply	other threads:[~2009-05-05 12:08 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-05 12:08 [Qemu-devel] [PATCH 0/3] write barrier support Christoph Hellwig
2009-05-05 12:08 ` Christoph Hellwig [this message]
2009-05-05 13:51   ` [Qemu-devel] barriers: block layer preparations Avi Kivity
2009-05-05 15:38     ` Jamie Lokier
2009-05-05 15:49       ` Avi Kivity
2009-05-05 16:00         ` Jamie Lokier
2009-05-05 20:57     ` Christoph Hellwig
2009-05-05 22:49       ` Jamie Lokier
2009-05-05 12:08 ` [Qemu-devel] [PATCH 2/3] barriers: block-raw-posix barrier support Christoph Hellwig
2009-05-05 12:33   ` Jamie Lokier
2009-05-05 13:29     ` Christoph Hellwig
2009-05-05 16:00       ` Jamie Lokier
2009-05-05 12:09 ` [Qemu-devel] [PATCH 3/3] barriers: virtio Christoph Hellwig
2009-05-05 13:53 ` [Qemu-devel] [PATCH 0/3] write barrier support Avi Kivity
2009-05-05 21:00   ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090505120817.GA30721@lst.de \
    --to=hch@lst.de \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.