return (const char *)fence->sched->name;
 }
 
+static void drm_sched_fence_free_rcu(struct rcu_head *rcu)
+{
+       struct dma_fence *f = container_of(rcu, struct dma_fence, rcu);
+       struct drm_sched_fence *fence = to_drm_sched_fence(f);
+
+       if (!WARN_ON_ONCE(!fence))
+               kmem_cache_free(sched_fence_slab, fence);
+}
+
 /**
- * drm_sched_fence_free - free up the fence memory
+ * drm_sched_fence_free - free up an uninitialized fence
  *
- * @rcu: RCU callback head
+ * @fence: fence to free
  *
- * Free up the fence memory after the RCU grace period.
+ * Free up the fence memory. Should only be used if drm_sched_fence_init()
+ * has not been called yet.
  */
-void drm_sched_fence_free(struct rcu_head *rcu)
+void drm_sched_fence_free(struct drm_sched_fence *fence)
 {
-       struct dma_fence *f = container_of(rcu, struct dma_fence, rcu);
-       struct drm_sched_fence *fence = to_drm_sched_fence(f);
-
-       kmem_cache_free(sched_fence_slab, fence);
+       /* This function should not be called if the fence has been initialized. */
+       if (!WARN_ON_ONCE(fence->sched))
+               kmem_cache_free(sched_fence_slab, fence);
 }
 
 /**
        struct drm_sched_fence *fence = to_drm_sched_fence(f);
 
        dma_fence_put(fence->parent);
-       call_rcu(&fence->finished.rcu, drm_sched_fence_free);
+       call_rcu(&fence->finished.rcu, drm_sched_fence_free_rcu);
 }
 
 /**
 
        struct drm_sched_entity *s_entity, void *owner);
 void drm_sched_fence_init(struct drm_sched_fence *fence,
                          struct drm_sched_entity *entity);
-void drm_sched_fence_free(struct rcu_head *rcu);
+void drm_sched_fence_free(struct drm_sched_fence *fence);
 
 void drm_sched_fence_scheduled(struct drm_sched_fence *fence);
 void drm_sched_fence_finished(struct drm_sched_fence *fence);