diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_userptr.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index d38413997379..f5efbb836e5c 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c | |||
@@ -293,15 +293,23 @@ i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj) | |||
293 | static struct i915_mmu_notifier * | 293 | static struct i915_mmu_notifier * |
294 | i915_mmu_notifier_find(struct i915_mm_struct *mm) | 294 | i915_mmu_notifier_find(struct i915_mm_struct *mm) |
295 | { | 295 | { |
296 | if (mm->mn == NULL) { | 296 | struct i915_mmu_notifier *mn = mm->mn; |
297 | down_write(&mm->mm->mmap_sem); | 297 | |
298 | mutex_lock(&to_i915(mm->dev)->mm_lock); | 298 | mn = mm->mn; |
299 | if (mm->mn == NULL) | 299 | if (mn) |
300 | mm->mn = i915_mmu_notifier_create(mm->mm); | 300 | return mn; |
301 | mutex_unlock(&to_i915(mm->dev)->mm_lock); | 301 | |
302 | up_write(&mm->mm->mmap_sem); | 302 | down_write(&mm->mm->mmap_sem); |
303 | mutex_lock(&to_i915(mm->dev)->mm_lock); | ||
304 | if ((mn = mm->mn) == NULL) { | ||
305 | mn = i915_mmu_notifier_create(mm->mm); | ||
306 | if (!IS_ERR(mn)) | ||
307 | mm->mn = mn; | ||
303 | } | 308 | } |
304 | return mm->mn; | 309 | mutex_unlock(&to_i915(mm->dev)->mm_lock); |
310 | up_write(&mm->mm->mmap_sem); | ||
311 | |||
312 | return mn; | ||
305 | } | 313 | } |
306 | 314 | ||
307 | static int | 315 | static int |