mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf stat: Use perf_evlist__prepare/start_workload()
The perf stat had an open code to the duplicated work. Use the helper as it now can be called without struct perf_record_opts. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1362987798-24969-7-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									55e162ea76
								
							
						
					
					
						commit
						acf2892270
					
				
					 1 changed files with 7 additions and 51 deletions
				
			
		| 
						 | 
				
			
			@ -337,16 +337,14 @@ static void print_interval(void)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __run_perf_stat(int argc __maybe_unused, const char **argv)
 | 
			
		||||
static int __run_perf_stat(int argc, const char **argv)
 | 
			
		||||
{
 | 
			
		||||
	char msg[512];
 | 
			
		||||
	unsigned long long t0, t1;
 | 
			
		||||
	struct perf_evsel *counter;
 | 
			
		||||
	struct timespec ts;
 | 
			
		||||
	int status = 0;
 | 
			
		||||
	int child_ready_pipe[2], go_pipe[2];
 | 
			
		||||
	const bool forks = (argc > 0);
 | 
			
		||||
	char buf;
 | 
			
		||||
 | 
			
		||||
	if (interval) {
 | 
			
		||||
		ts.tv_sec  = interval / 1000;
 | 
			
		||||
| 
						 | 
				
			
			@ -362,55 +360,12 @@ static int __run_perf_stat(int argc __maybe_unused, const char **argv)
 | 
			
		|||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
 | 
			
		||||
		perror("failed to create pipes");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (forks) {
 | 
			
		||||
		if ((child_pid = fork()) < 0)
 | 
			
		||||
			perror("failed to fork");
 | 
			
		||||
 | 
			
		||||
		if (!child_pid) {
 | 
			
		||||
			close(child_ready_pipe[0]);
 | 
			
		||||
			close(go_pipe[1]);
 | 
			
		||||
			fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * Do a dummy execvp to get the PLT entry resolved,
 | 
			
		||||
			 * so we avoid the resolver overhead on the real
 | 
			
		||||
			 * execvp call.
 | 
			
		||||
			 */
 | 
			
		||||
			execvp("", (char **)argv);
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * Tell the parent we're ready to go
 | 
			
		||||
			 */
 | 
			
		||||
			close(child_ready_pipe[1]);
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * Wait until the parent tells us to go.
 | 
			
		||||
			 */
 | 
			
		||||
			if (read(go_pipe[0], &buf, 1) == -1)
 | 
			
		||||
				perror("unable to read pipe");
 | 
			
		||||
 | 
			
		||||
			execvp(argv[0], (char **)argv);
 | 
			
		||||
 | 
			
		||||
			perror(argv[0]);
 | 
			
		||||
			exit(-1);
 | 
			
		||||
		if (perf_evlist__prepare_workload(evsel_list, &target, argv,
 | 
			
		||||
						  false, false) < 0) {
 | 
			
		||||
			perror("failed to prepare workload");
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (perf_target__none(&target))
 | 
			
		||||
			evsel_list->threads->map[0] = child_pid;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Wait for the child to be ready to exec.
 | 
			
		||||
		 */
 | 
			
		||||
		close(child_ready_pipe[1]);
 | 
			
		||||
		close(go_pipe[0]);
 | 
			
		||||
		if (read(child_ready_pipe[0], &buf, 1) == -1)
 | 
			
		||||
			perror("unable to read pipe");
 | 
			
		||||
		close(child_ready_pipe[0]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (group)
 | 
			
		||||
| 
						 | 
				
			
			@ -457,7 +412,8 @@ static int __run_perf_stat(int argc __maybe_unused, const char **argv)
 | 
			
		|||
	clock_gettime(CLOCK_MONOTONIC, &ref_time);
 | 
			
		||||
 | 
			
		||||
	if (forks) {
 | 
			
		||||
		close(go_pipe[1]);
 | 
			
		||||
		perf_evlist__start_workload(evsel_list);
 | 
			
		||||
 | 
			
		||||
		if (interval) {
 | 
			
		||||
			while (!waitpid(child_pid, &status, WNOHANG)) {
 | 
			
		||||
				nanosleep(&ts, NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue