[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 18/21] x86/amd_gart: return error code from gart_map_sg()



From: Martin Oliveira <martin.oliveira@xxxxxxxxxxxxx>

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@xxxxxxxxxxxxx>
Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Borislav Petkov <bp@xxxxxxxxx>
Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
Cc: Niklas Schnelle <schnelle@xxxxxxxxxxxxx>
Cc: Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx>
Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
---
 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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.