Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Mon, 27 Jan 2003 14:14:34 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Mon, 27 Jan 2003 14:14:34 -0500 Received: from ns.virtualhost.dk ([195.184.98.160]:47852 "EHLO virtualhost.dk") by vger.kernel.org with ESMTP id ; Mon, 27 Jan 2003 14:14:32 -0500 Date: Mon, 27 Jan 2003 20:23:27 +0100 From: Jens Axboe To: Martin MOKREJ? , Ross Biro Cc: linux-kernel@vger.kernel.org Subject: Re: 2.4.21-pre3 kernel crash Message-ID: <20030127192327.GD889@suse.de> References: <3E356403.9010805@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jan 27 2003, Martin MOKREJ? wrote: > On Mon, 27 Jan 2003, Ross Biro wrote: > > > This looks like the same problem I ran into with IDE and highmem not > > getting along. Try compiling your kernel with out highmem enabled and > > see what happenes. > > Yes, that "fixes" it. Any "better solution"? ;-) > > > >Trace; c024dfc1 > > >Trace; c024e1b4 > > >Trace; c024e6df <__ide_dma_read+3f/150> Someone completely lost the highmem capable scatterlist setup, *boggle*. This should fix it. ===== drivers/ide/ide-dma.c 1.7 vs edited ===== --- 1.7/drivers/ide/ide-dma.c Wed Nov 20 18:46:24 2002 +++ edited/drivers/ide/ide-dma.c Mon Jan 27 20:22:06 2003 @@ -249,6 +249,7 @@ { struct buffer_head *bh; struct scatterlist *sg = hwif->sg_table; + unsigned long lastdataend = ~0UL; int nents = 0; if (hwif->sg_dma_active) @@ -256,22 +257,28 @@ bh = rq->bh; do { - unsigned char *virt_addr = bh->b_data; - unsigned int size = bh->b_size; + if (bh_phys(bh) == lastdataend) { + sg[nents - 1].length += bh->b_size; + lastdataend += bh->b_size; + continue; + } if (nents >= PRD_ENTRIES) return 0; - while ((bh = bh->b_reqnext) != NULL) { - if ((virt_addr + size) != (unsigned char *) bh->b_data) - break; - size += bh->b_size; - } memset(&sg[nents], 0, sizeof(*sg)); - sg[nents].address = virt_addr; - sg[nents].length = size; - if(size == 0) - BUG(); + if (bh->b_page) { + sg[nents].page = bh->b_page; + sg[nents].offset = bh_offset(bh); + } else { + if (((unsigned long) bh->b_data) < PAGE_SIZE) + BUG(); + + sg[nents].address = bh->b_data; + } + + sg[nents].length = bh->b_size; + lastdataend = bh_phys(bh) + bh->b_size; nents++; } while (bh != NULL); -- Jens Axboe - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/