agp/intel: Destroy the scatterlist on allocation failure
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 24 Jul 2010 17:29:37 +0000 (18:29 +0100)
committerEric Anholt <eric@anholt.net>
Mon, 2 Aug 2010 02:35:14 +0000 (19:35 -0700)
A side-effect of being able to use custom page allocations with the
sg_table is that it cannot reap the partially constructed scatterlist if
fails to allocate a page. So we need to call sg_free_table() ourselves
if sg_alloc_table() fails.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc Dave Airlie <airlied@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/char/agp/intel-gtt.c

index 0c6d0fe..f804325 100644 (file)
@@ -104,7 +104,7 @@ static int intel_agp_map_memory(struct agp_memory *mem)
        DBG("try mapping %lu pages\n", (unsigned long)mem->page_count);
 
        if (sg_alloc_table(&st, mem->page_count, GFP_KERNEL))
-               return -ENOMEM;
+               goto err;
 
        mem->sg_list = sg = st.sgl;
 
@@ -113,11 +113,14 @@ static int intel_agp_map_memory(struct agp_memory *mem)
 
        mem->num_sg = pci_map_sg(intel_private.pcidev, mem->sg_list,
                                 mem->page_count, PCI_DMA_BIDIRECTIONAL);
-       if (unlikely(!mem->num_sg)) {
-               intel_agp_free_sglist(mem);
-               return -ENOMEM;
-       }
+       if (unlikely(!mem->num_sg))
+               goto err;
+
        return 0;
+
+err:
+       sg_free_table(&st);
+       return -ENOMEM;
 }
 
 static void intel_agp_unmap_memory(struct agp_memory *mem)