>From 4201962b743a44325ff848ba6387d3710343c123 Mon Sep 17 00:00:00 2001 From: Konrad Rzeszutek Wilk Date: Fri, 17 May 2013 18:13:35 -0400 Subject: [PATCH 1/2] drm/i915: Don't leak a page in case of DMA error mapping. We don't free the allocated page if we fail to setup the DMA mapping. This fixes it. Signed-off-by: Konrad Rzeszutek Wilk --- drivers/char/agp/intel-gtt.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index dbd901e..701b328 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c @@ -294,9 +294,10 @@ static int intel_gtt_setup_scratch_page(void) if (intel_private.base.needs_dmar) { dma_addr = pci_map_page(intel_private.pcidev, page, 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - if (pci_dma_mapping_error(intel_private.pcidev, dma_addr)) + if (pci_dma_mapping_error(intel_private.pcidev, dma_addr)) { + __intel_gtt_teardown_scratch_page(); return -EINVAL; - + } intel_private.base.scratch_page_dma = dma_addr; } else intel_private.base.scratch_page_dma = page_to_phys(page); @@ -542,15 +543,18 @@ static unsigned int intel_gtt_mappable_entries(void) return aperture_size >> PAGE_SHIFT; } - -static void intel_gtt_teardown_scratch_page(void) +static void __intel_gtt_teardown_scratch_page(void) { set_pages_wb(intel_private.scratch_page, 1); - pci_unmap_page(intel_private.pcidev, intel_private.base.scratch_page_dma, - PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); put_page(intel_private.scratch_page); __free_page(intel_private.scratch_page); } +static void intel_gtt_teardown_scratch_page(void) +{ + pci_unmap_page(intel_private.pcidev, intel_private.base.scratch_page_dma, + PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); + __intel_gtt_teardown_scratch_page(); +} static void intel_gtt_cleanup(void) { -- 1.8.1.2