All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Joseph Schuchart <joseph.schuchart@tu-dresden.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Paul Mackerras <paulus@samba.org>, Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	thomas.ilsche@tu-dresden.de, linux-kernel@vger.kernel.org,
	Fr??d??ric Weisbecker <fweisbec@gmail.com>,
	David Ahern <dsahern@gmail.com>
Subject: Re: [PATCH] Perf: Correct Assumptions about Sample Timestamps in Passes
Date: Thu, 14 Nov 2013 11:05:52 +0100	[thread overview]
Message-ID: <20131114100552.GA5064@gmail.com> (raw)
In-Reply-To: <528490DE.4080204@tu-dresden.de>

* Joseph Schuchart <joseph.schuchart@tu-dresden.de> wrote:


> > Just a quick side note, while I realize that you are 
> > (rightfully!) concerned about correctness primarily, if that loop 
> > over MAX_NR_CPUS executes often enough then this might hurt 
> > performance:
> > 
> >    perf.h:#define MAX_NR_CPUS                      256
> > 
> > So it might be better to maintain a rolling min_max_timestamp in 
> > this place:
> > 
> > +       os->max_timestamps[sample->cpu] = timestamp;
> > 
> > ?
> > 
> > If done that way then AFAICS we could even eliminate the 
> > ->max_timestamps[NR_CPUS] array.
> 
> I can understand your performance concerns. However, I am not 
> sure how we can determine the minimal max_timestamp of all cpus 
> without storing the information on a per-cpu basis first. 
> Accumulating it on the fly would only lead to a global 
> max_timestamp. [...]

Ok. So this:

+static inline void set_next_flush(struct perf_session *session)
+{
+       int i;
+       u64 min_max_timestamp = session->ordered_samples.max_timestamps[0];
+       for (i = 1; i < MAX_NR_CPUS; i++) {
+               if (min_max_timestamp > session->ordered_samples.max_timestamps[i])
+                       min_max_timestamp = session->ordered_samples.max_timestamps[i];
+       }
+       session->ordered_samples.next_flush = min_max_timestamp;
+}

which should IMHO be written in a bit clearer form as:

static inline void set_next_flush(struct perf_session *session)
{
	u64 *timestamps = session->ordered_samples.max_timestamps;
	u64 min_timestamp = timestamps[0];
 	int i;

	for (i = 1; i < MAX_NR_CPUS; i++) {
		if (min_timestamp > timestamps[i])
			min_timestamp = timestamps[i];
	}

	session->ordered_samples.next_flush = min_timestamp;
}

calculates the minimum of the max_timestamps[] array, right?

Now, the max_timestamps[] array gets modified only in a single 
place, from the sample timestamps, via:

	os->max_timestamps[sample->cpu] = timestamp;

My suggestion was an identity transformation: to calculate the 
minimum of the array when the max_timestamps[] array is modified. 
A new minimum happens if the freshly written value is smaller 
than the current minimum.

I.e. the max_timestamps[] array itself is redundant, and we just 
have to update a rolling minimum - which is a (session-) global 
minimum - which is equivalent to the more complex minimum 
calculation in your patch.

What am I missing?

Thanks,

	Ingo

  reply	other threads:[~2013-11-14 10:06 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-14  8:07 [PATCH] Perf: Correct Assumptions about Sample Timestamps in Passes Joseph Schuchart
2013-11-14  8:39 ` Ingo Molnar
2013-11-14  8:59   ` Joseph Schuchart
2013-11-14 10:05     ` Ingo Molnar [this message]
2013-11-14 14:26       ` David Ahern
2013-11-14 14:44         ` Peter Zijlstra
2013-11-14 15:02           ` David Ahern
2013-11-14 15:25             ` Peter Zijlstra
2013-11-21 14:55       ` Joseph Schuchart
2013-11-27 13:51         ` Ingo Molnar
2013-12-20 12:27           ` Joseph Schuchart
2013-12-20 17:09             ` David Ahern
2013-12-23 13:10               ` Frederic Weisbecker
2013-12-23 14:44                 ` David Ahern
2013-12-26 15:14                   ` Frederic Weisbecker
2013-12-26 15:24                     ` David Ahern
2013-12-26 15:30                       ` Frederic Weisbecker
2014-01-01 18:37                         ` David Ahern
2014-01-03 22:07                           ` Frederic Weisbecker
2014-01-03 22:45                             ` David Ahern
2014-01-04 15:05                               ` Frederic Weisbecker
2014-01-08 21:48                                 ` David Ahern
2014-01-09 15:19                                   ` Frederic Weisbecker
2014-01-12 15:46                                     ` David Ahern

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20131114100552.GA5064@gmail.com \
    --to=mingo@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=dsahern@gmail.com \
    --cc=fweisbec@gmail.com \
    --cc=joseph.schuchart@tu-dresden.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=paulus@samba.org \
    --cc=thomas.ilsche@tu-dresden.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.