• Marek Szyprowski's avatar
    drm: i915: fix common struct sg_table related issues · b827e3ac
    Marek Szyprowski authored
    The Documentation/DMA-API-HOWTO.txt states that the dma_map_sg() function
    returns the number of the created entries in the DMA address space.
    However the subsequent calls to the dma_sync_sg_for_{device,cpu}() and
    dma_unmap_sg must be called with the original number of the entries
    passed to the dma_map_sg().
    
    struct sg_table is a common structure used for describing a non-contiguous
    memory buffer, used commonly in the DRM and graphics subsystems. It
    consists of a scatterlist with memory pages and DMA addresses (sgl entry),
    as well as the number of scatterlist entries: CPU pages (orig_nents entry)
    and DMA mapped pages (nents entry).
    
    It turned out that it was a common mistake to misuse nents and orig_nents
    entries, calling DMA-mapping functions with a wrong number of entries or
    ignoring the number of mapped entries returned by the dma_map_sg()
    function.
    
    This driver creatively uses sg_table->orig_nents to store the size of the
    allocated scatterlist and ignores the number of the entries returned by
    dma_map_sg function. The sg_table->orig_nents is (mis)used to properly
    free the (over)allocated scatterlist.
    
    This patch only introduces the common DMA-mapping wrappers operating
    directly on the struct sg_table objects to the dmabuf related functions,
    so the other drivers, which might share buffers with i915 could rely on
    the properly set nents and orig_nents values.
    Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
    b827e3ac
i915_gem_dmabuf.c 6.71 KB