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

Commit be9742e6 authored by Li Zefan's avatar Li Zefan Committed by Ingo Molnar
Browse files

ksym_tracer: Rewrite ksym_trace_filter_read()



Reading ksym_trace_filter gave me some arbitrary characters,
when it should show nothing. It's because buf is not initialized
when there's no filter.

Also reduce stack usage by about 512 bytes.

Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Acked-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: "K.Prasad" <prasad@linux.vnet.ibm.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <4A52E2B4.6030706@cn.fujitsu.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent db59504d
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@
#define KSYM_TRACER_MAX HBP_NUM

#define KSYM_TRACER_OP_LEN 3 /* rw- */
#define KSYM_FILTER_ENTRY_LEN (KSYM_NAME_LEN + KSYM_TRACER_OP_LEN + 1)

struct trace_ksym {
	struct hw_breakpoint	*ksym_hbp;
@@ -230,25 +229,33 @@ static ssize_t ksym_trace_filter_read(struct file *filp, char __user *ubuf,
{
	struct trace_ksym *entry;
	struct hlist_node *node;
	char buf[KSYM_FILTER_ENTRY_LEN * KSYM_TRACER_MAX];
	ssize_t ret, cnt = 0;
	struct trace_seq *s;
	ssize_t cnt = 0;
	int ret;

	s = kmalloc(sizeof(*s), GFP_KERNEL);
	if (!s)
		return -ENOMEM;
	trace_seq_init(s);

	mutex_lock(&ksym_tracer_mutex);

	hlist_for_each_entry(entry, node, &ksym_filter_head, ksym_hlist) {
		cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt, "%s:",
				entry->ksym_hbp->info.name);
		ret = trace_seq_printf(s, "%s:", entry->ksym_hbp->info.name);
		if (entry->ksym_hbp->info.type == HW_BREAKPOINT_WRITE)
			cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt,
								"-w-\n");
			ret = trace_seq_puts(s, "-w-\n");
		else if (entry->ksym_hbp->info.type == HW_BREAKPOINT_RW)
			cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt,
								"rw-\n");
			ret = trace_seq_puts(s, "rw-\n");
		WARN_ON_ONCE(!ret);
	}
	ret = simple_read_from_buffer(ubuf, count, ppos, buf, strlen(buf));

	cnt = simple_read_from_buffer(ubuf, count, ppos, s->buffer, s->len);

	mutex_unlock(&ksym_tracer_mutex);

	return ret;
	kfree(s);

	return cnt;
}

static ssize_t ksym_trace_filter_write(struct file *file,