From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vlastimil Babka Subject: Re: [PATCH 9/9] drm/exynos: Convert g2d_userptr_get_dma_addr() to use get_vaddr_frames() Date: Wed, 06 May 2015 12:47:35 +0200 Message-ID: <5549F147.3050800@suse.cz> References: <1430897296-5469-1-git-send-email-jack@suse.cz> <1430897296-5469-10-git-send-email-jack@suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from cantor2.suse.de ([195.135.220.15]:48142 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751329AbbEFKrh (ORCPT ); Wed, 6 May 2015 06:47:37 -0400 In-Reply-To: <1430897296-5469-10-git-send-email-jack@suse.cz> Sender: linux-samsung-soc-owner@vger.kernel.org List-Id: linux-samsung-soc@vger.kernel.org To: Jan Kara , linux-mm@kvack.org Cc: linux-media@vger.kernel.org, Hans Verkuil , dri-devel@lists.freedesktop.org, Pawel Osciak , Mauro Carvalho Chehab , mgorman@suse.de, Marek Szyprowski , linux-samsung-soc@vger.kernel.org On 05/06/2015 09:28 AM, Jan Kara wrote: > Convert g2d_userptr_get_dma_addr() to pin pages using get_vaddr_frames(). > This removes the knowledge about vmas and mmap_sem locking from exynos > driver. Also it fixes a problem that the function has been mapping user > provided address without holding mmap_sem. > > Signed-off-by: Jan Kara > --- > drivers/gpu/drm/exynos/exynos_drm_g2d.c | 89 ++++++++++-------------------- > drivers/gpu/drm/exynos/exynos_drm_gem.c | 97 --------------------------------- > 2 files changed, 29 insertions(+), 157 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c > index 81a250830808..265519c0fe2d 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c ... > @@ -456,65 +458,37 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev, > return ERR_PTR(-ENOMEM); > > atomic_set(&g2d_userptr->refcount, 1); > + g2d_userptr->size = size; > > start = userptr & PAGE_MASK; > offset = userptr & ~PAGE_MASK; > end = PAGE_ALIGN(userptr + size); > npages = (end - start) >> PAGE_SHIFT; > - g2d_userptr->npages = npages; > - > - pages = drm_calloc_large(npages, sizeof(struct page *)); > - if (!pages) { > - DRM_ERROR("failed to allocate pages.\n"); > - ret = -ENOMEM; > + vec = g2d_userptr->vec = frame_vector_create(npages); > + if (!vec) > goto err_free; > - } > > - down_read(¤t->mm->mmap_sem); > - vma = find_vma(current->mm, userptr); > - if (!vma) { > - up_read(¤t->mm->mmap_sem); > - DRM_ERROR("failed to get vm region.\n"); > + ret = get_vaddr_frames(start, npages, 1, 1, vec); Use true instead of 1.