ccd on NATA problem - ata0: FAILURE - oversized DMA transfer attempt 73728 > 65536

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Wed Jul 18 00:03:58 PDT 2007


On Tue, Jul 17, 2007 at 11:45:08PM -0700, Matthew Dillon wrote:
> 
> :On Tue, Jul 17, 2007 at 10:52:05PM -0700, Matthew Dillon wrote:
> :> 
> :> :On Tue, Jul 10, 2007 at 12:58:16PM +0900, YONETANI Tomokazu wrote:
> :> :> It worked fine as I tested lightly(-j2 buildworld).  I'll try to test later
> :> :> with different max iosize of component devices.
> :> :
> :> :Hi, I tried to reduce the default max_iosize in ata_dmainit()
> :> :to 64 * DEV_BSIZE(=32768), expecting that it reduces si_iosize_max
> :> :as it's assigned ch->dma->max_iosize in ata_attach(), but now NATA
> :> :fails setting up DMA.  Is there any other way to achive the reduced
> :> :iosize?
> :> :
> :> :Cheers.
> :> 
> :>     Are you running the patch for CCD?  Which I did commit.
> :
> :Yes, I saw that it was committed.  I have the latest source,
> :and in this case CCD is irrelavant (because it happens on non-ccd
> :system, too).  The system using CCD is working just fine as my
> :build machine.
> :
> :Cheers.
> 
>     Can you get a ddb backtrace?

Sure, are function names enough?

ata0: FAILURE - oversized DMA transfer attempt 37888 > 32768
Trace beginning at frame 0xc86155a4
ata_dmaload
ata_dmaload
ata_begin_transaction
ata_start
ata_queue_request
ad_strategy
dev_dstrategy
diskstrategy
dev_dstrategy_chain
spec_strategy
vop_strategy
vn_strategy
spec_getpages
vop_getpages
ffs_getpages
vop_getpages
vnode_pager_getpages
vm_fault_object
vm_fault_object_page
elf_load_section
exec_elf_imgact
kern_execve
sys_execve
start_init
fork_trampoline
Index: ata-dma.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/dev/disk/nata/ata-dma.c,v
retrieving revision 1.4
diff -u -p -r1.4 ata-dma.c
--- ata-dma.c	5 Jun 2007 18:30:40 -0000	1.4
+++ ata-dma.c	18 Jul 2007 06:53:51 -0000
@@ -75,7 +75,7 @@ ata_dmainit(device_t dev)
     ch->dma->alignment = 2;
     ch->dma->boundary = 128 * DEV_BSIZE;
     ch->dma->segsize = 128 * DEV_BSIZE;
-    ch->dma->max_iosize = 128 * DEV_BSIZE;
+    ch->dma->max_iosize = 64 * DEV_BSIZE;
     ch->dma->max_address = BUS_SPACE_MAXADDR_32BIT;
 }
 
@@ -213,6 +213,7 @@ ata_dmasetprd(void *xsc, bus_dma_segment
     args->nsegs = nsegs;
 }
 
+void db_print_backtrace(void);
 static int
 ata_dmaload(device_t dev, caddr_t data, int32_t count, int dir,
 	    void *addr, int *entries)
@@ -237,6 +238,7 @@ ata_dmaload(device_t dev, caddr_t data, 
     if (count > ch->dma->max_iosize) {
 	device_printf(dev, "FAILURE - oversized DMA transfer attempt %d > %d\n",
 		      count, ch->dma->max_iosize);
+	db_print_backtrace();
 	return EIO;
     }
 




More information about the Bugs mailing list