| From 2544e6a052e7c1f5ce449e9e6bd1021d0fbb5e2d Mon Sep 17 00:00:00 2001 |
| From: Chris Wilson <chris@chris-wilson.co.uk> |
| Date: Sun, 2 Feb 2020 17:16:31 +0000 |
| Subject: [PATCH] drm: Remove PageReserved manipulation from drm_pci_alloc |
| |
| commit ea36ec8623f56791c6ff6738d0509b7920f85220 upstream. |
| |
| drm_pci_alloc/drm_pci_free are very thin wrappers around the core dma |
| facilities, and we have no special reason within the drm layer to behave |
| differently. In particular, since |
| |
| commit de09d31dd38a50fdce106c15abd68432eebbd014 |
| Author: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Date: Fri Jan 15 16:51:42 2016 -0800 |
| |
| page-flags: define PG_reserved behavior on compound pages |
| |
| As far as I can see there's no users of PG_reserved on compound pages. |
| Let's use PF_NO_COMPOUND here. |
| |
| it has been illegal to combine GFP_COMP with SetPageReserved, so lets |
| stop doing both and leave the dma layer to its own devices. |
| |
| Reported-by: Taketo Kabe |
| Bug: https://gitlab.freedesktop.org/drm/intel/issues/1027 |
| Fixes: de09d31dd38a ("page-flags: define PG_reserved behavior on compound pages") |
| Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Cc: <stable@vger.kernel.org> # v4.5+ |
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20200202171635.4039044-1-chris@chris-wilson.co.uk |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c |
| index 693748ad8b88..18f070634170 100644 |
| --- a/drivers/gpu/drm/drm_pci.c |
| +++ b/drivers/gpu/drm/drm_pci.c |
| @@ -46,8 +46,6 @@ |
| drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t align) |
| { |
| drm_dma_handle_t *dmah; |
| - unsigned long addr; |
| - size_t sz; |
| |
| /* pci_alloc_consistent only guarantees alignment to the smallest |
| * PAGE_SIZE order which is greater than or equal to the requested size. |
| @@ -63,20 +61,13 @@ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t ali |
| dmah->size = size; |
| dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, |
| &dmah->busaddr, |
| - GFP_KERNEL | __GFP_COMP); |
| + GFP_KERNEL); |
| |
| if (dmah->vaddr == NULL) { |
| kfree(dmah); |
| return NULL; |
| } |
| |
| - /* XXX - Is virt_to_page() legal for consistent mem? */ |
| - /* Reserve */ |
| - for (addr = (unsigned long)dmah->vaddr, sz = size; |
| - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { |
| - SetPageReserved(virt_to_page((void *)addr)); |
| - } |
| - |
| return dmah; |
| } |
| |
| @@ -89,19 +80,9 @@ EXPORT_SYMBOL(drm_pci_alloc); |
| */ |
| void __drm_legacy_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah) |
| { |
| - unsigned long addr; |
| - size_t sz; |
| - |
| - if (dmah->vaddr) { |
| - /* XXX - Is virt_to_page() legal for consistent mem? */ |
| - /* Unreserve */ |
| - for (addr = (unsigned long)dmah->vaddr, sz = dmah->size; |
| - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { |
| - ClearPageReserved(virt_to_page((void *)addr)); |
| - } |
| + if (dmah->vaddr) |
| dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr, |
| dmah->busaddr); |
| - } |
| } |
| |
| /** |
| -- |
| 2.7.4 |
| |