2 #include <linux/kernel.h>
3 #include <linux/types.h>
4 #include <linux/bitops.h>
5 #include <linux/log2.h>
6 #include <linux/zalloc.h>
8 #include "../../util/evlist.h"
9 #include "../../util/auxtrace.h"
10 #include "../../util/evsel.h"
12 #define PERF_EVENT_CPUM_SF 0xB0000 /* Event: Basic-sampling */
13 #define PERF_EVENT_CPUM_SF_DIAG 0xBD000 /* Event: Combined-sampling */
14 #define DEFAULT_AUX_PAGES 128
15 #define DEFAULT_FREQ 4000
17 static void cpumsf_free(struct auxtrace_record
*itr
)
22 static size_t cpumsf_info_priv_size(struct auxtrace_record
*itr __maybe_unused
,
23 struct perf_evlist
*evlist __maybe_unused
)
29 cpumsf_info_fill(struct auxtrace_record
*itr __maybe_unused
,
30 struct perf_session
*session __maybe_unused
,
31 struct auxtrace_info_event
*auxtrace_info __maybe_unused
,
32 size_t priv_size __maybe_unused
)
34 auxtrace_info
->type
= PERF_AUXTRACE_S390_CPUMSF
;
39 cpumsf_reference(struct auxtrace_record
*itr __maybe_unused
)
45 cpumsf_recording_options(struct auxtrace_record
*ar __maybe_unused
,
46 struct perf_evlist
*evlist __maybe_unused
,
47 struct record_opts
*opts
)
49 unsigned int factor
= 1;
52 opts
->full_auxtrace
= true;
55 * The AUX buffer size should be set properly to avoid
56 * overflow of samples if it is not set explicitly.
57 * DEFAULT_AUX_PAGES is an proper size when sampling frequency
58 * is DEFAULT_FREQ. It is expected to hold about 1/2 second
59 * of sampling data. The size used for AUX buffer will scale
60 * according to the specified frequency and DEFAULT_FREQ.
62 if (!opts
->auxtrace_mmap_pages
) {
63 if (opts
->user_freq
!= UINT_MAX
)
64 factor
= (opts
->user_freq
+ DEFAULT_FREQ
66 pages
= DEFAULT_AUX_PAGES
* factor
;
67 opts
->auxtrace_mmap_pages
= roundup_pow_of_two(pages
);
74 cpumsf_parse_snapshot_options(struct auxtrace_record
*itr __maybe_unused
,
75 struct record_opts
*opts __maybe_unused
,
76 const char *str __maybe_unused
)
82 * auxtrace_record__init is called when perf record
83 * check if the event really need auxtrace
85 struct auxtrace_record
*auxtrace_record__init(struct perf_evlist
*evlist
,
88 struct auxtrace_record
*aux
;
93 if (evlist
->nr_entries
== 0)
96 evlist__for_each_entry(evlist
, pos
) {
97 if (pos
->attr
.config
== PERF_EVENT_CPUM_SF_DIAG
) {
106 /* sampling in diagnose mode. alloc aux buffer */
107 aux
= zalloc(sizeof(*aux
));
113 aux
->parse_snapshot_options
= cpumsf_parse_snapshot_options
;
114 aux
->recording_options
= cpumsf_recording_options
;
115 aux
->info_priv_size
= cpumsf_info_priv_size
;
116 aux
->info_fill
= cpumsf_info_fill
;
117 aux
->free
= cpumsf_free
;
118 aux
->reference
= cpumsf_reference
;