Lines Matching refs:obj
61 struct drm_i915_gem_object *obj; member
65 static unsigned long cancel_userptr(struct drm_i915_gem_object *obj) in cancel_userptr() argument
67 struct drm_device *dev = obj->base.dev; in cancel_userptr()
72 obj->userptr.work = NULL; in cancel_userptr()
74 if (obj->pages != NULL) { in cancel_userptr()
82 list_for_each_entry_safe(vma, tmp, &obj->vma_list, vma_link) { in cancel_userptr()
86 WARN_ON(i915_gem_object_put_pages(obj)); in cancel_userptr()
91 end = obj->userptr.ptr + obj->base.size; in cancel_userptr()
93 drm_gem_object_unreference(&obj->base); in cancel_userptr()
110 struct drm_i915_gem_object *obj; in invalidate_range__linear() local
115 obj = mo->obj; in invalidate_range__linear()
117 if (!kref_get_unless_zero(&obj->base.refcount)) in invalidate_range__linear()
122 cancel_userptr(obj); in invalidate_range__linear()
144 struct drm_i915_gem_object *obj = NULL; in i915_gem_userptr_mn_invalidate_range_start() local
154 obj = container_of(it, struct i915_mmu_object, it)->obj; in i915_gem_userptr_mn_invalidate_range_start()
163 if (!kref_get_unless_zero(&obj->base.refcount)) { in i915_gem_userptr_mn_invalidate_range_start()
172 if (obj == NULL) in i915_gem_userptr_mn_invalidate_range_start()
175 next = cancel_userptr(obj); in i915_gem_userptr_mn_invalidate_range_start()
238 struct drm_i915_gem_object *obj; in i915_mmu_notifier_add() local
251 obj = container_of(it, struct i915_mmu_object, it)->obj; in i915_mmu_notifier_add()
252 if (!obj->userptr.workers) in i915_mmu_notifier_add()
295 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mmu_notifier() argument
299 mo = obj->userptr.mmu_object; in i915_gem_userptr_release__mmu_notifier()
306 obj->userptr.mmu_object = NULL; in i915_gem_userptr_release__mmu_notifier()
332 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj, in i915_gem_userptr_init__mmu_notifier() argument
342 if (WARN_ON(obj->userptr.mm == NULL)) in i915_gem_userptr_init__mmu_notifier()
345 mn = i915_mmu_notifier_find(obj->userptr.mm); in i915_gem_userptr_init__mmu_notifier()
354 mo->it.start = obj->userptr.ptr; in i915_gem_userptr_init__mmu_notifier()
355 mo->it.last = mo->it.start + obj->base.size - 1; in i915_gem_userptr_init__mmu_notifier()
356 mo->obj = obj; in i915_gem_userptr_init__mmu_notifier()
358 ret = i915_mmu_notifier_add(obj->base.dev, mn, mo); in i915_gem_userptr_init__mmu_notifier()
364 obj->userptr.mmu_object = mo; in i915_gem_userptr_init__mmu_notifier()
382 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mmu_notifier() argument
387 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj, in i915_gem_userptr_init__mmu_notifier() argument
421 i915_gem_userptr_init__mm_struct(struct drm_i915_gem_object *obj) in i915_gem_userptr_init__mm_struct() argument
423 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); in i915_gem_userptr_init__mm_struct()
447 mm->dev = obj->base.dev; in i915_gem_userptr_init__mm_struct()
460 obj->userptr.mm = mm; in i915_gem_userptr_init__mm_struct()
489 i915_gem_userptr_release__mm_struct(struct drm_i915_gem_object *obj) in i915_gem_userptr_release__mm_struct() argument
491 if (obj->userptr.mm == NULL) in i915_gem_userptr_release__mm_struct()
494 kref_put_mutex(&obj->userptr.mm->kref, in i915_gem_userptr_release__mm_struct()
496 &to_i915(obj->base.dev)->mm_lock); in i915_gem_userptr_release__mm_struct()
497 obj->userptr.mm = NULL; in i915_gem_userptr_release__mm_struct()
502 struct drm_i915_gem_object *obj; member
549 struct drm_i915_gem_object *obj = work->obj; in __i915_gem_userptr_get_pages_worker() local
550 struct drm_device *dev = obj->base.dev; in __i915_gem_userptr_get_pages_worker()
551 const int num_pages = obj->base.size >> PAGE_SHIFT; in __i915_gem_userptr_get_pages_worker()
563 struct mm_struct *mm = obj->userptr.mm->mm; in __i915_gem_userptr_get_pages_worker()
568 obj->userptr.ptr + pinned * PAGE_SIZE, in __i915_gem_userptr_get_pages_worker()
570 !obj->userptr.read_only, 0, in __i915_gem_userptr_get_pages_worker()
581 if (obj->userptr.work != &work->work) { in __i915_gem_userptr_get_pages_worker()
584 ret = st_set_pages(&obj->pages, pvec, num_pages); in __i915_gem_userptr_get_pages_worker()
586 list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); in __i915_gem_userptr_get_pages_worker()
591 obj->userptr.work = ERR_PTR(ret); in __i915_gem_userptr_get_pages_worker()
592 obj->userptr.workers--; in __i915_gem_userptr_get_pages_worker()
593 drm_gem_object_unreference(&obj->base); in __i915_gem_userptr_get_pages_worker()
604 i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) in i915_gem_userptr_get_pages() argument
606 const int num_pages = obj->base.size >> PAGE_SHIFT; in i915_gem_userptr_get_pages()
629 if (obj->userptr.mm->mm == current->mm) { in i915_gem_userptr_get_pages()
638 pinned = __get_user_pages_fast(obj->userptr.ptr, num_pages, in i915_gem_userptr_get_pages()
639 !obj->userptr.read_only, pvec); in i915_gem_userptr_get_pages()
666 if (obj->userptr.work == NULL && in i915_gem_userptr_get_pages()
667 obj->userptr.workers < I915_GEM_USERPTR_MAX_WORKERS) { in i915_gem_userptr_get_pages()
672 obj->userptr.work = &work->work; in i915_gem_userptr_get_pages()
673 obj->userptr.workers++; in i915_gem_userptr_get_pages()
675 work->obj = obj; in i915_gem_userptr_get_pages()
676 drm_gem_object_reference(&obj->base); in i915_gem_userptr_get_pages()
686 if (IS_ERR(obj->userptr.work)) { in i915_gem_userptr_get_pages()
687 ret = PTR_ERR(obj->userptr.work); in i915_gem_userptr_get_pages()
688 obj->userptr.work = NULL; in i915_gem_userptr_get_pages()
693 ret = st_set_pages(&obj->pages, pvec, num_pages); in i915_gem_userptr_get_pages()
695 obj->userptr.work = NULL; in i915_gem_userptr_get_pages()
706 i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj) in i915_gem_userptr_put_pages() argument
710 BUG_ON(obj->userptr.work != NULL); in i915_gem_userptr_put_pages()
712 if (obj->madv != I915_MADV_WILLNEED) in i915_gem_userptr_put_pages()
713 obj->dirty = 0; in i915_gem_userptr_put_pages()
715 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { in i915_gem_userptr_put_pages()
718 if (obj->dirty) in i915_gem_userptr_put_pages()
724 obj->dirty = 0; in i915_gem_userptr_put_pages()
726 sg_free_table(obj->pages); in i915_gem_userptr_put_pages()
727 kfree(obj->pages); in i915_gem_userptr_put_pages()
731 i915_gem_userptr_release(struct drm_i915_gem_object *obj) in i915_gem_userptr_release() argument
733 i915_gem_userptr_release__mmu_notifier(obj); in i915_gem_userptr_release()
734 i915_gem_userptr_release__mm_struct(obj); in i915_gem_userptr_release()
738 i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj) in i915_gem_userptr_dmabuf_export() argument
740 if (obj->userptr.mmu_object) in i915_gem_userptr_dmabuf_export()
743 return i915_gem_userptr_init__mmu_notifier(obj, 0); in i915_gem_userptr_dmabuf_export()
793 struct drm_i915_gem_object *obj; in i915_gem_userptr_ioctl() local
818 obj = i915_gem_object_alloc(dev); in i915_gem_userptr_ioctl()
819 if (obj == NULL) in i915_gem_userptr_ioctl()
822 drm_gem_private_object_init(dev, &obj->base, args->user_size); in i915_gem_userptr_ioctl()
823 i915_gem_object_init(obj, &i915_gem_userptr_ops); in i915_gem_userptr_ioctl()
824 obj->cache_level = I915_CACHE_LLC; in i915_gem_userptr_ioctl()
825 obj->base.write_domain = I915_GEM_DOMAIN_CPU; in i915_gem_userptr_ioctl()
826 obj->base.read_domains = I915_GEM_DOMAIN_CPU; in i915_gem_userptr_ioctl()
828 obj->userptr.ptr = args->user_ptr; in i915_gem_userptr_ioctl()
829 obj->userptr.read_only = !!(args->flags & I915_USERPTR_READ_ONLY); in i915_gem_userptr_ioctl()
835 ret = i915_gem_userptr_init__mm_struct(obj); in i915_gem_userptr_ioctl()
837 ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags); in i915_gem_userptr_ioctl()
839 ret = drm_gem_handle_create(file, &obj->base, &handle); in i915_gem_userptr_ioctl()
842 drm_gem_object_unreference_unlocked(&obj->base); in i915_gem_userptr_ioctl()