diff -drupN a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c --- a/drivers/dma-buf/sw_sync.c 2018-08-06 17:23:04.000000000 +0300 +++ b/drivers/dma-buf/sw_sync.c 2022-06-12 05:28:14.000000000 +0300 @@ -169,6 +169,11 @@ static bool timeline_fence_enable_signal return true; } +static void timeline_fence_disable_signaling(struct fence *fence) +{ + return; +} + static void timeline_fence_value_str(struct fence *fence, char *str, int size) { @@ -187,6 +192,7 @@ static const struct fence_ops timeline_f .get_driver_name = timeline_fence_get_driver_name, .get_timeline_name = timeline_fence_get_timeline_name, .enable_signaling = timeline_fence_enable_signaling, + .disable_signaling = timeline_fence_disable_signaling, .signaled = timeline_fence_signaled, .wait = fence_default_wait, .release = timeline_fence_release, @@ -216,7 +222,6 @@ static void sync_timeline_signal(struct if (!timeline_fence_signaled(&pt->base)) break; - list_del_init(&pt->link); rb_erase(&pt->node, &obj->pt_tree); /* @@ -228,6 +233,7 @@ static void sync_timeline_signal(struct * timeline_fence_release(). */ fence_signal_locked(&pt->base); + list_del_init(&pt->link); } spin_unlock_irq(&obj->lock); @@ -360,8 +366,8 @@ static long sw_sync_ioctl_create_fence(s } sync_file = sync_file_create(&pt->base); + fence_put(&pt->base); if (!sync_file) { - fence_put(&pt->base); err = -ENOMEM; goto err; }