video: driver: Create and use single spin lock for dma fence

Create and use single spin lock per session (per fence context)
rather than creating spin locks per dma fence to possibly
resolve flickering in video playback.

Change-Id: I01286ae375dfedc0da26a1be4ded1bd1e02767ba
Signed-off-by: Akshata Sahukar <asahukar@quicinc.com>
Цей коміт міститься в:
Akshata Sahukar
2022-05-13 17:32:21 -07:00
джерело 5b6a6bc3c8
коміт 3964fa9159
3 змінених файлів з 20 додано та 22 видалено

Переглянути файл

@@ -827,16 +827,16 @@ struct msm_vidc_power {
};
struct msm_vidc_fence_context {
char name[MAX_NAME_LENGTH];
u64 ctx_num;
u64 seq_num;
char name[MAX_NAME_LENGTH];
u64 ctx_num;
u64 seq_num;
spinlock_t lock;
};
struct msm_vidc_fence {
struct list_head list;
struct dma_fence dma_fence;
char name[MAX_NAME_LENGTH];
spinlock_t lock;
struct sync_file *sync_file;
int fd;
};

Переглянути файл

@@ -2102,6 +2102,18 @@ int msm_vidc_get_fence_fd(struct msm_vidc_inst *inst, int *fence_fd)
return -EINVAL;
}
/*
* Acquire inst->lock for fence fd creation
* to avoid sync_file_create() and sync_file_poll()
* race conditions in e2e playback usecase.
*/
inst = get_inst_ref(g_core, inst);
if (!inst) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
inst_lock(inst, __func__);
list_for_each_entry_safe(fence, dummy_fence, &inst->fence_list, list) {
if (fence->dma_fence.seqno ==
(u64)inst->capabilities->cap[FENCE_ID].value) {
@@ -2125,6 +2137,8 @@ int msm_vidc_get_fence_fd(struct msm_vidc_inst *inst, int *fence_fd)
*fence_fd = fence->fd;
exit:
inst_unlock(inst, __func__);
put_inst(inst);
return rc;
}

Переглянути файл

@@ -67,9 +67,8 @@ struct msm_vidc_fence *msm_vidc_fence_create(struct msm_vidc_inst *inst)
}
fence->fd = INVALID_FD;
spin_lock_init(&fence->lock);
dma_fence_init(&fence->dma_fence, &msm_vidc_dma_fence_ops,
&fence->lock, inst->fence_context.ctx_num,
&inst->fence_context.lock, inst->fence_context.ctx_num,
++inst->fence_context.seq_num);
snprintf(fence->name, sizeof(fence->name), "%s: %llu",
inst->fence_context.name, inst->fence_context.seq_num);
@@ -95,18 +94,6 @@ int msm_vidc_create_fence_fd(struct msm_vidc_inst *inst,
return -EINVAL;
}
/*
* Acquire inst->lock for fence fd creation
* to avoid sync_file_create() and sync_file_poll()
* race conditions in e2e playback usecase.
*/
inst = get_inst_ref(g_core, inst);
if (!inst) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
inst_lock(inst, __func__);
fence->fd = get_unused_fd_flags(0);
if (fence->fd < 0) {
i_vpr_e(inst, "%s: getting fd (%d) failed\n", __func__,
@@ -125,15 +112,11 @@ int msm_vidc_create_fence_fd(struct msm_vidc_inst *inst,
i_vpr_l(inst, "%s: created fd %d for fence %s\n", __func__,
fence->fd, fence->name);
inst_unlock(inst, __func__);
put_inst(inst);
return 0;
err_sync_file:
put_unused_fd(fence->fd);
err_fd:
inst_unlock(inst, __func__);
put_inst(inst);
return rc;
}
@@ -236,6 +219,7 @@ void msm_vidc_fence_deinit(struct msm_vidc_inst *inst)
}
i_vpr_h(inst, "%s: %s\n", __func__, inst->fence_context.name);
inst->fence_context.ctx_num = 0;
spin_lock_init(&inst->fence_context.lock);
snprintf(inst->fence_context.name, sizeof(inst->fence_context.name),
"%s", "");
}