media: venus: Make sys_error flag an atomic bitops

Make the sys_error flag an atomic bitops in order to avoid
locking in sys_error readers.

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Tested-by: Vikash Garodia <vgarodia@codeaurora.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Stanimir Varbanov 2021-04-23 08:24:54 +01:00 committed by Mauro Carvalho Chehab
parent 3f3e877ce8
commit b46ff4eb34
5 changed files with 7 additions and 6 deletions

View File

@ -65,7 +65,7 @@ static void venus_event_notify(struct venus_core *core, u32 event)
} }
mutex_lock(&core->lock); mutex_lock(&core->lock);
core->sys_error = true; set_bit(0, &core->sys_error);
list_for_each_entry(inst, &core->instances, list) list_for_each_entry(inst, &core->instances, list)
inst->ops->event_notify(inst, EVT_SESSION_ERROR, NULL); inst->ops->event_notify(inst, EVT_SESSION_ERROR, NULL);
mutex_unlock(&core->lock); mutex_unlock(&core->lock);
@ -161,7 +161,7 @@ static void venus_sys_error_handler(struct work_struct *work)
dev_warn(core->dev, "system error has occurred (recovered)\n"); dev_warn(core->dev, "system error has occurred (recovered)\n");
mutex_lock(&core->lock); mutex_lock(&core->lock);
core->sys_error = false; clear_bit(0, &core->sys_error);
mutex_unlock(&core->lock); mutex_unlock(&core->lock);
} }

View File

@ -7,6 +7,7 @@
#ifndef __VENUS_CORE_H_ #ifndef __VENUS_CORE_H_
#define __VENUS_CORE_H_ #define __VENUS_CORE_H_
#include <linux/bitops.h>
#include <linux/list.h> #include <linux/list.h>
#include <media/videobuf2-v4l2.h> #include <media/videobuf2-v4l2.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
@ -182,7 +183,7 @@ struct venus_core {
unsigned int state; unsigned int state;
struct completion done; struct completion done;
unsigned int error; unsigned int error;
bool sys_error; unsigned long sys_error;
const struct hfi_core_ops *core_ops; const struct hfi_core_ops *core_ops;
const struct venus_pm_ops *pm_ops; const struct venus_pm_ops *pm_ops;
struct mutex pm_lock; struct mutex pm_lock;

View File

@ -1486,7 +1486,7 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q)
ret |= venus_helper_intbufs_free(inst); ret |= venus_helper_intbufs_free(inst);
ret |= hfi_session_deinit(inst); ret |= hfi_session_deinit(inst);
if (inst->session_error || core->sys_error) if (inst->session_error || test_bit(0, &core->sys_error))
ret = -EIO; ret = -EIO;
if (ret) if (ret)

View File

@ -214,7 +214,7 @@ int hfi_session_init(struct venus_inst *inst, u32 pixfmt)
* session_init() can't pass successfully * session_init() can't pass successfully
*/ */
mutex_lock(&core->lock); mutex_lock(&core->lock);
if (!core->ops || core->sys_error) { if (!core->ops || test_bit(0, &inst->core->sys_error)) {
mutex_unlock(&core->lock); mutex_unlock(&core->lock);
return -EIO; return -EIO;
} }

View File

@ -1231,7 +1231,7 @@ static void vdec_session_release(struct venus_inst *inst)
ret = hfi_session_deinit(inst); ret = hfi_session_deinit(inst);
abort = (ret && ret != -EINVAL) ? 1 : 0; abort = (ret && ret != -EINVAL) ? 1 : 0;
if (inst->session_error || core->sys_error) if (inst->session_error || test_bit(0, &core->sys_error))
abort = 1; abort = 1;
if (abort) if (abort)