lkml.org 
[lkml]   [2004]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [BUG] x86_64 pci_map_sg modifies sg list - fails multiple map/unmaps II
    On Mon, 5 Jan 2004 22:31:58 +0100
    Andi Kleen <ak@suse.de> wrote:

    > For the sake of bug-to-bug compatibility to the SCSI layer this patch may
    > work. I haven't tested it so no guarantees if it won't eat your file systems.
    > Feedback welcome anyways.

    [...]

    This version will likely work better (original still set ->length to zero)

    -Andi

    diff -u linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h-o linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h
    --- linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h-o 2003-07-18 02:40:01.000000000 +0200
    +++ linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h 2004-01-05 22:10:15.000000000 +0100
    @@ -4,8 +4,9 @@
    struct scatterlist {
    struct page *page;
    unsigned int offset;
    - unsigned int length;
    + unsigned int length;
    dma_addr_t dma_address;
    + unsigned int dma_length;
    };

    #define ISA_DMA_THRESHOLD (0x00ffffff)
    diff -u linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h-o linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h
    --- linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h-o 2003-07-18 02:40:01.000000000 +0200
    +++ linux-2.6.1rc1-amd64/include/asm-x86_64/scatterlist.h 2004-01-05 22:10:15.000000000 +0100
    @@ -4,8 +4,9 @@
    struct scatterlist {
    struct page *page;
    unsigned int offset;
    - unsigned int length;
    + unsigned int length;
    dma_addr_t dma_address;
    + unsigned int dma_length;
    };

    #define ISA_DMA_THRESHOLD (0x00ffffff)
    diff -u linux-2.6.1rc1-amd64/arch/x86_64/kernel/pci-gart.c-o linux-2.6.1rc1-amd64/arch/x86_64/kernel/pci-gart.c
    --- linux-2.6.1rc1-amd64/arch/x86_64/kernel/pci-gart.c-o 2004-01-01 06:40:28.000000000 +0100
    +++ linux-2.6.1rc1-amd64/arch/x86_64/kernel/pci-gart.c 2004-01-05 22:37:59.000000000 +0100
    @@ -384,6 +395,7 @@
    }
    }
    s->dma_address = addr;
    + s->dma_length = s->length;
    }
    flush_gart(dev);
    return nents;
    @@ -410,8 +422,9 @@
    *sout = *s;
    sout->dma_address = iommu_bus_base;
    sout->dma_address += iommu_page*PAGE_SIZE + s->offset;
    + sout->dma_length = s->length;
    } else {
    - sout->length += s->length;
    + sout->dma_length += s->length;
    }

    addr = phys_addr;
    @@ -490,8 +503,8 @@
    goto error;
    out++;
    flush_gart(dev);
    - if (out < nents)
    - sg[out].length = 0;
    + if (out < nents)
    + sg[out].dma_length = 0;
    return out;

    error:
    @@ -538,9 +551,9 @@
    int i;
    for (i = 0; i < nents; i++) {
    struct scatterlist *s = &sg[i];
    - if (!s->length)
    + if (!s->dma_length || !s->length)
    break;
    - pci_unmap_single(dev, s->dma_address, s->length, dir);
    + pci_unmap_single(dev, s->dma_address, s->dma_length, dir);
    }
    }

    -
    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:59    [W:0.047 / U:89.960 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site