diff options
Diffstat (limited to 'tools/perf/util/header.c')
| -rw-r--r-- | tools/perf/util/header.c | 134 | 
1 files changed, 123 insertions, 11 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7a67d017d72c..9cf4efdcbbbd 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -46,6 +46,7 @@  #include "util/util.h" // perf_exe()  #include "cputopo.h"  #include "bpf-event.h" +#include "clockid.h"  #include <linux/ctype.h>  #include <internal/lib.h> @@ -891,8 +892,42 @@ static int write_auxtrace(struct feat_fd *ff,  static int write_clockid(struct feat_fd *ff,  			 struct evlist *evlist __maybe_unused)  { -	return do_write(ff, &ff->ph->env.clockid_res_ns, -			sizeof(ff->ph->env.clockid_res_ns)); +	return do_write(ff, &ff->ph->env.clock.clockid_res_ns, +			sizeof(ff->ph->env.clock.clockid_res_ns)); +} + +static int write_clock_data(struct feat_fd *ff, +			    struct evlist *evlist __maybe_unused) +{ +	u64 *data64; +	u32 data32; +	int ret; + +	/* version */ +	data32 = 1; + +	ret = do_write(ff, &data32, sizeof(data32)); +	if (ret < 0) +		return ret; + +	/* clockid */ +	data32 = ff->ph->env.clock.clockid; + +	ret = do_write(ff, &data32, sizeof(data32)); +	if (ret < 0) +		return ret; + +	/* TOD ref time */ +	data64 = &ff->ph->env.clock.tod_ns; + +	ret = do_write(ff, data64, sizeof(*data64)); +	if (ret < 0) +		return ret; + +	/* clockid ref time */ +	data64 = &ff->ph->env.clock.clockid_ns; + +	return do_write(ff, data64, sizeof(*data64));  }  static int write_dir_format(struct feat_fd *ff, @@ -1546,7 +1581,50 @@ static void print_cpu_topology(struct feat_fd *ff, FILE *fp)  static void print_clockid(struct feat_fd *ff, FILE *fp)  {  	fprintf(fp, "# clockid frequency: %"PRIu64" MHz\n", -		ff->ph->env.clockid_res_ns * 1000); +		ff->ph->env.clock.clockid_res_ns * 1000); +} + +static void print_clock_data(struct feat_fd *ff, FILE *fp) +{ +	struct timespec clockid_ns; +	char tstr[64], date[64]; +	struct timeval tod_ns; +	clockid_t clockid; +	struct tm ltime; +	u64 ref; + +	if (!ff->ph->env.clock.enabled) { +		fprintf(fp, "# reference time disabled\n"); +		return; +	} + +	/* Compute TOD time. */ +	ref = ff->ph->env.clock.tod_ns; +	tod_ns.tv_sec = ref / NSEC_PER_SEC; +	ref -= tod_ns.tv_sec * NSEC_PER_SEC; +	tod_ns.tv_usec = ref / NSEC_PER_USEC; + +	/* Compute clockid time. */ +	ref = ff->ph->env.clock.clockid_ns; +	clockid_ns.tv_sec = ref / NSEC_PER_SEC; +	ref -= clockid_ns.tv_sec * NSEC_PER_SEC; +	clockid_ns.tv_nsec = ref; + +	clockid = ff->ph->env.clock.clockid; + +	if (localtime_r(&tod_ns.tv_sec, <ime) == NULL) +		snprintf(tstr, sizeof(tstr), "<error>"); +	else { +		strftime(date, sizeof(date), "%F %T", <ime); +		scnprintf(tstr, sizeof(tstr), "%s.%06d", +			  date, (int) tod_ns.tv_usec); +	} + +	fprintf(fp, "# clockid: %s (%u)\n", clockid_name(clockid), clockid); +	fprintf(fp, "# reference time: %s = %ld.%06d (TOD) = %ld.%09ld (%s)\n", +		    tstr, tod_ns.tv_sec, (int) tod_ns.tv_usec, +		    clockid_ns.tv_sec, clockid_ns.tv_nsec, +		    clockid_name(clockid));  }  static void print_dir_format(struct feat_fd *ff, FILE *fp) @@ -1978,7 +2056,7 @@ static int __event_process_build_id(struct perf_record_header_build_id *bev,  	struct machine *machine;  	u16 cpumode;  	struct dso *dso; -	enum dso_kernel_type dso_type; +	enum dso_space_type dso_space;  	machine = perf_session__findnew_machine(session, bev->pid);  	if (!machine) @@ -1988,14 +2066,14 @@ static int __event_process_build_id(struct perf_record_header_build_id *bev,  	switch (cpumode) {  	case PERF_RECORD_MISC_KERNEL: -		dso_type = DSO_TYPE_KERNEL; +		dso_space = DSO_SPACE__KERNEL;  		break;  	case PERF_RECORD_MISC_GUEST_KERNEL: -		dso_type = DSO_TYPE_GUEST_KERNEL; +		dso_space = DSO_SPACE__KERNEL_GUEST;  		break;  	case PERF_RECORD_MISC_USER:  	case PERF_RECORD_MISC_GUEST_USER: -		dso_type = DSO_TYPE_USER; +		dso_space = DSO_SPACE__USER;  		break;  	default:  		goto out; @@ -2007,14 +2085,13 @@ static int __event_process_build_id(struct perf_record_header_build_id *bev,  		dso__set_build_id(dso, &bev->build_id); -		if (dso_type != DSO_TYPE_USER) { +		if (dso_space != DSO_SPACE__USER) {  			struct kmod_path m = { .name = NULL, };  			if (!kmod_path__parse_name(&m, filename) && m.kmod)  				dso__set_module_info(dso, &m, machine); -			else -				dso->kernel = dso_type; +			dso->kernel = dso_space;  			free(m.name);  		} @@ -2732,9 +2809,43 @@ out:  static int process_clockid(struct feat_fd *ff,  			   void *data __maybe_unused)  { -	if (do_read_u64(ff, &ff->ph->env.clockid_res_ns)) +	if (do_read_u64(ff, &ff->ph->env.clock.clockid_res_ns)) +		return -1; + +	return 0; +} + +static int process_clock_data(struct feat_fd *ff, +			      void *_data __maybe_unused) +{ +	u32 data32; +	u64 data64; + +	/* version */ +	if (do_read_u32(ff, &data32)) +		return -1; + +	if (data32 != 1) +		return -1; + +	/* clockid */ +	if (do_read_u32(ff, &data32)) +		return -1; + +	ff->ph->env.clock.clockid = data32; + +	/* TOD ref time */ +	if (do_read_u64(ff, &data64)) +		return -1; + +	ff->ph->env.clock.tod_ns = data64; + +	/* clockid ref time */ +	if (do_read_u64(ff, &data64))  		return -1; +	ff->ph->env.clock.clockid_ns = data64; +	ff->ph->env.clock.enabled = true;  	return 0;  } @@ -3008,6 +3119,7 @@ const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {  	FEAT_OPR(BPF_BTF,       bpf_btf,        false),  	FEAT_OPR(COMPRESSED,	compressed,	false),  	FEAT_OPR(CPU_PMU_CAPS,	cpu_pmu_caps,	false), +	FEAT_OPR(CLOCK_DATA,	clock_data,	false),  };  struct header_print_data {  | 
