lkml.org 
[lkml]   [2003]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.4.21-pre3 kernel crash
    On Tue, Jan 28 2003, J.A. Magallon wrote:
    >
    > On 2003.01.27 Jens Axboe wrote:
    > > 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 <ide_build_sglist+181/1a0>
    > > > > >Trace; c024e1b4 <ide_build_dmatable+54/1a0>
    > > > > >Trace; c024e6df <__ide_dma_read+3f/150>
    > >
    > > Someone completely lost the highmem capable scatterlist setup, *boggle*.
    > > This should fix it.
    > >
    >
    > Applied on top of 2.4.21-pre3-aa (no highmem), it makes my box hang on drive
    > detection:
    >
    > PIIX4: IDE controller at PCI slot 00:07.1
    > PIIX4: chipset revision 1
    > PIIX4: not 100% native mode: will probe irqs later
    > ide0: BM-DMA at 0xffa0-0xffa7, BIOS settings: hda:DMA, hdb:DMA
    > ide1: BM-DMA at 0xffa8-0xffaf, BIOS settings: hdc:DMA, hdd:pio
    > hda:
    >
    > <hangs here>
    >
    > normal startup says:
    >
    > hda: Conner Peripherals 1080MB - CFS1081A, ATA DISK drive
    > hdb: TOSHIBA DVD-ROM SD-M1712, ATAPI CD/DVD-ROM drive
    > blk: queue 403386e0, I/O limit 4095Mb (mask 0xffffffff)
    > hdc: YAMAHA CRW8424E, ATAPI CD/DVD-ROM drive
    > hdd: IOMEGA ZIP 250 ATAPI, ATAPI FLOPPY drive
    > ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
    > ide1 at 0x170-0x177,0x376 on irq 15
    > hda: task_no_data_intr: status=0x51 { DriveReady SeekComplete Error }
    > hda: task_no_data_intr: error=0x04 { DriveStatusError }
    > hda: 2114180 sectors (1082 MB), CHS=524/64/63, DMA

    Reviewing the patch, it did have a nasty bug, didn't iterate
    buffer_heads at all so a clustered request will fail. Attached version
    should work.

    ===== 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 Tue Jan 28 00:23:45 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,24 +257,30 @@

    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);
    + } while ((bh = bh->b_reqnext) != NULL);

    if(nents == 0)
    BUG();
    --
    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/

    \
     
     \ /
      Last update: 2005-03-22 13:32    [W:0.024 / U:1.100 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site