[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [qemu] hdparm tunable IDE write cache for HVM



# HG changeset patch
# User Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
# Node ID 9bb6c1c1890a07885265bbc59f4dbb660312974e
# Parent  78673ba510ed06e02edc8175828d302addd7a0fd
[qemu] hdparm tunable IDE write cache for HVM
qemu 0.8.2 has a flush callback to the storage backends, so now it is
possible to implement hdparm tunable IDE write cache enable/disable for
guest domains, allowing people to pick speed or data consistency on a
case by case basis.

As an added benefit, really large LBA48 IOs will now no longer be broken
up into smaller IOs on the host side.

From: Rik van Riel <riel@xxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
---
 tools/ioemu/block-bochs.c |    2 +-
 tools/ioemu/block-cloop.c |    2 +-
 tools/ioemu/block-cow.c   |    2 +-
 tools/ioemu/block-qcow.c  |    2 +-
 tools/ioemu/block-vmdk.c  |    2 +-
 tools/ioemu/block.c       |    2 +-
 tools/ioemu/hw/ide.c      |   17 +++++++++++++++++
 7 files changed, 23 insertions(+), 6 deletions(-)

diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block-bochs.c
--- a/tools/ioemu/block-bochs.c Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block-bochs.c Sun Aug 20 23:59:34 2006 +0100
@@ -91,7 +91,7 @@ static int bochs_open(BlockDriverState *
     int fd, i;
     struct bochs_header bochs;
 
-    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
     if (fd < 0) {
         fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
         if (fd < 0)
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block-cloop.c
--- a/tools/ioemu/block-cloop.c Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block-cloop.c Sun Aug 20 23:59:34 2006 +0100
@@ -55,7 +55,7 @@ static int cloop_open(BlockDriverState *
     BDRVCloopState *s = bs->opaque;
     uint32_t offsets_size,max_compressed_block_size=1,i;
 
-    s->fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE | O_SYNC);
+    s->fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
     if (s->fd < 0)
         return -1;
     bs->read_only = 1;
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block-cow.c
--- a/tools/ioemu/block-cow.c   Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block-cow.c   Sun Aug 20 23:59:34 2006 +0100
@@ -69,7 +69,7 @@ static int cow_open(BlockDriverState *bs
     struct cow_header_v2 cow_header;
     int64_t size;
 
-    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
     if (fd < 0) {
         fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
         if (fd < 0)
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block-qcow.c
--- a/tools/ioemu/block-qcow.c  Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block-qcow.c  Sun Aug 20 23:59:34 2006 +0100
@@ -95,7 +95,7 @@ static int qcow_open(BlockDriverState *b
     int fd, len, i, shift;
     QCowHeader header;
     
-    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
     if (fd < 0) {
         fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
         if (fd < 0)
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block-vmdk.c
--- a/tools/ioemu/block-vmdk.c  Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block-vmdk.c  Sun Aug 20 23:59:34 2006 +0100
@@ -96,7 +96,7 @@ static int vmdk_open(BlockDriverState *b
     uint32_t magic;
     int l1_size;
 
-    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
     if (fd < 0) {
         fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
         if (fd < 0)
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/block.c
--- a/tools/ioemu/block.c       Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/block.c       Sun Aug 20 23:59:34 2006 +0100
@@ -685,7 +685,7 @@ static int raw_open(BlockDriverState *bs
     int rv;
 #endif
 
-    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE | O_SYNC);
+    fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
     if (fd < 0) {
         fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
         if (fd < 0)
diff -r 78673ba510ed -r 9bb6c1c1890a tools/ioemu/hw/ide.c
--- a/tools/ioemu/hw/ide.c      Sun Aug 20 23:52:39 2006 +0100
+++ b/tools/ioemu/hw/ide.c      Sun Aug 20 23:59:34 2006 +0100
@@ -305,6 +305,7 @@ typedef struct IDEState {
     PCIDevice *pci_dev;
     struct BMDMAState *bmdma;
     int drive_serial;
+    int write_cache;
     /* ide regs */
     uint8_t feature;
     uint8_t error;
@@ -789,6 +790,9 @@ static void ide_sector_write(IDEState *s
     }
     ide_set_sector(s, sector_num + n);
     
+    if (!s->write_cache)
+        bdrv_flush(s->bs);
+    
 #ifdef TARGET_I386
     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
         /* It seems there is a bug in the Windows 2000 installer HDD
@@ -863,6 +867,10 @@ static int ide_write_dma_cb(IDEState *s,
         transfer_size -= len;
         phys_addr += len;
     }
+    /* Ensure the data hit disk before telling the guest OS so. */
+    if (!s->write_cache)
+        bdrv_flush(s->bs);
+
     return transfer_size1 - transfer_size;
 }
 
@@ -1672,7 +1680,15 @@ static void ide_ioport_write(void *opaqu
             /* XXX: valid for CDROM ? */
             switch(s->feature) {
             case 0x02: /* write cache enable */
+                s->write_cache = 1;
+                s->status = READY_STAT | SEEK_STAT;
+                ide_set_irq(s);
+                break;
             case 0x82: /* write cache disable */
+                s->write_cache = 0;
+                s->status = READY_STAT | SEEK_STAT;
+                ide_set_irq(s);
+                break;
             case 0xaa: /* read look-ahead enable */
             case 0x55: /* read look-ahead disable */
                 s->status = READY_STAT | SEEK_STAT;
@@ -2090,6 +2106,7 @@ static void ide_init2(IDEState *ide_stat
         s->irq = irq;
         s->sector_write_timer = qemu_new_timer(vm_clock, 
                                                ide_sector_write_timer_cb, s);
+        s->write_cache = 0;
         ide_reset(s);
     }
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.