|
@@ -225,6 +225,41 @@ void ttm_base_object_unref(struct ttm_base_object **p_base)
|
|
|
kref_put(&base->refcount, ttm_release_base);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ttm_base_object_noref_lookup - look up a base object without reference
|
|
|
+ * @tfile: The struct ttm_object_file the object is registered with.
|
|
|
+ * @key: The object handle.
|
|
|
+ *
|
|
|
+ * This function looks up a ttm base object and returns a pointer to it
|
|
|
+ * without refcounting the pointer. The returned pointer is only valid
|
|
|
+ * until ttm_base_object_noref_release() is called, and the object
|
|
|
+ * pointed to by the returned pointer may be doomed. Any persistent usage
|
|
|
+ * of the object requires a refcount to be taken using kref_get_unless_zero().
|
|
|
+ * Iff this function returns successfully it needs to be paired with
|
|
|
+ * ttm_base_object_noref_release() and no sleeping- or scheduling functions
|
|
|
+ * may be called inbetween these function callse.
|
|
|
+ *
|
|
|
+ * Return: A pointer to the object if successful or NULL otherwise.
|
|
|
+ */
|
|
|
+struct ttm_base_object *
|
|
|
+ttm_base_object_noref_lookup(struct ttm_object_file *tfile, uint32_t key)
|
|
|
+{
|
|
|
+ struct drm_hash_item *hash;
|
|
|
+ struct drm_open_hash *ht = &tfile->ref_hash[TTM_REF_USAGE];
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ ret = drm_ht_find_item_rcu(ht, key, &hash);
|
|
|
+ if (ret) {
|
|
|
+ rcu_read_unlock();
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ __release(RCU);
|
|
|
+ return drm_hash_entry(hash, struct ttm_ref_object, hash)->obj;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(ttm_base_object_noref_lookup);
|
|
|
+
|
|
|
struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file *tfile,
|
|
|
uint32_t key)
|
|
|
{
|