Take into consideration the value passed in with "-m", the max size in kilobytes that a per cpu buffer should be, when reading trace data from guests. This allows one to prevent running out of diskspace on long runs. Reported-by: Junyao Zhao <junzhao@xxxxxxxxxx> Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx> diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h index f2cf8dc8..2d14ed7a 100644 --- a/lib/trace-cmd/include/private/trace-cmd-private.h +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -370,7 +370,7 @@ enum { void tracecmd_free_recorder(struct tracecmd_recorder *recorder); struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags); struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags); -struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd); +struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd, int maxkb); struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb); struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, struct tracefs_instance *instance); struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, struct tracefs_instance *instance); diff --git a/lib/trace-cmd/trace-recorder.c b/lib/trace-cmd/trace-recorder.c index 0633edf5..44f245d5 100644 --- a/lib/trace-cmd/trace-recorder.c +++ b/lib/trace-cmd/trace-recorder.c @@ -175,19 +175,46 @@ tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, struct trace static struct tracecmd_recorder * __tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, - struct tracefs_instance *instance, int tfd) + struct tracefs_instance *instance, int tfd, int maxkb) { struct tracecmd_recorder *recorder; - int fd; + int fd, fd2 = -1; + char *file2; - fd = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); + fd = open(file, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); if (fd < 0) return NULL; - recorder = create_buffer_recorder_fd2(fd, -1, cpu, flags, instance, 0, tfd); + if (maxkb) { + int len = strlen(file); + + file2 = malloc(len + 3); + if (!file2) + return NULL; + + sprintf(file2, "%s.1", file); + + fd2 = open(file2, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); + if (fd2 < 0) { + close(fd); + unlink(file); + free(file2); + return NULL; + } + } + + recorder = create_buffer_recorder_fd2(fd, fd2, cpu, flags, instance, maxkb, tfd); if (!recorder) { close(fd); unlink(file); + if (fd2 != -1) + close(fd2); + } + + if (fd2 != -1) { + /* Unlink file2, we need to add everything to file at the end */ + unlink(file2); + free(file2); } return recorder; @@ -242,7 +269,7 @@ struct tracecmd_recorder * tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, struct tracefs_instance *instance) { - return __tracecmd_create_buffer_recorder(file, cpu, flags, instance, -1); + return __tracecmd_create_buffer_recorder(file, cpu, flags, instance, -1, 0); } /** @@ -255,9 +282,9 @@ tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, */ struct tracecmd_recorder * tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, - int trace_fd) + int trace_fd, int maxkb) { - return __tracecmd_create_buffer_recorder(file, cpu, flags, NULL, trace_fd); + return __tracecmd_create_buffer_recorder(file, cpu, flags, NULL, trace_fd, maxkb); } struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags) diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index 91cc90d4..69ea0cbd 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -3584,7 +3584,7 @@ create_recorder_instance(struct buffer_instance *instance, const char *file, int flags |= TRACECMD_RECORD_NOBRASS; else if (!trace_vsock_can_splice_read()) flags |= TRACECMD_RECORD_NOSPLICE; - return tracecmd_create_recorder_virt(file, cpu, flags, fd); + return tracecmd_create_recorder_virt(file, cpu, flags, fd, max_kb); } if (brass)