qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [7229] implement qemu_blockalign (Stefano Stabellini)
@ 2009-04-22 20:20 Anthony Liguori
  0 siblings, 0 replies; only message in thread
From: Anthony Liguori @ 2009-04-22 20:20 UTC (permalink / raw)
  To: qemu-devel

Revision: 7229
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=7229
Author:   aliguori
Date:     2009-04-22 20:20:00 +0000 (Wed, 22 Apr 2009)
Log Message:
-----------
implement qemu_blockalign (Stefano Stabellini)

this patch adds a buffer_alignment field to BlockDriverState and
implements a qemu_blockalign function that uses that field to allocate a
memory aligned buffer to be used by the block driver.
buffer_alignment is initialized to 512 but each block driver can set
a different value (at the moment none of them do).
This patch modifies ide.c, block-qcow.c, block-qcow2.c and block.c to
use qemu_blockalign instead of qemu_memalign.
There is only one place left that still uses qemu_memalign to allocate
buffers used by block drivers that is posix-aio-compat:handle_aiocb_rw
because it is not possible to get the BlockDriverState from that
function. However I think it is not important because posix-aio-compat
already deals with driver specific code so it is supposed to know its
own needs.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

Modified Paths:
--------------
    trunk/block-qcow.c
    trunk/block-qcow2.c
    trunk/block-raw-posix.c
    trunk/block.c
    trunk/block_int.h
    trunk/hw/ide.c

Modified: trunk/block-qcow.c
===================================================================
--- trunk/block-qcow.c	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/block-qcow.c	2009-04-22 20:20:00 UTC (rev 7229)
@@ -641,7 +641,7 @@
     acb->sector_num = sector_num;
     acb->qiov = qiov;
     if (qiov->niov > 1)
-        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
+        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
     else
         acb->buf = (uint8_t *)qiov->iov->iov_base;
     acb->nb_sectors = nb_sectors;
@@ -736,7 +736,7 @@
     acb->sector_num = sector_num;
     acb->qiov = qiov;
     if (qiov->niov > 1) {
-        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
+        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
         qemu_iovec_to_buffer(qiov, acb->buf);
     } else {
         acb->buf = (uint8_t *)qiov->iov->iov_base;

Modified: trunk/block-qcow2.c
===================================================================
--- trunk/block-qcow2.c	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/block-qcow2.c	2009-04-22 20:20:00 UTC (rev 7229)
@@ -1412,7 +1412,7 @@
     acb->sector_num = sector_num;
     acb->qiov = qiov;
     if (qiov->niov > 1) {
-        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
+        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
         if (is_write)
             qemu_iovec_to_buffer(qiov, acb->buf);
     } else {

Modified: trunk/block-raw-posix.c
===================================================================
--- trunk/block-raw-posix.c	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/block-raw-posix.c	2009-04-22 20:20:00 UTC (rev 7229)
@@ -165,7 +165,7 @@
     s->fd = fd;
     s->aligned_buf = NULL;
     if ((flags & BDRV_O_NOCACHE)) {
-        s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
+        s->aligned_buf = qemu_blockalign(bs, ALIGNED_BUFFER_SIZE);
         if (s->aligned_buf == NULL) {
             ret = -errno;
             close(fd);

Modified: trunk/block.c
===================================================================
--- trunk/block.c	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/block.c	2009-04-22 20:20:00 UTC (rev 7229)
@@ -362,6 +362,8 @@
     bs->is_temporary = 0;
     bs->encrypted = 0;
     bs->valid_key = 0;
+    /* buffer_alignment defaulted to 512, drivers can change this value */
+    bs->buffer_alignment = 512;
 
     if (flags & BDRV_O_SNAPSHOT) {
         BlockDriverState *bs1;
@@ -1390,7 +1392,7 @@
     acb = qemu_aio_get(bs, cb, opaque);
     acb->is_write = is_write;
     acb->qiov = qiov;
-    acb->bounce = qemu_memalign(512, qiov->size);
+    acb->bounce = qemu_blockalign(bs, qiov->size);
 
     if (!acb->bh)
         acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
@@ -1640,3 +1642,8 @@
         return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
     return NULL;
 }
+
+void *qemu_blockalign(BlockDriverState *bs, size_t size)
+{
+    return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
+}

Modified: trunk/block_int.h
===================================================================
--- trunk/block_int.h	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/block_int.h	2009-04-22 20:20:00 UTC (rev 7229)
@@ -145,6 +145,9 @@
     /* Whether the disk can expand beyond total_sectors */
     int growable;
 
+    /* the memory alignment required for the buffers handled by this driver */
+    int buffer_alignment;
+
     /* NOTE: the following infos are only hints for real hardware
        drivers. They are not used by the block driver */
     int cyls, heads, secs, translation;
@@ -173,6 +176,8 @@
                         BlockDriverCompletionFunc *cb, void *opaque);
 void qemu_aio_release(void *p);
 
+void *qemu_blockalign(BlockDriverState *bs, size_t size);
+
 extern BlockDriverState *bdrv_first;
 
 #endif /* BLOCK_INT_H */

Modified: trunk/hw/ide.c
===================================================================
--- trunk/hw/ide.c	2009-04-22 15:19:53 UTC (rev 7228)
+++ trunk/hw/ide.c	2009-04-22 20:20:00 UTC (rev 7229)
@@ -2788,11 +2788,11 @@
 
     for(i = 0; i < 2; i++) {
         s = ide_state + i;
-        s->io_buffer = qemu_memalign(512, IDE_DMA_BUF_SECTORS*512 + 4);
         if (i == 0)
             s->bs = hd0;
         else
             s->bs = hd1;
+        s->io_buffer = qemu_blockalign(s->bs, IDE_DMA_BUF_SECTORS*512 + 4);
         if (s->bs) {
             bdrv_get_geometry(s->bs, &nb_sectors);
             bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-04-22 20:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-22 20:20 [Qemu-devel] [7229] implement qemu_blockalign (Stefano Stabellini) Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).