qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH] Improve DMA transfers by increasing the buffer size


From: Ian Jackson
Subject: [Qemu-devel] [PATCH] Improve DMA transfers by increasing the buffer size.
Date: Wed, 26 Mar 2008 16:35:00 +0000

In this patch we increase the DMA buffers in the ide emulation from 8k
to 132k, and make it configurable separately from the MAX_MULT_SECTORS
for maximum multi-mode transfers.  This can improve the performance in
some conditions.

The patch is cross-ported from xen-unstable hg changeset
 f4a92f0db20fda98a633c149e3396c005a759a77

Signed-off-by: Ian Jackson <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>

>From 4eaa19458262cce92f0b891c51433ccee0a19b79 Mon Sep 17 00:00:00 2001
From: Ian Jackson <address@hidden>
Date: Wed, 26 Mar 2008 16:09:35 +0000
Subject: [PATCH] Improve DMA transfers by increasing the size of DMA buffers.

This involves a new constant IDE_DMA_BUF_SIZE which is separate from
MAX_MULT_SECTORS.

Cross-ported from xen-unstable
 17267:f4a92f0db20fda98a633c149e3396c005a759a77

Signed-off-by: Ian Jackson <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>
---
 hw/ide.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/hw/ide.c b/hw/ide.c
index 56a1cda..b73dba2 100644
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -202,6 +202,12 @@
 /* set to 1 set disable mult support */
 #define MAX_MULT_SECTORS 16
 
+#define IDE_DMA_BUF_SIZE 131072
+
+#if (IDE_DMA_BUF_SIZE < MAX_MULT_SECTORS * 512)
+#error "IDE_DMA_BUF_SIZE must be bigger or equal to MAX_MULT_SECTORS * 512"
+#endif
+
 /* ATAPI defines */
 
 #define ATAPI_PACKET_SIZE 12
@@ -920,8 +926,8 @@ static void ide_read_dma_cb(void *opaque, int ret)
 
     /* launch next transfer */
     n = s->nsector;
-    if (n > MAX_MULT_SECTORS)
-        n = MAX_MULT_SECTORS;
+    if (n > IDE_DMA_BUF_SIZE / 512)
+        n = IDE_DMA_BUF_SIZE / 512;
     s->io_buffer_index = 0;
     s->io_buffer_size = n * 512;
 #ifdef DEBUG_AIO
@@ -1028,8 +1034,8 @@ static void ide_write_dma_cb(void *opaque, int ret)
 
     /* launch next transfer */
     n = s->nsector;
-    if (n > MAX_MULT_SECTORS)
-        n = MAX_MULT_SECTORS;
+    if (n > IDE_DMA_BUF_SIZE / 512)
+        n = IDE_DMA_BUF_SIZE / 512;
     s->io_buffer_index = 0;
     s->io_buffer_size = n * 512;
 
@@ -1323,8 +1329,8 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int 
ret)
         data_offset = 16;
     } else {
         n = s->packet_transfer_size >> 11;
-        if (n > (MAX_MULT_SECTORS / 4))
-            n = (MAX_MULT_SECTORS / 4);
+        if (n > (IDE_DMA_BUF_SIZE / 2048))
+            n = (IDE_DMA_BUF_SIZE / 2048);
         s->io_buffer_size = n * 2048;
         data_offset = 0;
     }
@@ -2557,7 +2563,7 @@ static void ide_init2(IDEState *ide_state,
 
     for(i = 0; i < 2; i++) {
         s = ide_state + i;
-        s->io_buffer = qemu_memalign(512, MAX_MULT_SECTORS*512 + 4);
+        s->io_buffer = qemu_memalign(512, IDE_DMA_BUF_SIZE + 4);
         if (i == 0)
             s->bs = hd0;
         else
-- 
1.4.4.4


reply via email to

[Prev in Thread] Current Thread [Next in Thread]