From: Steven Rostedt <rostedt@goodmis.org>
To: Uladzislau Rezki <urezki@gmail.com>
Cc: "Zhuo, Qiuxu" <qiuxu.zhuo@intel.com>,
"Paul E . McKenney" <paulmck@kernel.org>,
RCU <rcu@vger.kernel.org>,
"quic_neeraju@quicinc.com" <quic_neeraju@quicinc.com>,
Boqun Feng <boqun.feng@gmail.com>,
Joel Fernandes <joel@joelfernandes.org>,
LKML <linux-kernel@vger.kernel.org>,
Oleksiy Avramchenko <oleksiy.avramchenko@sony.com>,
Frederic Weisbecker <frederic@kernel.org>
Subject: Re: [PATCH 1/1] Reduce synchronize_rcu() waiting time
Date: Mon, 27 Mar 2023 17:48:44 -0400 [thread overview]
Message-ID: <20230327174844.15305988@gandalf.local.home> (raw)
In-Reply-To: <ZBnKKZsSpI8aAk9W@pc636>
On Tue, 21 Mar 2023 16:15:53 +0100
Uladzislau Rezki <urezki@gmail.com> wrote:
> Collect traces as much as you want: XQ-DQ54:/sys/kernel/tracing # echo 1 > tracing_on; sleep 10; echo 0 > tracing_on
> Next problem is how to parse it. Of course you will not be able to parse
> megabytes of traces. For that purpose i use a special C trace parser.
> If you need an example please let me know i can show here.
Not sure if you are familiar with trace-cmd, but the above could have been:
# trace-cmd record -e rcu sleep 10
and then you get the trace.dat file, which reports as:
# trace-cmd report
If you need special parsing, there's a libtracecmd library that lets you do
all that!
https://www.trace-cmd.org/Documentation/libtracecmd/
And for parsing events:
https://www.trace-cmd.org/Documentation/libtraceevent/
Basically have:
struct my_info {
/* store state info here */
};
int main(...) {
struct tracecmd_input *handle;
struct my_info info;
char *file = argv[1];
handle = tracecmd_open(file);
tracecmd_follow_event(handle, "rcu", "rcu_batch_start",
batch_start, &info);
tracecmd_follow_event(handle, "rcu", "rcu_batch_end",
batch_end, &info);
tracecmd_follow_event(handle, "rcu", "rcu_invoke_callback",
invoke_callback, &info);
tracecmd_iterate_events(handle, NULL, 0, NULL, NULL);
tracecmd_close(handle);
}
Where it will iterate the "trace.dat" file passed it, and every time it
hits an event registered by follow_event it will call that function:
static int batch_start(struct tracecmd_input *handle, struct tep_event *event,
struct tep_record *record, int cpu, void *data)
{
struct my_info *info = data;
info->start_timestamp = record->ts;
return 0;
}
static int batch_end(struct tracecmd_input *handle, struct tep_event *event,
struct tep_record *record, int cpu, void *data)
{
struct my_info *info = data;
printf("time = %lld -> %lld\n", info->start_timestapm,
record->ts);
return 0;
}
static int invoke_callback(struct tracecmd_input *handle, struct tep_event *event,
struct tep_record *record, int cpu, void *data)
{
struct my_info *info = data;
struct tep_handle *tep = tracecmd_get_tep(handle);
static struct tep_format_field *ip_field;
unsigned long long ip;
const char *func;
int pid;
if (!ip_field)
ip_field = tep_find_field(event, "func");
tep_read_number_field(ip_field, record->data, &ip);
func = tep_find_function(tep, ip);
pid = tep_data_pid(tep, record);
if (func)
printf("Processing function %s for pid %d\n", func, pid);
else
printf("Processing address 0x%llx for pid %d\n", ip, pid);
return 0;
}
And much more ;-)
Oh, and if you just want to read the live trace without recording, you
could always use libtracefs:
https://www.trace-cmd.org/Documentation/libtracefs/
And instead of using tracecmd_follow_event() with
tracecmd_iterate_events(), you can use:
const char *systems = { "rcu" };
tep = tracefs_local_events_systems(NULL, systems);
tracefs_follow_event(tep, NULL, "rcu", "rcu_invoke_callback",
invoke_callback, &info);
and iterate the live events with:
tracefs_iterate_raw_events(tep, NULL, NULL, 0, NULL, NULL);
With the callback for this being (very similar):
static int invoke_callback(struct tep_event *event,
struct tep_record *record, int cpu, void *data)
{
struct my_info *info = data;
struct tep_handle *tep = event->tep;
static struct tep_format_field *ip_field;
unsigned long long ip;
const char *func;
int pid;
if (!ip_field)
ip_field = tep_find_field(event, "func");
tep_read_number_field(ip_field, record->data, &ip);
func = tep_find_function(tep, ip);
pid = tep_data_pid(tep, record);
if (func)
printf("Processing function %s for pid %d\n", func, pid);
else
printf("Processing address 0x%llx for pid %d\n", ip, pid);
return 0;
}
-- Steve
next prev parent reply other threads:[~2023-03-27 21:49 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-21 10:27 [PATCH 1/1] Reduce synchronize_rcu() waiting time Uladzislau Rezki (Sony)
2023-03-21 14:03 ` Zhuo, Qiuxu
2023-03-21 15:15 ` Uladzislau Rezki
2023-03-22 1:49 ` Zhuo, Qiuxu
2023-03-22 6:50 ` Uladzislau Rezki
2023-03-22 11:21 ` Zhuo, Qiuxu
2023-03-27 11:21 ` Zhang, Qiang1
2023-03-27 17:47 ` Uladzislau Rezki
2023-03-28 0:14 ` Zhang, Qiang1
2023-03-27 21:23 ` Joel Fernandes
2023-03-28 0:12 ` Zhang, Qiang1
2023-03-28 1:06 ` Paul E. McKenney
2023-03-28 1:32 ` Zhang, Qiang1
2023-03-28 1:59 ` Paul E. McKenney
2023-03-28 2:29 ` Joel Fernandes
2023-03-28 15:26 ` Paul E. McKenney
2023-03-28 22:14 ` Paul E. McKenney
2023-03-30 15:11 ` Joel Fernandes
2023-03-30 19:01 ` Paul E. McKenney
2023-03-30 15:09 ` Joel Fernandes
2023-03-30 15:43 ` Uladzislau Rezki
2023-03-30 18:58 ` Paul E. McKenney
2023-03-30 19:18 ` Uladzislau Rezki
2023-03-30 21:16 ` Paul E. McKenney
2023-03-31 10:55 ` Uladzislau Rezki
2023-03-31 18:39 ` Paul E. McKenney
2023-03-30 18:57 ` Paul E. McKenney
2023-03-27 21:48 ` Steven Rostedt [this message]
2023-03-27 21:50 ` Steven Rostedt
2023-03-28 1:28 ` Zhuo, Qiuxu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230327174844.15305988@gandalf.local.home \
--to=rostedt@goodmis.org \
--cc=boqun.feng@gmail.com \
--cc=frederic@kernel.org \
--cc=joel@joelfernandes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleksiy.avramchenko@sony.com \
--cc=paulmck@kernel.org \
--cc=qiuxu.zhuo@intel.com \
--cc=quic_neeraju@quicinc.com \
--cc=rcu@vger.kernel.org \
--cc=urezki@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).