Re: [Powertop] [PATCH v1] Fix timer and work perf events timestamp tracing

Chris Ferron <chris.e.ferron at linux.intel.com> Thu, 06 Sep 2012 08:30:39 -0700
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
--===============4523906428603684578==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

On 09/06/2012 06:39 AM, Rajagopal Venkat wrote:
> Fix timer and work perf events timestamp tracing by
> - considering event exit timestamp relative to measurement first
> timestamp for events which entry timestamp is not recorded.
> Currently these events exit timestamp itself is considered as
> usage period resulting in false usage report.
> - clearing event timestamps from global map at the end of each
> measurement to avoid collision with earlier recorded timestamps.
>
> Signed-off-by: Rajagopal Venkat <rajagopal.venkat(a)linaro.org>
> ---
>   src/process/do_process.cpp | 12 ++++++++++++
>   src/process/timer.cpp      |  4 ++++
>   src/process/work.cpp       |  4 ++++
>   3 files changed, 20 insertions(+)
>
> diff --git a/src/process/do_process.cpp b/src/process/do_process.cpp
> index cb7c672..eaef7f1 100644
> --- a/src/process/do_process.cpp
> +++ b/src/process/do_process.cpp
> @@ -490,6 +490,10 @@ void perf_process_bundle::handle_trace_point(void *t=
race, int cpu, uint64_t time
>   		}
>   		pop_consumer(cpu);
>   		t =3D timer->done(time, tmr);
> +		if (t =3D=3D ~0ULL) {
> +			timer->fire(first_stamp, tmr);
> +			t =3D timer->done(time, tmr);
> +		}
>   		consumer_child_time(cpu, t);
>   	}
>   	else if (strcmp(event->name, "hrtimer_expire_entry") =3D=3D 0) {
> @@ -532,6 +536,10 @@ void perf_process_bundle::handle_trace_point(void *t=
race, int cpu, uint64_t time
>   =

>   		pop_consumer(cpu);
>   		t =3D timer->done(time, tmr);
> +		if (t =3D=3D ~0ULL) {
> +			timer->fire(first_stamp, tmr);
> +			t =3D timer->done(time, tmr);
> +		}
>   		consumer_child_time(cpu, t);
>   	}
>   	else if (strcmp(event->name, "workqueue_execute_start") =3D=3D 0) {
> @@ -575,6 +583,10 @@ void perf_process_bundle::handle_trace_point(void *t=
race, int cpu, uint64_t time
>   		}
>   		pop_consumer(cpu);
>   		t =3D work->done(time, wk);
> +		if (t =3D=3D ~0ULL) {
> +			work->fire(first_stamp, wk);
> +			t =3D work->done(time, wk);
> +		}
>   		consumer_child_time(cpu, t);
>   	}
>   	else if (strcmp(event->name, "cpu_idle") =3D=3D 0) {
> diff --git a/src/process/timer.cpp b/src/process/timer.cpp
> index 8917490..1ca8c25 100644
> --- a/src/process/timer.cpp
> +++ b/src/process/timer.cpp
> @@ -79,6 +79,9 @@ uint64_t timer::done(uint64_t time, uint64_t timer_stru=
ct)
>   {
>   	int64_t delta;
>   =

> +	if (running_since.find(timer_struct) =3D=3D running_since.end())
> +		return ~0ULL;
> +
>   	if (running_since[timer_struct] > time)
>   		return 0;
>   =

> @@ -147,6 +150,7 @@ void clear_timers(void)
>   		all_timers.erase(it);
>   		it =3D all_timers.begin();
>   	}
> +	running_since.clear();
>   }
>   =

>   bool timer::is_deferred(void)
> diff --git a/src/process/work.cpp b/src/process/work.cpp
> index 82f13a2..e62e5d3 100644
> --- a/src/process/work.cpp
> +++ b/src/process/work.cpp
> @@ -56,6 +56,9 @@ uint64_t work::done(uint64_t time, uint64_t work_struct)
>   {
>   	int64_t delta;
>   =

> +	if (running_since.find(work_struct) =3D=3D running_since.end())
> +		return ~0ULL;
> +
>   	if (running_since[work_struct] > time)
>   		return 0;
>   =

> @@ -102,6 +105,7 @@ void clear_work(void)
>   		all_work.erase(it);
>   		it =3D all_work.begin();
>   	}
> +	running_since.clear();
>   }
>   =

>   =

patched merged
Thank You
-Chris


--===============4523906428603684578==--