From patchwork Fri Dec 29 03:10:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 13506307 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1297C8BF6 for ; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B2662C433C9; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1rJ3Hf-00000000HmC-0CDu; Thu, 28 Dec 2023 22:11:39 -0500 From: Steven Rostedt To: linux-trace-devel@vger.kernel.org Cc: "Steven Rostedt (Google)" Subject: [PATCH 1/3] trace-cmd library: Fix tracecmd_iterate_events_multi() CPU clean up Date: Thu, 28 Dec 2023 22:10:13 -0500 Message-ID: <20231229031138.68313-2-rostedt@goodmis.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231229031138.68313-1-rostedt@goodmis.org> References: <20231229031138.68313-1-rostedt@goodmis.org> Precedence: bulk X-Mailing-List: linux-trace-devel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: "Steven Rostedt (Google)" In tracecmd_iterate_events_multi(), the clean up code at the end of the function that unlocks and frees the remaining records, iterated the CPUs via a for loop of 0 through all_cpus. But the kbuffer_read_at_offset() function, expects the CPU passed in to be that of the handle and not of all the handles. That is, if there are two trace.dat files being read, and one has 4 CPUs and the other has 2, the "all_cpus" variable will be 6. When iterating at the clean up, when it gets passed 3 (4 CPUs is represented by 0-3) it will then go to 4 and then 5 for the 2 CPUs trace.dat file. Passing in 4 or 5 to kbuffer_read_at_offset() will fail. It needs to use the local CPU count of the trace.dat file. Fixes: 7f0a59aef63c1 ("trace-cmd library: Have tracecmd_iterate_events() start where it left off") Signed-off-by: Steven Rostedt (Google) --- lib/trace-cmd/trace-input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index 42c8312f8395..bf070f057ed0 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -3143,7 +3143,7 @@ int tracecmd_iterate_events_multi(struct tracecmd_input **handles, offset = (int)(records[cpu].record->offset & (handle->page_size - 1)); free_next(handle, local_cpu); /* Reset the buffer to read the cached record again */ - kbuffer_read_at_offset(handle->cpu_data[cpu].kbuf, offset, NULL); + kbuffer_read_at_offset(handle->cpu_data[local_cpu].kbuf, offset, NULL); } free(records); From patchwork Fri Dec 29 03:10:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 13506306 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 129258BE3 for ; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ADD8FC433C8; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1rJ3Hf-00000000HmF-0JbD; Thu, 28 Dec 2023 22:11:39 -0500 From: Steven Rostedt To: linux-trace-devel@vger.kernel.org Cc: "Steven Rostedt (Google)" Subject: [PATCH 2/3] trace-cmd library: Add back setting errno to zero in tracecmd_stack_tracer_status() Date: Thu, 28 Dec 2023 22:10:14 -0500 Message-ID: <20231229031138.68313-3-rostedt@goodmis.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231229031138.68313-1-rostedt@goodmis.org> References: <20231229031138.68313-1-rostedt@goodmis.org> Precedence: bulk X-Mailing-List: linux-trace-devel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: "Steven Rostedt (Google)" A clean up was made to remove all the settings of errno to zero in the library, but it was a bit too aggressive in doing so. It removed the errno setting to zero in tracecmd_stack_tracer_status() just before it called strtol() which it uses to test for the success of that function. By not clearing errno, it was causing trace-cmd stat to report: "Error reading stack tracer status" Fixes: dcd5ee3142 ("libtracecmd: Do not set errno to zero") Signed-off-by: Steven Rostedt (Google) --- lib/trace-cmd/trace-util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/trace-cmd/trace-util.c b/lib/trace-cmd/trace-util.c index fc61f9d1111b..b5002f1daa07 100644 --- a/lib/trace-cmd/trace-util.c +++ b/lib/trace-cmd/trace-util.c @@ -557,6 +557,7 @@ int tracecmd_stack_tracer_status(int *status) buf[n] = 0; + errno = 0; num = strtol(buf, NULL, 10); /* Check for various possible errors */ From patchwork Fri Dec 29 03:10:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 13506308 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22C7717D8 for ; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5798C433CB; Fri, 29 Dec 2023 03:10:48 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1rJ3Hf-00000000HmI-0QxC; Thu, 28 Dec 2023 22:11:39 -0500 From: Steven Rostedt To: linux-trace-devel@vger.kernel.org Cc: "Steven Rostedt (Google)" Subject: [PATCH 3/3] trace-cmd library: Add tracecmd_iterate_reset() Date: Thu, 28 Dec 2023 22:10:15 -0500 Message-ID: <20231229031138.68313-4-rostedt@goodmis.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231229031138.68313-1-rostedt@goodmis.org> References: <20231229031138.68313-1-rostedt@goodmis.org> Precedence: bulk X-Mailing-List: linux-trace-devel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: "Steven Rostedt (Google)" Currently there's no easy way to reset iterating over a trace.dat file if a tracecmd_iterate_events() was called. Add a helper function to do that: tracecmd_iterate_reset() Signed-off-by: Steven Rostedt (Google) --- .../libtracecmd/libtracecmd-iterate.txt | 10 +++++- Documentation/libtracecmd/libtracecmd.txt | 1 + include/trace-cmd/trace-cmd.h | 2 ++ lib/trace-cmd/trace-input.c | 32 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Documentation/libtracecmd/libtracecmd-iterate.txt b/Documentation/libtracecmd/libtracecmd-iterate.txt index 12c54b2ce1a0..dc053ccbbade 100644 --- a/Documentation/libtracecmd/libtracecmd-iterate.txt +++ b/Documentation/libtracecmd/libtracecmd-iterate.txt @@ -4,7 +4,7 @@ libtracecmd(3) NAME ---- tracecmd_iterate_events, tracecmd_iterate_events_multi, tracecmd_follow_event, -tracecmd_follow_missed_events, tracecmd_filter_add - Read events from a trace file +tracecmd_follow_missed_events, tracecmd_filter_add, tracecmd_iterate_reset - Read events from a trace file SYNOPSIS -------- @@ -45,6 +45,7 @@ int *tracecmd_follow_missed_events*(struct tracecmd_input pass:[*]_handle_, void pass:[*]_callback_data_); struct tracecmd_filter pass:[*]*tracecmd_filter_add*(struct tracecmd_input *_handle_, const char pass:[*]_filter_str_, bool _neg_); +int *tracecmd_iterate_reset*(struct tracecmd_input pass:[*]_handle_); -- DESCRIPTION @@ -140,6 +141,10 @@ is defined by *tep_filter_add_filter_str(3)*. If _neg_ is true, then the events that match the filter will be skipped, otherwise the events that match will execute the _callback()_ function in the iterators. +The *tracecmd_iterate_reset()* sets the _handle_ back to start at the beginning, so that +the next call to *tracecmd_iterate_events()* starts back at the first event again, instead +of continuing where it left off. + RETURN VALUE ------------ Both *tracecmd_iterate_events()*, *tracecmd_iterate_events_reverse()* and @@ -147,6 +152,9 @@ Both *tracecmd_iterate_events()*, *tracecmd_iterate_events_reverse()* and (handling the follow and filters appropriately). Or an error value, which can include returning a non-zero result from the _callback()_ function. +*tracecmd_iterate_reset()* returns 0 on success and -1 if an error occurred. Note, +if -1 is returned, a partial reset may have also happened. + EXAMPLE ------- [source,c] diff --git a/Documentation/libtracecmd/libtracecmd.txt b/Documentation/libtracecmd/libtracecmd.txt index bbe6cc78b575..52d4e5994c14 100644 --- a/Documentation/libtracecmd/libtracecmd.txt +++ b/Documentation/libtracecmd/libtracecmd.txt @@ -61,6 +61,7 @@ Iterating over events in a trace file: void pass:[*]_callback_data_); struct tracecmd_filter pass:[*]*tracecmd_filter_add*(struct tracecmd_input *_handle_, const char pass:[*]_filter_str_, bool _neg_); + int *tracecmd_iterate_reset*(struct tracecmd_input pass:[*]_handle_); Read tracing instances from a trace file: int *tracecmd_buffer_instances*(struct tracecmd_input pass:[*]_handle_); diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h index e6527b7116c1..55a0c51845b0 100644 --- a/include/trace-cmd/trace-cmd.h +++ b/include/trace-cmd/trace-cmd.h @@ -72,6 +72,8 @@ int tracecmd_follow_missed_events(struct tracecmd_input *handle, int, void *), void *callback_data); +int tracecmd_iterate_reset(struct tracecmd_input *handle); + int tracecmd_iterate_events(struct tracecmd_input *handle, cpu_set_t *cpus, int cpu_size, int (*callback)(struct tracecmd_input *handle, diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index bf070f057ed0..88bef83f4fe0 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -2113,6 +2113,38 @@ tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu) return tracecmd_read_data(handle, cpu); } +/** + * tracecmd_iterate_reset - Set the handle to iterate from the beginning + * @handle: input handle for the trace.dat file + * + * This causes tracecmd_iterate_events*() to start from the beginning + * of the trace.dat file. + */ +int tracecmd_iterate_reset(struct tracecmd_input *handle) +{ + unsigned long long page_offset; + int cpu; + int ret = 0; + int r; + + for (cpu = 0; cpu < handle->cpus; cpu++) { + page_offset = calc_page_offset(handle, handle->cpu_data[cpu].file_offset); + + r = get_page(handle, cpu, page_offset); + if (r < 0) { + ret = -1; + continue; /* ?? */ + } + + /* If the page was already mapped, we need to reset it */ + if (r) + update_page_info(handle, cpu); + + free_next(handle, cpu); + } + return ret; +} + /** * tracecmd_read_cpu_last - get the last record in a CPU * @handle: input handle for the trace.dat file