mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf report: Set PERF_SAMPLE_DATA_SRC bit for Arm SPE event
Since commitbb30acae4c("perf report: Bail out --mem-mode if mem info is not available") "perf mem report" and "perf report --mem-mode" don't report result if the PERF_SAMPLE_DATA_SRC bit is missed in sample type. The commitffab487052("perf: arm-spe: Fix perf report --mem-mode") partially fixes the issue. It adds PERF_SAMPLE_DATA_SRC bit for Arm SPE event, this allows the perf data file generated by kernel v5.18-rc1 or later version can be reported properly. On the other hand, perf tool still fails to be backward compatibility for a data file recorded by an older version's perf which contains Arm SPE trace data. This patch is a workaround in reporting phase, when detects ARM SPE PMU event and without PERF_SAMPLE_DATA_SRC bit, it will force to set the bit in the sample type and give a warning info. Fixes:bb30acae4c("perf report: Bail out --mem-mode if mem info is not available") Reviewed-by: James Clark <james.clark@arm.com> Signed-off-by: Leo Yan <leo.yan@linaro.org> Tested-by: German Gomez <german.gomez@arm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com> Link: https://lore.kernel.org/r/20220414123201.842754-1-leo.yan@linaro.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									c6d8df0106
								
							
						
					
					
						commit
						ccb17caecf
					
				
					 1 changed files with 14 additions and 0 deletions
				
			
		| 
						 | 
					@ -353,6 +353,7 @@ static int report__setup_sample_type(struct report *rep)
 | 
				
			||||||
	struct perf_session *session = rep->session;
 | 
						struct perf_session *session = rep->session;
 | 
				
			||||||
	u64 sample_type = evlist__combined_sample_type(session->evlist);
 | 
						u64 sample_type = evlist__combined_sample_type(session->evlist);
 | 
				
			||||||
	bool is_pipe = perf_data__is_pipe(session->data);
 | 
						bool is_pipe = perf_data__is_pipe(session->data);
 | 
				
			||||||
 | 
						struct evsel *evsel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (session->itrace_synth_opts->callchain ||
 | 
						if (session->itrace_synth_opts->callchain ||
 | 
				
			||||||
	    session->itrace_synth_opts->add_callchain ||
 | 
						    session->itrace_synth_opts->add_callchain ||
 | 
				
			||||||
| 
						 | 
					@ -407,6 +408,19 @@ static int report__setup_sample_type(struct report *rep)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sort__mode == SORT_MODE__MEMORY) {
 | 
						if (sort__mode == SORT_MODE__MEMORY) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * FIXUP: prior to kernel 5.18, Arm SPE missed to set
 | 
				
			||||||
 | 
							 * PERF_SAMPLE_DATA_SRC bit in sample type.  For backward
 | 
				
			||||||
 | 
							 * compatibility, set the bit if it's an old perf data file.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							evlist__for_each_entry(session->evlist, evsel) {
 | 
				
			||||||
 | 
								if (strstr(evsel->name, "arm_spe") &&
 | 
				
			||||||
 | 
									!(sample_type & PERF_SAMPLE_DATA_SRC)) {
 | 
				
			||||||
 | 
									evsel->core.attr.sample_type |= PERF_SAMPLE_DATA_SRC;
 | 
				
			||||||
 | 
									sample_type |= PERF_SAMPLE_DATA_SRC;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!is_pipe && !(sample_type & PERF_SAMPLE_DATA_SRC)) {
 | 
							if (!is_pipe && !(sample_type & PERF_SAMPLE_DATA_SRC)) {
 | 
				
			||||||
			ui__error("Selected --mem-mode but no mem data. "
 | 
								ui__error("Selected --mem-mode but no mem data. "
 | 
				
			||||||
				  "Did you call perf record without -d?\n");
 | 
									  "Did you call perf record without -d?\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue