From patchwork Tue Jul 28 08:53:16 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joonyoung Shim X-Patchwork-Id: 6880841 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 521579F38B for ; Tue, 28 Jul 2015 08:53:36 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5737D2071C for ; Tue, 28 Jul 2015 08:53:35 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id E7E1E206D2 for ; Tue, 28 Jul 2015 08:53:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B0E0D6E844; Tue, 28 Jul 2015 01:53:32 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by gabe.freedesktop.org (Postfix) with ESMTPS id 365A06E844 for ; Tue, 28 Jul 2015 01:53:31 -0700 (PDT) Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NS6031J0WP5EF90@mailout4.samsung.com> for dri-devel@lists.freedesktop.org; Tue, 28 Jul 2015 17:53:29 +0900 (KST) Received: from epcpsbgm1new.samsung.com ( [172.20.52.112]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id F2.30.28411.90347B55; Tue, 28 Jul 2015 17:53:29 +0900 (KST) X-AuditID: cbfee68e-f79c56d000006efb-17-55b74309dcc4 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1new.samsung.com (EPCPMTA) with SMTP id 35.0F.23663.90347B55; Tue, 28 Jul 2015 17:53:29 +0900 (KST) Received: from localhost.localdomain ([10.252.81.123]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NS60042VWP4KW00@mmp2.samsung.com>; Tue, 28 Jul 2015 17:53:28 +0900 (KST) From: Joonyoung Shim To: dri-devel@lists.freedesktop.org Subject: [PATCH 01/14] drm/exynos: stop using sgtable in page fault handler Date: Tue, 28 Jul 2015 17:53:16 +0900 Message-id: <1438073609-32664-1-git-send-email-jy0922.shim@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCLMWRmVeSWpSXmKPExsWyRsSkQJfTeXuoQesJQYsrX9+zWUy6P4HF 4sW9iywWMya/ZHNg8bjffZzJo2/LKsYApigum5TUnMyy1CJ9uwSujHUXvrMXHFes2N3Yzd7A OFmmi5GTQ0LARGLKyUWsELaYxIV769m6GLk4hARWMEqcOXGZDabo1przzBCJWYwSN469ZwFJ CAn8YJT4tsQUxGYT0JO4s+04E4gtIqAs8XfiKkYQm1nAU2LFqnlgcWEBb4mV708ADeXgYBFQ ldi2TxTE5BVwl3i63hxilZzEyWOTWUFWSQjcZpO4MXEp2BgWAQGJb5MPsYDUSwjISmw6wAxR LylxcMUNlgmMggsYGVYxiqYWJBcUJ6UXGekVJ+YWl+al6yXn525iBAbe6X/P+nYw3jxgfYhR gINRiYd3wrptoUKsiWXFlbmHGE2BNkxklhJNzgeGd15JvKGxmZGFqYmpsZG5pZmSOG+C1M9g IYH0xJLU7NTUgtSi+KLSnNTiQ4xMHJxSDYxTJK4dkn0pwlD/1DO+ckXExG2+v14HHSk/9yz8 3pvmRwzxoQ2G6j9mcc2dLbTrvp2miJKT09vDQtc/Py2s26/SNavhTU/WYYEdYdxTuSvOlc2L MfVxDW889ee67nbWxn9WaTHhp4JmLq22irtwfd3P/niu6xeFH9doNIldXbjERIXJwedT9gIl luKMREMt5qLiRADC35t7NwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrILMWRmVeSWpSXmKPExsVy+t9jQV1O5+2hBgvm81hc+fqezWLS/Qks Fi/uXWSxmDH5JZsDi8f97uNMHn1bVjEGMEU1MNpkpCampBYppOYl56dk5qXbKnkHxzvHm5oZ GOoaWlqYKynkJeam2iq5+AToumXmAK1SUihLzCkFCgUkFhcr6dthmhAa4qZrAdMYoesbEgTX Y2SABhLWMGasu/CdveC4YsXuxm72BsbJMl2MnBwSAiYSt9acZ4awxSQu3FvP1sXIxSEkMItR 4sax9ywgCSGBH4wS35aYgthsAnoSd7YdZwKxRQSUJf5OXMUIYjMLeEqsWDUPLC4s4C2x8v0J oEEcHCwCqhLb9omCmLwC7hJP15tDrJKTOHlsMusERu4FjAyrGCVSC5ILipPScw3zUsv1ihNz i0vz0vWS83M3MYKD+5nUDsaDu9wPMQpwMCrx8E5Yty1UiDWxrLgy9xCjBAezkgjvH8PtoUK8 KYmVValF+fFFpTmpxYcYTYHWT2SWEk3OB0ZeXkm8obGJmZGlkbmhhZGxuZI4r+yGzaFCAumJ JanZqakFqUUwfUwcnFINjBYNPR+3CX7QaTCe3XbnrcIP/T2Prf2r9p06kTHvfNezS1YlcXVC agVxHf2lacw+fB8t5h7Z9Lbadv+VdInHgal7r+d45F6+bjptrkh/yu51CdVfOre6i/vZ3Std epx9f/jVzQVcO1Qf7FP7wSYfxfTrPkPzbetccf2bCg0p2uxGTTYr3Ip8lFiKMxINtZiLihMB idktUoQCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Cc: sw0312.kim@samsung.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-5.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Already struct exynos_drm_gem_buf has pages of the buffer when buffer is created, so just can use pages in page fault handler, we don't have to make sgtable of the buffer. But this needs to construct pages of the buffer that is imported from dma-buf prime. Signed-off-by: Joonyoung Shim --- drivers/gpu/drm/exynos/exynos_drm_buf.c | 16 ---------------- drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | 18 ++++++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_gem.c | 14 +------------- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c index 24994ba..9260dfb 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c @@ -90,23 +90,12 @@ static int lowlevel_buffer_allocate(struct drm_device *dev, } } - buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages); - if (IS_ERR(buf->sgt)) { - DRM_ERROR("failed to get sg table.\n"); - ret = PTR_ERR(buf->sgt); - goto err_free_attrs; - } - DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", (unsigned long)buf->dma_addr, buf->size); return ret; -err_free_attrs: - dma_free_attrs(dev->dev, buf->size, buf->pages, - (dma_addr_t)buf->dma_addr, &buf->dma_attrs); - buf->dma_addr = (dma_addr_t)NULL; err_free: if (!is_drm_iommu_supported(dev)) drm_free_large(buf->pages); @@ -126,11 +115,6 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev, (unsigned long)buf->dma_addr, buf->size); - sg_free_table(buf->sgt); - - kfree(buf->sgt); - buf->sgt = NULL; - if (!is_drm_iommu_supported(dev)) { dma_free_attrs(dev->dev, buf->size, buf->cookie, (dma_addr_t)buf->dma_addr, &buf->dma_attrs); diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index cd485c0..d10f9b6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c @@ -203,6 +203,7 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, struct scatterlist *sgl; struct exynos_drm_gem_obj *exynos_gem_obj; struct exynos_drm_gem_buf *buffer; + int npages; int ret; /* is this one of own objects? */ @@ -251,6 +252,20 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, buffer->size = dma_buf->size; buffer->dma_addr = sg_dma_address(sgl); + npages = dma_buf->size >> PAGE_SHIFT; + buffer->pages = drm_malloc_ab(npages, sizeof(struct page *)); + if (!buffer->pages) { + ret = -ENOMEM; + goto err_free_gem; + } + + ret = drm_prime_sg_to_page_addr_arrays(sgt, buffer->pages, NULL, + npages); + if (ret < 0) { + drm_free_large(buffer->pages); + goto err_free_gem; + } + if (sgt->nents == 1) { /* always physically continuous memory if sgt->nents is 1. */ exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; @@ -273,6 +288,9 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, return &exynos_gem_obj->base; +err_free_gem: + drm_gem_object_release(&exynos_gem_obj->base); + kfree(exynos_gem_obj); err_free_buffer: kfree(buffer); buffer = NULL; diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 0d5b969..d320acd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -83,26 +83,14 @@ static int exynos_drm_gem_map_buf(struct drm_gem_object *obj, { struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); struct exynos_drm_gem_buf *buf = exynos_gem_obj->buffer; - struct scatterlist *sgl; unsigned long pfn; - int i; - - if (!buf->sgt) - return -EINTR; if (page_offset >= (buf->size >> PAGE_SHIFT)) { DRM_ERROR("invalid page offset\n"); return -EINVAL; } - sgl = buf->sgt->sgl; - for_each_sg(buf->sgt->sgl, sgl, buf->sgt->nents, i) { - if (page_offset < (sgl->length >> PAGE_SHIFT)) - break; - page_offset -= (sgl->length >> PAGE_SHIFT); - } - - pfn = __phys_to_pfn(sg_phys(sgl)) + page_offset; + pfn = page_to_pfn(buf->pages[page_offset]); return vm_insert_mixed(vma, f_vaddr, pfn); }