diff --git a/drivers/media/platform/msm/synx/synx.c b/drivers/media/platform/msm/synx/synx.c index 41acc8ad270f..c52d9749dd2e 100644 --- a/drivers/media/platform/msm/synx/synx.c +++ b/drivers/media/platform/msm/synx/synx.c @@ -313,6 +313,10 @@ int synx_signal_fence(struct synx_coredata *synx_obj, return -EINVAL; } + if (synx_util_get_object_status(synx_obj) != + SYNX_STATE_ACTIVE) + return -EALREADY; + /* * remove registered callback for the fence * so it does not invoke the signal through callback again @@ -324,12 +328,6 @@ int synx_signal_fence(struct synx_coredata *synx_obj, } spin_lock_irqsave(synx_obj->fence->lock, flags); - if (synx_util_get_object_status_locked(synx_obj) != - SYNX_STATE_ACTIVE) { - spin_unlock_irqrestore(synx_obj->fence->lock, flags); - return -EALREADY; - } - /* set fence error to model {signal w/ error} */ if (status != SYNX_STATE_SIGNALED_SUCCESS) dma_fence_set_error(synx_obj->fence, -status); diff --git a/drivers/media/platform/msm/synx/synx_util.c b/drivers/media/platform/msm/synx/synx_util.c index db5f6a632cdd..7720141eb133 100644 --- a/drivers/media/platform/msm/synx/synx_util.c +++ b/drivers/media/platform/msm/synx/synx_util.c @@ -107,8 +107,9 @@ static void synx_util_destroy_coredata(struct kref *kref) if (synx_obj->fence) { /* need to release callback if unsignaled */ - if (synx_util_get_object_status(synx_obj) == - SYNX_STATE_ACTIVE) + if (!synx_util_is_merged_object(synx_obj) && + (synx_util_get_object_status(synx_obj) == + SYNX_STATE_ACTIVE)) if (!dma_fence_remove_callback(synx_obj->fence, &synx_obj->fence_cb)) /* nothing much but logging the error */