Lines Matching refs:obj

58           struct drm_i915_gem_object *obj;  member
68 struct drm_i915_gem_object *obj = mo->obj; in cancel_userptr() local
72 mutex_lock(&obj->mm.lock); in cancel_userptr()
73 active = fetch_and_zero(&obj->userptr.work); in cancel_userptr()
74 mutex_unlock(&obj->mm.lock); in cancel_userptr()
78 i915_gem_object_wait(obj, I915_WAIT_ALL, MAX_SCHEDULE_TIMEOUT, NULL); in cancel_userptr()
80 mutex_lock(&obj->base.dev->struct_mutex); in cancel_userptr()
83 if (i915_gem_object_unbind(obj) == 0) in cancel_userptr()
84 __i915_gem_object_put_pages(obj, I915_MM_NORMAL); in cancel_userptr()
85 WARN_ONCE(i915_gem_object_has_pages(obj), in cancel_userptr()
87 obj->bind_count, in cancel_userptr()
88 atomic_read(&obj->mm.pages_pin_count), in cancel_userptr()
89 obj->pin_global); in cancel_userptr()
91 mutex_unlock(&obj->base.dev->struct_mutex); in cancel_userptr()
94 i915_gem_object_put(obj); in cancel_userptr()
145 if (kref_get_unless_zero(&mo->obj->base.refcount)) in i915_gem_userptr_mn_invalidate_range_start()
187 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mmu_notifier() argument
191 mo = obj->userptr.mmu_object; in i915_gem_userptr_release__mmu_notifier()
200 obj->userptr.mmu_object = NULL; in i915_gem_userptr_release__mmu_notifier()
245 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj, in i915_gem_userptr_init__mmu_notifier() argument
254 if (WARN_ON(obj->userptr.mm == NULL)) in i915_gem_userptr_init__mmu_notifier()
257 mn = i915_mmu_notifier_find(obj->userptr.mm); in i915_gem_userptr_init__mmu_notifier()
266 mo->obj = obj; in i915_gem_userptr_init__mmu_notifier()
267 mo->it.start = obj->userptr.ptr; in i915_gem_userptr_init__mmu_notifier()
268 mo->it.last = obj->userptr.ptr + obj->base.size - 1; in i915_gem_userptr_init__mmu_notifier()
271 obj->userptr.mmu_object = mo; in i915_gem_userptr_init__mmu_notifier()
290 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mmu_notifier() argument
295 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj, in i915_gem_userptr_init__mmu_notifier() argument
329 i915_gem_userptr_init__mm_struct(struct drm_i915_gem_object *obj) in i915_gem_userptr_init__mm_struct() argument
331 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); in i915_gem_userptr_init__mm_struct()
355 mm->i915 = to_i915(obj->base.dev); in i915_gem_userptr_init__mm_struct()
368 obj->userptr.mm = mm; in i915_gem_userptr_init__mm_struct()
399 i915_gem_userptr_release__mm_struct(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mm_struct() argument
401 if (obj->userptr.mm == NULL) in i915_gem_userptr_release__mm_struct()
404 kref_put_mutex(&obj->userptr.mm->kref, in i915_gem_userptr_release__mm_struct()
406 &to_i915(obj->base.dev)->mm_lock); in i915_gem_userptr_release__mm_struct()
407 obj->userptr.mm = NULL; in i915_gem_userptr_release__mm_struct()
412 struct drm_i915_gem_object *obj; member
418 __i915_gem_userptr_alloc_pages(struct drm_i915_gem_object *obj,
440 ret = i915_gem_gtt_prepare_pages(obj, st);
455 __i915_gem_object_set_pages(obj, st, sg_page_sizes);
462 __i915_gem_userptr_set_active(struct drm_i915_gem_object *obj, in __i915_gem_userptr_set_active() argument
478 if (obj->userptr.mmu_object == NULL) in __i915_gem_userptr_set_active()
481 lockmgr(&obj->userptr.mmu_object->mn->lock, LK_EXCLUSIVE); in __i915_gem_userptr_set_active()
486 del_object(obj->userptr.mmu_object); in __i915_gem_userptr_set_active()
487 else if (!work_pending(&obj->userptr.mmu_object->work)) in __i915_gem_userptr_set_active()
488 add_object(obj->userptr.mmu_object); in __i915_gem_userptr_set_active()
491 lockmgr(&obj->userptr.mmu_object->mn->lock, LK_RELEASE); in __i915_gem_userptr_set_active()
502 struct drm_i915_gem_object *obj = work->obj;
503 const int npages = obj->base.size >> PAGE_SHIFT;
512 struct mm_struct *mm = obj->userptr.mm->mm;
515 if (!obj->userptr.read_only)
524 obj->userptr.ptr + pinned * PAGE_SIZE,
538 mutex_lock(&obj->mm.lock);
539 if (obj->userptr.work == &work->work) {
543 pages = __i915_gem_userptr_alloc_pages(obj, pvec,
551 obj->userptr.work = ERR_CAST(pages);
553 __i915_gem_userptr_set_active(obj, false);
555 mutex_unlock(&obj->mm.lock);
560 i915_gem_object_put(obj);
566 __i915_gem_userptr_get_pages_schedule(struct drm_i915_gem_object *obj)
593 obj->userptr.work = &work->work;
595 work->obj = i915_gem_object_get(obj);
601 queue_work(to_i915(obj->base.dev)->mm.userptr_wq, &work->work);
607 static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) in i915_gem_userptr_get_pages() argument
610 const int num_pages = obj->base.size >> PAGE_SHIFT; in i915_gem_userptr_get_pages()
611 struct mm_struct *mm = obj->userptr.mm->mm; in i915_gem_userptr_get_pages()
634 if (obj->userptr.work) { in i915_gem_userptr_get_pages()
636 if (IS_ERR(obj->userptr.work)) in i915_gem_userptr_get_pages()
637 return PTR_ERR(obj->userptr.work); in i915_gem_userptr_get_pages()
651 pinned = __get_user_pages_fast(obj->userptr.ptr, in i915_gem_userptr_get_pages()
653 !obj->userptr.read_only, in i915_gem_userptr_get_pages()
662 pages = __i915_gem_userptr_get_pages_schedule(obj); in i915_gem_userptr_get_pages()
665 pages = __i915_gem_userptr_alloc_pages(obj, pvec, num_pages); in i915_gem_userptr_get_pages()
669 __i915_gem_userptr_set_active(obj, true); in i915_gem_userptr_get_pages()
681 i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj, in i915_gem_userptr_put_pages() argument
687 BUG_ON(obj->userptr.work != NULL); in i915_gem_userptr_put_pages()
688 __i915_gem_userptr_set_active(obj, false); in i915_gem_userptr_put_pages()
690 if (obj->mm.madv != I915_MADV_WILLNEED) in i915_gem_userptr_put_pages()
691 obj->mm.dirty = false; in i915_gem_userptr_put_pages()
693 i915_gem_gtt_finish_pages(obj, pages); in i915_gem_userptr_put_pages()
696 if (obj->mm.dirty) in i915_gem_userptr_put_pages()
702 obj->mm.dirty = false; in i915_gem_userptr_put_pages()
709 i915_gem_userptr_release(struct drm_i915_gem_object *obj) in i915_gem_userptr_release() argument
711 i915_gem_userptr_release__mmu_notifier(obj); in i915_gem_userptr_release()
712 i915_gem_userptr_release__mm_struct(obj); in i915_gem_userptr_release()
716 i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj) in i915_gem_userptr_dmabuf_export() argument
718 if (obj->userptr.mmu_object) in i915_gem_userptr_dmabuf_export()
721 return i915_gem_userptr_init__mmu_notifier(obj, 0); in i915_gem_userptr_dmabuf_export()
773 struct drm_i915_gem_object *obj; in i915_gem_userptr_ioctl() local
804 obj = i915_gem_object_alloc(dev_priv); in i915_gem_userptr_ioctl()
805 if (obj == NULL) in i915_gem_userptr_ioctl()
808 drm_gem_private_object_init(dev, &obj->base, args->user_size); in i915_gem_userptr_ioctl()
809 i915_gem_object_init(obj, &i915_gem_userptr_ops); in i915_gem_userptr_ioctl()
810 obj->base.read_domains = I915_GEM_DOMAIN_CPU; in i915_gem_userptr_ioctl()
811 obj->base.write_domain = I915_GEM_DOMAIN_CPU; in i915_gem_userptr_ioctl()
812 i915_gem_object_set_cache_coherency(obj, I915_CACHE_LLC); in i915_gem_userptr_ioctl()
814 obj->userptr.ptr = args->user_ptr; in i915_gem_userptr_ioctl()
815 obj->userptr.read_only = !!(args->flags & I915_USERPTR_READ_ONLY); in i915_gem_userptr_ioctl()
821 ret = i915_gem_userptr_init__mm_struct(obj); in i915_gem_userptr_ioctl()
823 ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags); in i915_gem_userptr_ioctl()
825 ret = drm_gem_handle_create(file, &obj->base, &handle); in i915_gem_userptr_ioctl()
828 i915_gem_object_put(obj); in i915_gem_userptr_ioctl()