From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LmTXF-0004Nh-NL for qemu-devel@nongnu.org; Wed, 25 Mar 2009 09:52:49 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LmTXB-0004IB-Rm for qemu-devel@nongnu.org; Wed, 25 Mar 2009 09:52:49 -0400 Received: from [199.232.76.173] (port=49232 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LmTXB-0004Hx-NG for qemu-devel@nongnu.org; Wed, 25 Mar 2009 09:52:45 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:1638) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LmTXB-00076j-1b for qemu-devel@nongnu.org; Wed, 25 Mar 2009 09:52:45 -0400 Received: from [10.80.225.184] ([10.80.225.184]) by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id n2PDqeGG029658 for ; Wed, 25 Mar 2009 06:52:41 -0700 Message-ID: <49CA3591.1010309@eu.citrix.com> Date: Wed, 25 Mar 2009 13:45:53 +0000 From: Stefano Stabellini MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] honor IDE_DMA_BUF_SECTORS Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "qemu-devel@nongnu.org" Hi all, after the recent introduction of dma_buf_prepare we stopped honoring IDE_DMA_BUF_SECTORS (the guest can issue dma requests with a greater total length than IDE_DMA_BUF_SECTORS). This patch adds the IDE_DMA_BUF_SECTORS limit back in place. Comments are welcome. Signed-off-by: Stefano Stabellini --- diff --git a/hw/ide.c b/hw/ide.c index 96bc176..ef1356d 100644 --- a/hw/ide.c +++ b/hw/ide.c @@ -207,6 +207,7 @@ #define MAX_MULT_SECTORS 16 #define IDE_DMA_BUF_SECTORS 256 +#define IDE_DMA_BUF_BYTES (IDE_DMA_BUF_SECTORS * 512) #if (IDE_DMA_BUF_SECTORS < MAX_MULT_SECTORS) #error "IDE_DMA_BUF_SECTORS must be bigger or equal to MAX_MULT_SECTORS" @@ -877,9 +878,10 @@ static int dma_buf_prepare(BMDMAState *bm, int is_write) uint32_t addr; uint32_t size; } prd; - int l, len; + int l, len, n; - qemu_sglist_init(&s->sg, s->nsector / (TARGET_PAGE_SIZE/512) + 1); + n = s->nsector <= IDE_DMA_BUF_SECTORS ? s->nsector : IDE_DMA_BUF_SECTORS; + qemu_sglist_init(&s->sg, n / (TARGET_PAGE_SIZE/512) + 1); s->io_buffer_size = 0; for(;;) { if (bm->cur_prd_len == 0) { @@ -900,6 +902,13 @@ static int dma_buf_prepare(BMDMAState *bm, int is_write) } l = bm->cur_prd_len; if (l > 0) { + if (l > IDE_DMA_BUF_BYTES) + l = IDE_DMA_BUF_BYTES; + if (s->io_buffer_size + l > IDE_DMA_BUF_BYTES) { + l = IDE_DMA_BUF_BYTES - s->io_buffer_size; + if (!l) + return s->io_buffer_size != 0; + } qemu_sglist_add(&s->sg, bm->cur_prd_addr, l); bm->cur_prd_addr += l; bm->cur_prd_len -= l;