Lines Matching refs:notifier

282 drm_gpusvm_range_find(struct drm_gpusvm_notifier *notifier, unsigned long start,  in drm_gpusvm_range_find()  argument
287 itree = interval_tree_iter_first(&notifier->root, start, end - 1); in drm_gpusvm_range_find()
322 __drm_gpusvm_notifier_next(struct drm_gpusvm_notifier *notifier) in __drm_gpusvm_notifier_next() argument
324 if (notifier && !list_is_last(&notifier->entry, in __drm_gpusvm_notifier_next()
325 &notifier->gpusvm->notifier_list)) in __drm_gpusvm_notifier_next()
326 return list_next_entry(notifier, entry); in __drm_gpusvm_notifier_next()
393 struct drm_gpusvm_notifier *notifier = in drm_gpusvm_notifier_invalidate() local
394 container_of(mni, typeof(*notifier), notifier); in drm_gpusvm_notifier_invalidate()
395 struct drm_gpusvm *gpusvm = notifier->gpusvm; in drm_gpusvm_notifier_invalidate()
402 gpusvm->ops->invalidate(gpusvm, notifier, mmu_range); in drm_gpusvm_notifier_invalidate()
510 struct drm_gpusvm_notifier *notifier) in drm_gpusvm_notifier_insert() argument
515 interval_tree_insert(&notifier->itree, &gpusvm->root); in drm_gpusvm_notifier_insert()
517 node = rb_prev(&notifier->itree.rb); in drm_gpusvm_notifier_insert()
523 list_add(&notifier->entry, head); in drm_gpusvm_notifier_insert()
534 struct drm_gpusvm_notifier *notifier) in drm_gpusvm_notifier_remove() argument
536 interval_tree_remove(&notifier->itree, &gpusvm->root); in drm_gpusvm_notifier_remove()
537 list_del(&notifier->entry); in drm_gpusvm_notifier_remove()
549 struct drm_gpusvm_notifier *notifier, *next; in drm_gpusvm_fini() local
551 drm_gpusvm_for_each_notifier_safe(notifier, next, gpusvm, 0, LONG_MAX) { in drm_gpusvm_fini()
557 mmu_interval_notifier_remove(&notifier->notifier); in drm_gpusvm_fini()
558 notifier->flags.removed = true; in drm_gpusvm_fini()
560 drm_gpusvm_for_each_range_safe(range, __next, notifier, 0, in drm_gpusvm_fini()
582 struct drm_gpusvm_notifier *notifier; in drm_gpusvm_notifier_alloc() local
585 notifier = gpusvm->ops->notifier_alloc(); in drm_gpusvm_notifier_alloc()
587 notifier = kzalloc(sizeof(*notifier), GFP_KERNEL); in drm_gpusvm_notifier_alloc()
589 if (!notifier) in drm_gpusvm_notifier_alloc()
592 notifier->gpusvm = gpusvm; in drm_gpusvm_notifier_alloc()
593 notifier->itree.start = ALIGN_DOWN(fault_addr, gpusvm->notifier_size); in drm_gpusvm_notifier_alloc()
594 notifier->itree.last = ALIGN(fault_addr + 1, gpusvm->notifier_size) - 1; in drm_gpusvm_notifier_alloc()
595 INIT_LIST_HEAD(&notifier->entry); in drm_gpusvm_notifier_alloc()
596 notifier->root = RB_ROOT_CACHED; in drm_gpusvm_notifier_alloc()
597 INIT_LIST_HEAD(&notifier->range_list); in drm_gpusvm_notifier_alloc()
599 return notifier; in drm_gpusvm_notifier_alloc()
610 struct drm_gpusvm_notifier *notifier) in drm_gpusvm_notifier_free() argument
612 WARN_ON(!RB_EMPTY_ROOT(&notifier->root.rb_root)); in drm_gpusvm_notifier_free()
615 gpusvm->ops->notifier_free(notifier); in drm_gpusvm_notifier_free()
617 kfree(notifier); in drm_gpusvm_notifier_free()
638 static void drm_gpusvm_range_insert(struct drm_gpusvm_notifier *notifier, in drm_gpusvm_range_insert() argument
644 drm_gpusvm_notifier_lock(notifier->gpusvm); in drm_gpusvm_range_insert()
645 interval_tree_insert(&range->itree, &notifier->root); in drm_gpusvm_range_insert()
651 head = &notifier->range_list; in drm_gpusvm_range_insert()
654 drm_gpusvm_notifier_unlock(notifier->gpusvm); in drm_gpusvm_range_insert()
664 static void __drm_gpusvm_range_remove(struct drm_gpusvm_notifier *notifier, in __drm_gpusvm_range_remove() argument
667 interval_tree_remove(&range->itree, &notifier->root); in __drm_gpusvm_range_remove()
685 struct drm_gpusvm_notifier *notifier, in drm_gpusvm_range_alloc() argument
701 range->notifier = notifier; in drm_gpusvm_range_alloc()
724 struct drm_gpusvm_notifier *notifier, in drm_gpusvm_check_pages() argument
729 .notifier = &notifier->notifier, in drm_gpusvm_check_pages()
746 hmm_range.notifier_seq = mmu_interval_read_begin(&notifier->notifier); in drm_gpusvm_check_pages()
756 mmu_interval_read_begin(&notifier->notifier); in drm_gpusvm_check_pages()
795 struct drm_gpusvm_notifier *notifier, in drm_gpusvm_range_chunk_size() argument
811 start >= drm_gpusvm_notifier_start(notifier) && in drm_gpusvm_range_chunk_size()
812 end <= drm_gpusvm_notifier_end(notifier) && in drm_gpusvm_range_chunk_size()
827 range = drm_gpusvm_range_find(notifier, start, end); in drm_gpusvm_range_chunk_size()
847 !drm_gpusvm_check_pages(gpusvm, notifier, start, end)) { in drm_gpusvm_range_chunk_size()
928 struct drm_gpusvm_notifier *notifier; in drm_gpusvm_range_find_or_insert() local
946 notifier = drm_gpusvm_notifier_find(gpusvm, fault_addr); in drm_gpusvm_range_find_or_insert()
947 if (!notifier) { in drm_gpusvm_range_find_or_insert()
948 notifier = drm_gpusvm_notifier_alloc(gpusvm, fault_addr); in drm_gpusvm_range_find_or_insert()
949 if (IS_ERR(notifier)) { in drm_gpusvm_range_find_or_insert()
950 err = PTR_ERR(notifier); in drm_gpusvm_range_find_or_insert()
954 err = mmu_interval_notifier_insert(&notifier->notifier, in drm_gpusvm_range_find_or_insert()
956 drm_gpusvm_notifier_start(notifier), in drm_gpusvm_range_find_or_insert()
957 drm_gpusvm_notifier_size(notifier), in drm_gpusvm_range_find_or_insert()
976 range = drm_gpusvm_range_find(notifier, fault_addr, fault_addr + 1); in drm_gpusvm_range_find_or_insert()
987 chunk_size = drm_gpusvm_range_chunk_size(gpusvm, notifier, vas, in drm_gpusvm_range_find_or_insert()
996 range = drm_gpusvm_range_alloc(gpusvm, notifier, fault_addr, chunk_size, in drm_gpusvm_range_find_or_insert()
1003 drm_gpusvm_range_insert(notifier, range); in drm_gpusvm_range_find_or_insert()
1005 drm_gpusvm_notifier_insert(gpusvm, notifier); in drm_gpusvm_range_find_or_insert()
1016 mmu_interval_notifier_remove(&notifier->notifier); in drm_gpusvm_range_find_or_insert()
1019 drm_gpusvm_notifier_free(gpusvm, notifier); in drm_gpusvm_range_find_or_insert()
1105 struct drm_gpusvm_notifier *notifier; in drm_gpusvm_range_remove() local
1109 notifier = drm_gpusvm_notifier_find(gpusvm, in drm_gpusvm_range_remove()
1111 if (WARN_ON_ONCE(!notifier)) in drm_gpusvm_range_remove()
1117 __drm_gpusvm_range_remove(notifier, range); in drm_gpusvm_range_remove()
1122 if (RB_EMPTY_ROOT(&notifier->root.rb_root)) { in drm_gpusvm_range_remove()
1123 if (!notifier->flags.removed) in drm_gpusvm_range_remove()
1124 mmu_interval_notifier_remove(&notifier->notifier); in drm_gpusvm_range_remove()
1125 drm_gpusvm_notifier_remove(gpusvm, notifier); in drm_gpusvm_range_remove()
1126 drm_gpusvm_notifier_free(gpusvm, notifier); in drm_gpusvm_range_remove()
1247 struct mmu_interval_notifier *notifier = &range->notifier->notifier; in drm_gpusvm_range_get_pages() local
1251 .notifier = notifier, in drm_gpusvm_range_get_pages()
1272 hmm_range.notifier_seq = mmu_interval_read_begin(notifier); in drm_gpusvm_range_get_pages()
1296 mmu_interval_read_begin(notifier); in drm_gpusvm_range_get_pages()
1320 if (mmu_interval_read_retry(notifier, hmm_range.notifier_seq)) { in drm_gpusvm_range_get_pages()
1482 struct mmu_interval_notifier *notifier = &range->notifier->notifier; in drm_gpusvm_range_evict() local
1485 .notifier = notifier, in drm_gpusvm_range_evict()
1507 hmm_range.notifier_seq = mmu_interval_read_begin(notifier); in drm_gpusvm_range_evict()
1538 struct drm_gpusvm_notifier *notifier; in drm_gpusvm_has_mapping() local
1540 drm_gpusvm_for_each_notifier(notifier, gpusvm, start, end) { in drm_gpusvm_has_mapping()
1543 drm_gpusvm_for_each_range(range, notifier, start, end) in drm_gpusvm_has_mapping()