Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 01 May 2001 22:34:41 -0400
From:      Andrew Heybey <ath@niksun.com>
To:        msmith@freebsd.org
Cc:        freebsd-scsi@freebsd.org
Subject:   AMI MegaRAID on 4.2-RELEASE and bus_dmamap_load errors 
Message-ID:  <200105020234.WAA11069@stiegl.niksun.com>

next in thread | raw e-mail | index | archive | help
When running rawio on an (unmounted) partition, the kernel starts
logging many messages of the form:

Apr 23 11:00:03 raid /kernel: bus_dmamap_load: Too many segs! buf_len = 0x900
Apr 23 11:00:03 raid /kernel: bus_dmamap_load: Too many segs! buf_len = 0x100
Apr 23 11:00:03 raid /kernel: bus_dmamap_load: Too many segs! buf_len = 0xf00
Apr 23 11:00:03 raid last message repeated 4 times

Relevant boot messages:

amr0: <AMI MegaRAID> mem 0xf8000000-0xfbffffff irq 11 at device 0.0 on pci4
amr0: <Series 493 40 Logical Drive Firmware> Firmware l148, BIOS 3.11, 64MB RAM

amrd0: <MegaRAID logical drive> on amr0
amrd0: 140008MB (286736384 sectors) RAID 5 (optimal)
amrd1: <MegaRAID logical drive> on amr0
amrd1: 140008MB (286736384 sectors) RAID 5 (optimal)

System is an Intel L440GX+, 512MB RAM.  It is currently set up to
stripe (using ccd) across the two RAID 5 arrays.  The rawio is run on
/dev/rccd0c.

I found an exchange on freebsd-scsi in January about a similar problem 
with Mylex controllers:

> > If you need someone to do testing of FreeBSD patches, revisions, etc for
> > these controllers, the RAID cards and PC in question is just a
> > play-around with PC and doesn't hold any critical data.  I can
> > format/destroy/reload stuff at will with no problems.  Just let me know.
> 
> I'll keep you on file.  8)  If you have any C hacking experience, I 
> *really* need to know why the 'too many segs' error is being thrown.  All 
> the indications I've received so far are that the region in question 
> shouldn't have "too many" segments, so I'm a bit confused.

I added the following to sys/i386/i386/busdma_machdep.c:

@@ -470,8 +470,13 @@
 	} while (buflen > 0);
 
 	if (buflen != 0) {
-		printf("bus_dmamap_load: Too many segs! buf_len = 0x%lx\n",
-		       (u_long)buflen);
+		int i;
+		printf("bus_dmamap_load: Too many segs! buf_len = 0x%lx, seg = %d, nseg = %d\n",
+		       (u_long)buflen, seg, dmat->nsegments);
+		for (i = 0; i < dmat->nsegments; i++)
+			printf("bus_dmamap_load: seg %d addr 0x%lx len %d\n",
+			       i, (u_long)dm_segments[i].ds_addr,
+			       dm_segments[i].ds_len);
 		error = EFBIG;
 	}
 
Then I get:

bus_dmamap_load: Too many segs! buf_len = 0xea0, seg = 17, nseg = 16
bus_dmamap_load: seg 0 addr 0x8dabea0 len 352
bus_dmamap_load: seg 1 addr 0x8f8c000 len 4096
bus_dmamap_load: seg 2 addr 0x8f6d000 len 4096
bus_dmamap_load: seg 3 addr 0x8dae000 len 4096
bus_dmamap_load: seg 4 addr 0x8b0f000 len 4096
bus_dmamap_load: seg 5 addr 0x8c30000 len 4096
bus_dmamap_load: seg 6 addr 0x8e31000 len 4096
bus_dmamap_load: seg 7 addr 0x8b12000 len 4096
bus_dmamap_load: seg 8 addr 0x8cb3000 len 4096
bus_dmamap_load: seg 9 addr 0x8954000 len 4096
bus_dmamap_load: seg 10 addr 0x8ad5000 len 4096
bus_dmamap_load: seg 11 addr 0x8ab6000 len 4096
bus_dmamap_load: seg 12 addr 0x8bd7000 len 4096
bus_dmamap_load: seg 13 addr 0x8af8000 len 4096
bus_dmamap_load: seg 14 addr 0x8b79000 len 4096
bus_dmamap_load: seg 15 addr 0x7b7a000 len 4096

Someone is trying to do a 64k DMA to a non-page-aligned address.  This 
requires 17 segments, but there are only 16 available.

Any suggestions?

thanks,
andrew

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-scsi" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105020234.WAA11069>