Commit b46ff4eb authored by Stanimir Varbanov's avatar Stanimir Varbanov Committed by Mauro Carvalho Chehab
Browse files

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: default avatarStanimir Varbanov <stanimir.varbanov@linaro.org>
Tested-by: default avatarVikash Garodia <vgarodia@codeaurora.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 3f3e877c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ static void venus_event_notify(struct venus_core *core, u32 event)
	}

	mutex_lock(&core->lock);
	core->sys_error = true;
	set_bit(0, &core->sys_error);
	list_for_each_entry(inst, &core->instances, list)
		inst->ops->event_notify(inst, EVT_SESSION_ERROR, NULL);
	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");

	mutex_lock(&core->lock);
	core->sys_error = false;
	clear_bit(0, &core->sys_error);
	mutex_unlock(&core->lock);
}

+2 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#ifndef __VENUS_CORE_H_
#define __VENUS_CORE_H_

#include <linux/bitops.h>
#include <linux/list.h>
#include <media/videobuf2-v4l2.h>
#include <media/v4l2-ctrls.h>
@@ -182,7 +183,7 @@ struct venus_core {
	unsigned int state;
	struct completion done;
	unsigned int error;
	bool sys_error;
	unsigned long sys_error;
	const struct hfi_core_ops *core_ops;
	const struct venus_pm_ops *pm_ops;
	struct mutex pm_lock;
+1 −1
Original line number Diff line number Diff line
@@ -1486,7 +1486,7 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q)
		ret |= venus_helper_intbufs_free(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;

		if (ret)
+1 −1
Original line number Diff line number Diff line
@@ -214,7 +214,7 @@ int hfi_session_init(struct venus_inst *inst, u32 pixfmt)
	 * session_init() can't pass successfully
	 */
	mutex_lock(&core->lock);
	if (!core->ops || core->sys_error) {
	if (!core->ops || test_bit(0, &inst->core->sys_error)) {
		mutex_unlock(&core->lock);
		return -EIO;
	}
+1 −1
Original line number Diff line number Diff line
@@ -1231,7 +1231,7 @@ static void vdec_session_release(struct venus_inst *inst)
	ret = hfi_session_deinit(inst);
	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;

	if (abort)