lkml.org 
[lkml]   [2021]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v1 14/16] x86/amd_gart: return error code from gart_map_sg()
    From: Martin Oliveira <martin.oliveira@eideticom.com>

    The .map_sg() op now expects an error code instead of zero on failure.

    So make __dma_map_cont() return a valid errno (which is then propagated
    to gart_map_sg() via dma_map_cont()) and return it in case of failure.

    Also, return -EINVAL in case of invalid nents.

    Signed-off-by: Martin Oliveira <martin.oliveira@eideticom.com>
    Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Niklas Schnelle <schnelle@linux.ibm.com>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    ---
    arch/x86/kernel/amd_gart_64.c | 16 +++++++++-------
    1 file changed, 9 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c
    index 9ac696487b13..46aea9a4f26b 100644
    --- a/arch/x86/kernel/amd_gart_64.c
    +++ b/arch/x86/kernel/amd_gart_64.c
    @@ -331,7 +331,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start,
    int i;

    if (iommu_start == -1)
    - return -1;
    + return -ENOMEM;

    for_each_sg(start, s, nelems, i) {
    unsigned long pages, addr;
    @@ -380,13 +380,13 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
    enum dma_data_direction dir, unsigned long attrs)
    {
    struct scatterlist *s, *ps, *start_sg, *sgmap;
    - int need = 0, nextneed, i, out, start;
    + int need = 0, nextneed, i, out, start, ret;
    unsigned long pages = 0;
    unsigned int seg_size;
    unsigned int max_seg_size;

    if (nents == 0)
    - return 0;
    + return -EINVAL;

    out = 0;
    start = 0;
    @@ -414,8 +414,9 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
    if (!iommu_merge || !nextneed || !need || s->offset ||
    (s->length + seg_size > max_seg_size) ||
    (ps->offset + ps->length) % PAGE_SIZE) {
    - if (dma_map_cont(dev, start_sg, i - start,
    - sgmap, pages, need) < 0)
    + ret = dma_map_cont(dev, start_sg, i - start,
    + sgmap, pages, need);
    + if (ret < 0)
    goto error;
    out++;

    @@ -432,7 +433,8 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
    pages += iommu_num_pages(s->offset, s->length, PAGE_SIZE);
    ps = s;
    }
    - if (dma_map_cont(dev, start_sg, i - start, sgmap, pages, need) < 0)
    + ret = dma_map_cont(dev, start_sg, i - start, sgmap, pages, need);
    + if (ret < 0)
    goto error;
    out++;
    flush_gart();
    @@ -458,7 +460,7 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
    iommu_full(dev, pages << PAGE_SHIFT, dir);
    for_each_sg(sg, s, nents, i)
    s->dma_address = DMA_MAPPING_ERROR;
    - return 0;
    + return ret;
    }

    /* allocate and map a coherent mapping */
    --
    2.20.1
    \
     
     \ /
      Last update: 2021-07-15 18:47    [W:4.428 / U:0.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site