Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf record: Read from overwritable ring buffer

Drive the evlist->bkw_mmap_state state machine during draining and when
SIGUSR2 is received. Read the backward ring buffer in record__mmap_read_all.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-12-git-send-email-wangnan0@huawei.com
Signed-off-by: He Kuang <hekuang@huawei.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Wang Nan and committed by
Arnaldo Carvalho de Melo
05737464 54cc54de

+30 -1
+30 -1
tools/perf/builtin-record.c
··· 555 555 if (err) 556 556 return err; 557 557 558 - return err; 558 + return record__mmap_read_evlist(rec, rec->evlist, true); 559 559 } 560 560 561 561 static void record__init_features(struct record *rec) ··· 953 953 for (;;) { 954 954 unsigned long long hits = rec->samples; 955 955 956 + /* 957 + * rec->evlist->bkw_mmap_state is possible to be 958 + * BKW_MMAP_EMPTY here: when done == true and 959 + * hits != rec->samples in previous round. 960 + * 961 + * perf_evlist__toggle_bkw_mmap ensure we never 962 + * convert BKW_MMAP_EMPTY to BKW_MMAP_DATA_PENDING. 963 + */ 964 + if (trigger_is_hit(&switch_output_trigger) || done || draining) 965 + perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING); 966 + 956 967 if (record__mmap_read_all(rec) < 0) { 957 968 trigger_error(&auxtrace_snapshot_trigger); 958 969 trigger_error(&switch_output_trigger); ··· 983 972 } 984 973 985 974 if (trigger_is_hit(&switch_output_trigger)) { 975 + /* 976 + * If switch_output_trigger is hit, the data in 977 + * overwritable ring buffer should have been collected, 978 + * so bkw_mmap_state should be set to BKW_MMAP_EMPTY. 979 + * 980 + * If SIGUSR2 raise after or during record__mmap_read_all(), 981 + * record__mmap_read_all() didn't collect data from 982 + * overwritable ring buffer. Read again. 983 + */ 984 + if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING) 985 + continue; 986 986 trigger_ready(&switch_output_trigger); 987 + 988 + /* 989 + * Reenable events in overwrite ring buffer after 990 + * record__mmap_read_all(): we should have collected 991 + * data from it. 992 + */ 993 + perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING); 987 994 988 995 if (!quiet) 989 996 fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n",