ANDROID: KVM: arm64: Handle pipe buffer overflow for hyp tracing

Hyp events can overflow the userspace buffer used for hyp trace_pipe.
Make sure no events is lost when this happens.

Bug: 249050813
Change-Id: I8b4032d89b327a2dc83f410d6c20ee59fdd30320
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
This commit is contained in:
Vincent Donnefort
2023-02-23 15:39:03 +00:00
parent a262be0c41
commit d1471dfdeb

View File

@@ -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);
}