Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1fd6e206 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Protect debug_buffer access in info_read with lock" into msm-4.9

parents bc191d7e 8468ee81
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -785,6 +785,8 @@ static int __init msm_vidc_init(void)
	if (rc) {
		dprintk(VIDC_ERR,
			"Failed to register platform driver\n");
		msm_vidc_debugfs_deinit_drv();
		debugfs_remove_recursive(vidc_driver->debugfs_root);
		kfree(vidc_driver);
		vidc_driver = NULL;
	}
@@ -795,6 +797,7 @@ static int __init msm_vidc_init(void)
static void __exit msm_vidc_exit(void)
{
	platform_driver_unregister(&msm_vidc_driver);
	msm_vidc_debugfs_deinit_drv();
	debugfs_remove_recursive(vidc_driver->debugfs_root);
	mutex_destroy(&vidc_driver->lock);
	kfree(vidc_driver);
+26 −4
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ bool msm_vidc_syscache_disable = true;
#define MAX_DBG_BUF_SIZE 4096

struct debug_buffer {
	struct mutex lock;
	char ptr[MAX_DBG_BUF_SIZE];
	char *curr;
	u32 filled_size;
@@ -63,8 +64,11 @@ static u32 write_str(struct debug_buffer *buffer, const char *fmt, ...)
	va_list args;
	u32 size;

	char *curr = buffer->curr;
	char *end = buffer->ptr + MAX_DBG_BUF_SIZE;

	va_start(args, fmt);
	size = vscnprintf(buffer->curr, MAX_DBG_BUF_SIZE - 1, fmt, args);
	size = vscnprintf(curr, end - curr, fmt, args);
	va_end(args);
	buffer->curr += size;
	buffer->filled_size += size;
@@ -78,12 +82,15 @@ static ssize_t core_info_read(struct file *file, char __user *buf,
	struct hfi_device *hdev;
	struct hal_fw_info fw_info = { {0} };
	int i = 0, rc = 0;
	ssize_t len = 0;

	if (!core || !core->device) {
		dprintk(VIDC_ERR, "Invalid params, core: %pK\n", core);
		return 0;
	}
	hdev = core->device;

	mutex_lock(&dbg_buf.lock);
	INIT_DBG_BUF(dbg_buf);
	write_str(&dbg_buf, "===============================\n");
	write_str(&dbg_buf, "CORE %d: %pK\n", core->id, core);
@@ -107,8 +114,11 @@ static ssize_t core_info_read(struct file *file, char __user *buf,
			completion_done(&core->completions[SYS_MSG_INDEX(i)]) ?
			"pending" : "done");
	}
	return simple_read_from_buffer(buf, count, ppos,
	len = simple_read_from_buffer(buf, count, ppos,
			dbg_buf.ptr, dbg_buf.filled_size);

	mutex_unlock(&dbg_buf.lock);
	return len;
}

static const struct file_operations core_info_fops = {
@@ -150,8 +160,10 @@ static const struct file_operations ssr_fops = {
struct dentry *msm_vidc_debugfs_init_drv(void)
{
	bool ok = false;
	struct dentry *dir = debugfs_create_dir("msm_vidc", NULL);
	struct dentry *dir = NULL;

	mutex_init(&dbg_buf.lock);
	dir = debugfs_create_dir("msm_vidc", NULL);
	if (IS_ERR_OR_NULL(dir)) {
		dir = NULL;
		goto failed_create_dir;
@@ -274,11 +286,14 @@ static ssize_t inst_info_read(struct file *file, char __user *buf,
{
	struct msm_vidc_inst *inst = file->private_data;
	int i, j;
	ssize_t len = 0;

	if (!inst) {
		dprintk(VIDC_ERR, "Invalid params, inst %pK\n", inst);
		return 0;
	}

	mutex_lock(&dbg_buf.lock);
	INIT_DBG_BUF(dbg_buf);
	write_str(&dbg_buf, "===============================\n");
	write_str(&dbg_buf, "INSTANCE: %pK (%s)\n", inst,
@@ -333,8 +348,10 @@ static ssize_t inst_info_read(struct file *file, char __user *buf,

	publish_unreleased_reference(inst);

	return simple_read_from_buffer(buf, count, ppos,
	len = simple_read_from_buffer(buf, count, ppos,
		dbg_buf.ptr, dbg_buf.filled_size);
	mutex_unlock(&dbg_buf.lock);
	return len;
}

static const struct file_operations inst_info_fops = {
@@ -417,3 +434,8 @@ void msm_vidc_debugfs_update(struct msm_vidc_inst *inst,
	}
}

void msm_vidc_debugfs_deinit_drv(void)
{
	mutex_destroy(&dbg_buf.lock);
}
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst,
		struct dentry *parent);
void msm_vidc_debugfs_update(struct msm_vidc_inst *inst,
		enum msm_vidc_debugfs_event e);
void msm_vidc_debugfs_deinit_drv(void);

static inline void tic(struct msm_vidc_inst *i, enum profiling_points p,
				 char *b)