ioemu: improve DMA transfers
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
@@ -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
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
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
@@ -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 {