[Intel-gfx] [PATCH] drm/i915: Don't prefault the entire obj if the vma is smaller

ville.syrjala at linux.intel.com ville.syrjala at linux.intel.com
Tue Jun 17 20:03:00 CEST 2014


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Take the minimum of the object size and the vma size and prefault
only that much. Avoids a SIGBUS when mmapping only a portion of the
object.

Prefaulting was introduced here:
 commit b90b91d87038f6b257b40a02b42ed4f9705e06f0
 Author: Chris Wilson <chris at chris-wilson.co.uk>
 Date:   Tue Jun 10 12:14:40 2014 +0100

    drm/i915: Prefault the entire object on first page fault

Cc: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 6f8c206..4ef80d1 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1578,9 +1578,12 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 	pfn >>= PAGE_SHIFT;
 
 	if (!obj->fault_mappable) {
+		unsigned long size = min_t(unsigned long,
+					   vma->vm_end - vma->vm_start,
+					   obj->base.size);
 		int i;
 
-		for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
+		for (i = 0; i < size >> PAGE_SHIFT; i++) {
 			ret = vm_insert_pfn(vma,
 					    (unsigned long)vma->vm_start + i * PAGE_SIZE,
 					    pfn + i);
-- 
1.8.5.5




More information about the Intel-gfx mailing list