mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
media: platform: mtk-mdp3: Use refcount_t for job_count
Use an API that resembles more the actual use of job_count. Found by cocci: drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c:527:5-24: WARNING: atomic_dec_and_test variation before object free at line 541. drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c:578:6-25: WARNING: atomic_dec_and_test variation before object free at line 581. Link: https://lore.kernel.org/linux-media/20240429-fix-cocci-v3-12-3c4865f5a4b0@chromium.org Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
6cff72f6bc
commit
7aa9066e8d
|
|
@ -524,7 +524,7 @@ static void mdp_auto_release_work(struct work_struct *work)
|
|||
mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps,
|
||||
cmd->num_comps);
|
||||
|
||||
if (atomic_dec_and_test(&mdp->job_count)) {
|
||||
if (refcount_dec_and_test(&mdp->job_count)) {
|
||||
if (cmd->mdp_ctx)
|
||||
mdp_m2m_job_finish(cmd->mdp_ctx);
|
||||
|
||||
|
|
@ -575,7 +575,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
|
|||
mdp_comp_clocks_off(&mdp->pdev->dev, cmd->comps,
|
||||
cmd->num_comps);
|
||||
|
||||
if (atomic_dec_and_test(&mdp->job_count))
|
||||
if (refcount_dec_and_test(&mdp->job_count))
|
||||
wake_up(&mdp->callback_wq);
|
||||
|
||||
mdp_cmdq_pkt_destroy(&cmd->pkt);
|
||||
|
|
@ -724,9 +724,9 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
|
|||
int i, ret;
|
||||
u8 pp_used = __get_pp_num(param->param->type);
|
||||
|
||||
atomic_set(&mdp->job_count, pp_used);
|
||||
refcount_set(&mdp->job_count, pp_used);
|
||||
if (atomic_read(&mdp->suspended)) {
|
||||
atomic_set(&mdp->job_count, 0);
|
||||
refcount_set(&mdp->job_count, 0);
|
||||
return -ECANCELED;
|
||||
}
|
||||
|
||||
|
|
@ -764,7 +764,7 @@ int mdp_cmdq_send(struct mdp_dev *mdp, struct mdp_cmdq_param *param)
|
|||
mdp_comp_clocks_off(&mdp->pdev->dev, cmd[i]->comps,
|
||||
cmd[i]->num_comps);
|
||||
err_cancel_job:
|
||||
atomic_set(&mdp->job_count, 0);
|
||||
refcount_set(&mdp->job_count, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -380,14 +380,14 @@ static int __maybe_unused mdp_suspend(struct device *dev)
|
|||
|
||||
atomic_set(&mdp->suspended, 1);
|
||||
|
||||
if (atomic_read(&mdp->job_count)) {
|
||||
if (refcount_read(&mdp->job_count)) {
|
||||
ret = wait_event_timeout(mdp->callback_wq,
|
||||
!atomic_read(&mdp->job_count),
|
||||
!refcount_read(&mdp->job_count),
|
||||
2 * HZ);
|
||||
if (ret == 0) {
|
||||
dev_err(dev,
|
||||
"%s:flushed cmdq task incomplete, count=%d\n",
|
||||
__func__, atomic_read(&mdp->job_count));
|
||||
__func__, refcount_read(&mdp->job_count));
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ struct mdp_dev {
|
|||
/* synchronization protect for m2m device operation */
|
||||
struct mutex m2m_lock;
|
||||
atomic_t suspended;
|
||||
atomic_t job_count;
|
||||
refcount_t job_count;
|
||||
};
|
||||
|
||||
struct mdp_pipe_info {
|
||||
|
|
|
|||
|
|
@ -104,14 +104,14 @@ static void mdp_m2m_device_run(void *priv)
|
|||
task.cb_data = NULL;
|
||||
task.mdp_ctx = ctx;
|
||||
|
||||
if (atomic_read(&ctx->mdp_dev->job_count)) {
|
||||
if (refcount_read(&ctx->mdp_dev->job_count)) {
|
||||
ret = wait_event_timeout(ctx->mdp_dev->callback_wq,
|
||||
!atomic_read(&ctx->mdp_dev->job_count),
|
||||
!refcount_read(&ctx->mdp_dev->job_count),
|
||||
2 * HZ);
|
||||
if (ret == 0) {
|
||||
dev_err(&ctx->mdp_dev->pdev->dev,
|
||||
"%d jobs not yet done\n",
|
||||
atomic_read(&ctx->mdp_dev->job_count));
|
||||
refcount_read(&ctx->mdp_dev->job_count));
|
||||
goto worker_end;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user