From patchwork Mon May 21 17:12:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Souptick Joarder X-Patchwork-Id: 10417389 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A704C60224 for ; Tue, 22 May 2018 07:02:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 950C328B17 for ; Tue, 22 May 2018 07:02:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 87E6928B44; Tue, 22 May 2018 07:02:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 71BFE28B40 for ; Tue, 22 May 2018 07:02:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CE6D26E0DE; Tue, 22 May 2018 07:01:55 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pf0-x242.google.com (mail-pf0-x242.google.com [IPv6:2607:f8b0:400e:c00::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4E7356E467; Mon, 21 May 2018 17:10:29 +0000 (UTC) Received: by mail-pf0-x242.google.com with SMTP id p14-v6so7386638pfh.9; Mon, 21 May 2018 10:10:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=hAT+vduhl7ftTfhc5zghJ3An2PwTReT3hhggHHaGDlA=; b=WEGSRw56YXCUXEtoKDsJQSVk/epPMbVzRiPjRauXz313y6LmoiogHF3RLmJNYSLQMD 2h8NvbHHKlfKdW79dVGnVRVMdj5Ky+kq4VMv9y/PWQdehX3UcAOPxwOebYlokoGAVyDI RKvpK1mS5l48Ra68N9Hn5QmEGJm52o4eNib5OcYrNMF3cHVrnKkmOIrjukkmXs1olOKj KfZrRWh47awVISbzEia/m3Q1g7OqZLSVp1B1z34kt2qN6a7Z+v2+23Ccq22e/2ON9vk2 W+pbrjGwkgLj07WZPvSM5yt3VMTjby1NFsjROUqYkWGWgSajGFc6taZM7oDoaOfBMeeQ LScw== X-Gm-Message-State: ALKqPwdRkfPBbPwr9UxEOuhuZnVALk0nDDFHkKuz6Wp2HgFgWMCapee1 lMIQAN3kCl50RPPjgJKffW4= X-Google-Smtp-Source: AB8JxZp9sXwEIAYjCRnT+nZujs4pi1jHFqtJPqBVddxqXkXM+OYh+SWvKD37dLxoBeOWeU6fvklfvQ== X-Received: by 2002:a65:40cd:: with SMTP id u13-v6mr4354464pgp.372.1526922628820; Mon, 21 May 2018 10:10:28 -0700 (PDT) Received: from jordon-HP-15-Notebook-PC ([183.82.18.139]) by smtp.gmail.com with ESMTPSA id k12-v6sm19845348pgq.23.2018.05.21.10.10.26 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 21 May 2018 10:10:27 -0700 (PDT) Date: Mon, 21 May 2018 22:42:41 +0530 From: Souptick Joarder To: l.stach@pengutronix.de, linux+etnaviv@armlinux.org.uk, christian.gmeiner@gmail.com, airlied@linux.ie, willy@infradead.org, daniel.vetter@ffwll.ch Subject: [PATCH] gpu: drm: etnaviv: Change return type to vm_fault_t Message-ID: <20180521171241.GA18441@jordon-HP-15-Notebook-PC> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Mailman-Approved-At: Tue, 22 May 2018 07:01:46 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Use new return type vm_fault_t for fault handler. For now, this is just documenting that the function returns a VM_FAULT value rather than an errno. Once all instances are converted, vm_fault_t will become a distinct type. Ref- commit 1c8f422059ae ("mm: change return type to vm_fault_t") Previously vm_insert_page() returns err which driver mapped into VM_FAULT_* type. The new function vmf_insert_page() will replace this inefficiency by returning VM_FAULT_* type. A non-fatal signal being delivered to a task which is in the middle of a page fault may well end up in an infinite loop, attempting to handle the page fault and failing forever. On seeing NOPAGE, the fault handler believes the PTE is in the page table, so does nothing before it returns to arch code. It will end up returning to userspace if the signal is non-fatal, at which point it'll go right back into the page fault handler, and mutex_lock_interruptible() will immediately fail. So we've converted a sleeping lock into the most expensive spinlock. I don't think the graphics drivers really want to be interrupted by any signal. I think they want to be interruptible by fatal signals and should use the mutex_lock_killable / fatal_signal_pending family of functions. So mutex_lock_interruptible() is replaced by mutex_lock_killable() vmf_error() is the newly introduce inline function in 4.17-rc6. Signed-off-by: Souptick Joarder --- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 3 ++- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 31 ++++++------------------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h index a54f0b7..f6777f0 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -62,7 +63,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_file *file); int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma); -int etnaviv_gem_fault(struct vm_fault *vmf); +vm_fault_t etnaviv_gem_fault(struct vm_fault *vmf); int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset); struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj); void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj); diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c index fcc969f..d9b13f0 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -180,7 +180,7 @@ int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma) return obj->ops->mmap(obj, vma); } -int etnaviv_gem_fault(struct vm_fault *vmf) +vm_fault_t etnaviv_gem_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct drm_gem_object *obj = vma->vm_private_data; @@ -191,20 +191,19 @@ int etnaviv_gem_fault(struct vm_fault *vmf) /* * Make sure we don't parallel update on a fault, nor move or remove - * something from beneath our feet. Note that vm_insert_page() is + * something from beneath our feet. Note that vmf_insert_page() is * specifically coded to take care of this, so we don't have to. */ - ret = mutex_lock_interruptible(&etnaviv_obj->lock); + ret = mutex_lock_killable(&etnaviv_obj->lock); if (ret) - goto out; - + return VM_FAULT_NOPAGE; /* make sure we have pages attached now */ pages = etnaviv_gem_get_pages(etnaviv_obj); mutex_unlock(&etnaviv_obj->lock); if (IS_ERR(pages)) { ret = PTR_ERR(pages); - goto out; + return vmf_error(ret); } /* We don't use vmf->pgoff since that has the fake offset: */ @@ -215,25 +214,7 @@ int etnaviv_gem_fault(struct vm_fault *vmf) VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address, page_to_pfn(page), page_to_pfn(page) << PAGE_SHIFT); - ret = vm_insert_page(vma, vmf->address, page); - -out: - switch (ret) { - case -EAGAIN: - case 0: - case -ERESTARTSYS: - case -EINTR: - case -EBUSY: - /* - * EBUSY is ok: this just means that another thread - * already did the job. - */ - return VM_FAULT_NOPAGE; - case -ENOMEM: - return VM_FAULT_OOM; - default: - return VM_FAULT_SIGBUS; - } + return vmf_insert_page(vma, vmf->address, page); } int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset)