aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSouptick Joarder <jrdr.linux@gmail.com>2018-05-29 09:47:27 -0400
committerLucas Stach <l.stach@pengutronix.de>2018-08-06 09:24:18 -0400
commitcfad05a24dcb2bf09ba6438e0843c6a0ed90381c (patch)
treeb21454557122ace82b66a31284b644359194ee2b
parenta0780bb1df60f00e4573db7bd53e7039e9eee1cb (diff)
drm/etnaviv: change return type to vm_fault_t
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. vmf_error() is the newly introduce inline function in 4.17-rc6. Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com> Reviewed-by: Matthew Wilcox <mawilcox@microsoft.com> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_drv.h3
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c37
2 files changed, 11 insertions, 29 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
index d36c7bbe66db..8d02d1b7dcf5 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
@@ -18,6 +18,7 @@
18#include <linux/time64.h> 18#include <linux/time64.h>
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/sizes.h> 20#include <linux/sizes.h>
21#include <linux/mm_types.h>
21 22
22#include <drm/drmP.h> 23#include <drm/drmP.h>
23#include <drm/drm_crtc_helper.h> 24#include <drm/drm_crtc_helper.h>
@@ -53,7 +54,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
53 struct drm_file *file); 54 struct drm_file *file);
54 55
55int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma); 56int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma);
56int etnaviv_gem_fault(struct vm_fault *vmf); 57vm_fault_t etnaviv_gem_fault(struct vm_fault *vmf);
57int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset); 58int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset);
58struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj); 59struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj);
59void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj); 60void *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 209ef1274b80..1fa74226db91 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -169,31 +169,30 @@ int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma)
169 return obj->ops->mmap(obj, vma); 169 return obj->ops->mmap(obj, vma);
170} 170}
171 171
172int etnaviv_gem_fault(struct vm_fault *vmf) 172vm_fault_t etnaviv_gem_fault(struct vm_fault *vmf)
173{ 173{
174 struct vm_area_struct *vma = vmf->vma; 174 struct vm_area_struct *vma = vmf->vma;
175 struct drm_gem_object *obj = vma->vm_private_data; 175 struct drm_gem_object *obj = vma->vm_private_data;
176 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); 176 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
177 struct page **pages, *page; 177 struct page **pages, *page;
178 pgoff_t pgoff; 178 pgoff_t pgoff;
179 int ret; 179 int err;
180 180
181 /* 181 /*
182 * Make sure we don't parallel update on a fault, nor move or remove 182 * Make sure we don't parallel update on a fault, nor move or remove
183 * something from beneath our feet. Note that vm_insert_page() is 183 * something from beneath our feet. Note that vmf_insert_page() is
184 * specifically coded to take care of this, so we don't have to. 184 * specifically coded to take care of this, so we don't have to.
185 */ 185 */
186 ret = mutex_lock_interruptible(&etnaviv_obj->lock); 186 err = mutex_lock_interruptible(&etnaviv_obj->lock);
187 if (ret) 187 if (err)
188 goto out; 188 return VM_FAULT_NOPAGE;
189
190 /* make sure we have pages attached now */ 189 /* make sure we have pages attached now */
191 pages = etnaviv_gem_get_pages(etnaviv_obj); 190 pages = etnaviv_gem_get_pages(etnaviv_obj);
192 mutex_unlock(&etnaviv_obj->lock); 191 mutex_unlock(&etnaviv_obj->lock);
193 192
194 if (IS_ERR(pages)) { 193 if (IS_ERR(pages)) {
195 ret = PTR_ERR(pages); 194 err = PTR_ERR(pages);
196 goto out; 195 return vmf_error(err);
197 } 196 }
198 197
199 /* We don't use vmf->pgoff since that has the fake offset: */ 198 /* We don't use vmf->pgoff since that has the fake offset: */
@@ -204,25 +203,7 @@ int etnaviv_gem_fault(struct vm_fault *vmf)
204 VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address, 203 VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address,
205 page_to_pfn(page), page_to_pfn(page) << PAGE_SHIFT); 204 page_to_pfn(page), page_to_pfn(page) << PAGE_SHIFT);
206 205
207 ret = vm_insert_page(vma, vmf->address, page); 206 return vmf_insert_page(vma, vmf->address, page);
208
209out:
210 switch (ret) {
211 case -EAGAIN:
212 case 0:
213 case -ERESTARTSYS:
214 case -EINTR:
215 case -EBUSY:
216 /*
217 * EBUSY is ok: this just means that another thread
218 * already did the job.
219 */
220 return VM_FAULT_NOPAGE;
221 case -ENOMEM:
222 return VM_FAULT_OOM;
223 default:
224 return VM_FAULT_SIGBUS;
225 }
226} 207}
227 208
228int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset) 209int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset)