Skip to contentSkip to conversation

ioemu: improve DMA transfers

PATCH In review Samuel Thibault 1 participant 3 messages Mar 20, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ioemu: improve DMA transfers

Hello,

I was wondering about the not so good performances of the IDE emulation even in the case of DMA transfers. It happens that qemu is actually limiting the qemu / dom0 kernel reads/writes to 8KB at a time, which is not very big (the SCSI emulation uses 64KB). Increasing it provides a very good improvement, as the attached graph shows. On my test machine, 55MB/s can be achieved with a buffer of 128KB, to be compared to the native 65MB/s. The stubdomain approach is limited to 44KB because of the limit in the PV blk interface.

Samuel

ioemu: improve DMA transfers
by increasing the size of DMA buffers.

tools/ioemu/hw/ide.c +16 -7
diff -r dc1fe3bd1393 tools/ioemu/hw/ide.c
@@ -189,6 +189,15 @@
 
 /* set to 1 set disable mult support */
 #define MAX_MULT_SECTORS 16
+#ifdef CONFIG_STUBDOM
+#include <xen/io/blkif.h>
+#define IDE_DMA_BUF_SIZE (BLKIF_MAX_SEGMENTS_PER_REQUEST * TARGET_PAGE_SIZE)
+#else
+#define IDE_DMA_BUF_SIZE 131072
+#endif
+#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 */
 
@@ -932,8 +941,8 @@
 
     /* launch next transfer */
     n = s->nsector;
-    if (n > MAX_MULT_SECTORS)
-        n = MAX_MULT_SECTORS;
+    if (n > IDE_DMA_BUF_SIZE)
+        n = IDE_DMA_BUF_SIZE;
     s->io_buffer_index = 0;
     s->io_buffer_size = n * 512;
 #ifdef DEBUG_AIO
@@ -1041,8 +1050,8 @@
 
     /* launch next transfer */
     n = s->nsector;
-    if (n > MAX_MULT_SECTORS)
-        n = MAX_MULT_SECTORS;
+    if (n > IDE_DMA_BUF_SIZE)
+        n = IDE_DMA_BUF_SIZE;
     s->io_buffer_index = 0;
     s->io_buffer_size = n * 512;
 
@@ -1336,8 +1345,8 @@
         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 / 4))
+            n = (IDE_DMA_BUF_SIZE / 4);
         s->io_buffer_size = n * 2048;
         data_offset = 0;
     }
@@ -2306,7 +2315,7 @@
 
     for(i = 0; i < 2; i++) {
         s = ide_state + i;
-        s->io_buffer = qemu_memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4);
+        s->io_buffer = qemu_memalign(getpagesize(), IDE_DMA_BUF_SIZE*512 + 4);
         if (i == 0)
             s->bs = hd0;
         else
tools/ioemu/hw/scsi-disk.c +3 -2
@@ -34,9 +34,10 @@
 #define SENSE_ILLEGAL_REQUEST 5
 
 #ifdef CONFIG_STUBDOM
-#define SCSI_DMA_BUF_SIZE    32768
+#include <xen/io/blkif.h>
+#define SCSI_DMA_BUF_SIZE    (BLKIF_MAX_SEGMENTS_PER_REQUEST * TARGET_PAGE_SIZE)
 #else
-#define SCSI_DMA_BUF_SIZE    65536
+#define SCSI_DMA_BUF_SIZE    131072
 #endif
 
 typedef struct SCSIRequest {

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw
Quoted 2 lines · Samuel Thibault, le Thu 20 Mar 2008 16:29:15 +0000, a écrit :

ioemu: improve DMA transfers
by increasing the size of DMA buffers.

Ooops, don't apply it, my late conversion from sectors to bytes went wrong (but the graph it correct).

Samuel

#2 lore raw
Quoted 2 lines · Samuel Thibault, le Thu 20 Mar 2008 16:31:45 +0000, a écrit :

Ooops, don't apply it, my late conversion from sectors to bytes went wrong (but the graph it correct).

This one is correct

Samuel

ioemu: improve DMA transfers
by increasing the size of DMA buffers.

tools/ioemu/hw/ide.c +16 -7
diff -r dc1fe3bd1393 tools/ioemu/hw/ide.c
@@ -189,6 +189,15 @@
 
 /* set to 1 set disable mult support */
 #define MAX_MULT_SECTORS 16
+#ifdef CONFIG_STUBDOM
+#include <xen/io/blkif.h>
+#define IDE_DMA_BUF_SIZE (BLKIF_MAX_SEGMENTS_PER_REQUEST * TARGET_PAGE_SIZE)
+#else
+#define IDE_DMA_BUF_SIZE 131072
+#endif
+#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 */
 
@@ -932,8 +941,8 @@
 
     /* 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
@@ -1041,8 +1050,8 @@
 
     /* 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;
 
@@ -1336,8 +1345,8 @@
         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;
     }
@@ -2306,7 +2315,7 @@
 
     for(i = 0; i < 2; i++) {
         s = ide_state + i;
-        s->io_buffer = qemu_memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4);
+        s->io_buffer = qemu_memalign(getpagesize(), IDE_DMA_BUF_SIZE + 4);
         if (i == 0)
             s->bs = hd0;
         else
tools/ioemu/hw/scsi-disk.c +3 -2
@@ -34,9 +34,10 @@
 #define SENSE_ILLEGAL_REQUEST 5
 
 #ifdef CONFIG_STUBDOM
-#define SCSI_DMA_BUF_SIZE    32768
+#include <xen/io/blkif.h>
+#define SCSI_DMA_BUF_SIZE    (BLKIF_MAX_SEGMENTS_PER_REQUEST * TARGET_PAGE_SIZE)
 #else
-#define SCSI_DMA_BUF_SIZE    65536
+#define SCSI_DMA_BUF_SIZE    131072
 #endif
 
 typedef struct SCSIRequest {