Skip to content

Commit c0bdc1c

Browse files
WangNan0acmel
authored andcommitted
perf record: Turns auxtrace_snapshot_enable into 3 states
auxtrace_snapshot_enable has only two states (0/1). Turns it into a triple states enum so SIGUSR2 handler can safely do other works without triggering auxtrace snapshot. Signed-off-by: Wang Nan <wangnan0@huawei.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1460535673-159866-4-git-send-email-wangnan0@huawei.com Signed-off-by: He Kuang <hekuang@huawei.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 040f991 commit c0bdc1c

File tree

1 file changed

+49
-10
lines changed

1 file changed

+49
-10
lines changed

tools/perf/builtin-record.c

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,43 @@ static int record__mmap_read(struct record *rec, int idx)
125125
static volatile int done;
126126
static volatile int signr = -1;
127127
static volatile int child_finished;
128-
static volatile int auxtrace_snapshot_enabled;
128+
129+
static volatile enum {
130+
AUXTRACE_SNAPSHOT_OFF = -1,
131+
AUXTRACE_SNAPSHOT_DISABLED = 0,
132+
AUXTRACE_SNAPSHOT_ENABLED = 1,
133+
} auxtrace_snapshot_state = AUXTRACE_SNAPSHOT_OFF;
134+
135+
static inline void
136+
auxtrace_snapshot_on(void)
137+
{
138+
auxtrace_snapshot_state = AUXTRACE_SNAPSHOT_DISABLED;
139+
}
140+
141+
static inline void
142+
auxtrace_snapshot_enable(void)
143+
{
144+
if (auxtrace_snapshot_state == AUXTRACE_SNAPSHOT_OFF)
145+
return;
146+
auxtrace_snapshot_state = AUXTRACE_SNAPSHOT_ENABLED;
147+
}
148+
149+
static inline void
150+
auxtrace_snapshot_disable(void)
151+
{
152+
if (auxtrace_snapshot_state == AUXTRACE_SNAPSHOT_OFF)
153+
return;
154+
auxtrace_snapshot_state = AUXTRACE_SNAPSHOT_DISABLED;
155+
}
156+
157+
static inline bool
158+
auxtrace_snapshot_is_enabled(void)
159+
{
160+
if (auxtrace_snapshot_state == AUXTRACE_SNAPSHOT_OFF)
161+
return false;
162+
return auxtrace_snapshot_state == AUXTRACE_SNAPSHOT_ENABLED;
163+
}
164+
129165
static volatile int auxtrace_snapshot_err;
130166
static volatile int auxtrace_record__snapshot_started;
131167

@@ -249,7 +285,7 @@ static void record__read_auxtrace_snapshot(struct record *rec)
249285
} else {
250286
auxtrace_snapshot_err = auxtrace_record__snapshot_finish(rec->itr);
251287
if (!auxtrace_snapshot_err)
252-
auxtrace_snapshot_enabled = 1;
288+
auxtrace_snapshot_enable();
253289
}
254290
}
255291

@@ -615,10 +651,13 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
615651
signal(SIGCHLD, sig_handler);
616652
signal(SIGINT, sig_handler);
617653
signal(SIGTERM, sig_handler);
618-
if (rec->opts.auxtrace_snapshot_mode)
654+
655+
if (rec->opts.auxtrace_snapshot_mode) {
619656
signal(SIGUSR2, snapshot_sig_handler);
620-
else
657+
auxtrace_snapshot_on();
658+
} else {
621659
signal(SIGUSR2, SIG_IGN);
660+
}
622661

623662
session = perf_session__new(file, false, tool);
624663
if (session == NULL) {
@@ -744,12 +783,12 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
744783
perf_evlist__enable(rec->evlist);
745784
}
746785

747-
auxtrace_snapshot_enabled = 1;
786+
auxtrace_snapshot_enable();
748787
for (;;) {
749788
unsigned long long hits = rec->samples;
750789

751790
if (record__mmap_read_all(rec) < 0) {
752-
auxtrace_snapshot_enabled = 0;
791+
auxtrace_snapshot_disable();
753792
err = -1;
754793
goto out_child;
755794
}
@@ -787,12 +826,12 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
787826
* disable events in this case.
788827
*/
789828
if (done && !disabled && !target__none(&opts->target)) {
790-
auxtrace_snapshot_enabled = 0;
829+
auxtrace_snapshot_disable();
791830
perf_evlist__disable(rec->evlist);
792831
disabled = true;
793832
}
794833
}
795-
auxtrace_snapshot_enabled = 0;
834+
auxtrace_snapshot_disable();
796835

797836
if (forks && workload_exec_errno) {
798837
char msg[STRERR_BUFSIZE];
@@ -1358,9 +1397,9 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
13581397

13591398
static void snapshot_sig_handler(int sig __maybe_unused)
13601399
{
1361-
if (!auxtrace_snapshot_enabled)
1400+
if (!auxtrace_snapshot_is_enabled())
13621401
return;
1363-
auxtrace_snapshot_enabled = 0;
1402+
auxtrace_snapshot_disable();
13641403
auxtrace_snapshot_err = auxtrace_record__snapshot_start(record.itr);
13651404
auxtrace_record__snapshot_started = 1;
13661405
}

0 commit comments

Comments
 (0)