diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index 556e14ede236..e35dbbf7c50f 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -427,7 +427,7 @@ static void ht_print_trace_cpu(struct ht_iterator *iter) extern struct trace_event *ftrace_find_event(int type); -static void ht_print_trace_fmt(struct ht_iterator *iter) +static int ht_print_trace_fmt(struct ht_iterator *iter) { struct trace_event *e; @@ -435,18 +435,16 @@ static void ht_print_trace_fmt(struct ht_iterator *iter) trace_seq_printf(&iter->seq, "CPU:%d [LOST %lu EVENTS]\n", iter->ent_cpu, iter->lost_events); - /* TODO: format bin/hex/raw */ - ht_print_trace_cpu(iter); ht_print_trace_time(iter); e = ftrace_find_event(iter->ent->id); - if (e) { + if (e) e->funcs->trace((struct trace_iterator *)iter, 0, e); - return; - } + else + trace_seq_printf(&iter->seq, "Unknown event id %d\n", iter->ent->id); - trace_seq_printf(&iter->seq, "Unknown event id %d\n", iter->ent->id); + return trace_seq_has_overflowed(&iter->seq) ? -EOVERFLOW : 0; }; static struct ring_buffer_event *ht_next_event(struct ht_iterator *iter, @@ -818,6 +816,10 @@ hyp_trace_pipe_read(struct file *file, char __user *ubuf, struct ht_iterator *iter = (struct ht_iterator *)file->private_data; int ret; + /* seq_buf buffer size */ + if (cnt != PAGE_SIZE) + return -EINVAL; + trace_seq_init(&iter->seq); again: ret = ring_buffer_wait(hyp_trace_buffer, iter->cpu, 0); @@ -826,7 +828,13 @@ again: hyp_trace_read_start(iter->cpu); while (ht_next_pipe_event(iter)) { - ht_print_trace_fmt(iter); + int prev_len = iter->seq.seq.len; + + if (ht_print_trace_fmt(iter)) { + iter->seq.seq.len = prev_len; + break; + } + ring_buffer_consume(hyp_trace_buffer, iter->ent_cpu, NULL, NULL); }