public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Daniel Lezcano <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, daniel.lezcano@linaro.org,
	tglx@linutronix.de, hpa@zytor.com, mingo@kernel.org
Subject: [tip:irq/core] genirq/timings: Fix next event index function
Date: Wed, 12 Jun 2019 05:27:38 -0700	[thread overview]
Message-ID: <tip-619c1baa91b2820eae9ff5d89eb525df81ea7a5a@git.kernel.org> (raw)
In-Reply-To: <20190527205521.12091-2-daniel.lezcano@linaro.org>

Commit-ID:  619c1baa91b2820eae9ff5d89eb525df81ea7a5a
Gitweb:     https://git.kernel.org/tip/619c1baa91b2820eae9ff5d89eb525df81ea7a5a
Author:     Daniel Lezcano <daniel.lezcano@linaro.org>
AuthorDate: Mon, 27 May 2019 22:55:14 +0200
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Wed, 12 Jun 2019 10:47:03 +0200

genirq/timings: Fix next event index function

The current code is luckily working with most of the interval samples
testing but actually it fails to correctly detect pattern repetition
breaking at the end of the buffer.

Narrowing down the bug has been a real pain because of the pointers,
so the routine is rewrittne by using indexes instead.

Fixes: bbba0e7c5cda "genirq/timings: Add array suffix computation code"
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: andriy.shevchenko@linux.intel.com
Link: https://lkml.kernel.org/r/20190527205521.12091-2-daniel.lezcano@linaro.org

---
 kernel/irq/timings.c | 51 ++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 42 insertions(+), 9 deletions(-)

diff --git a/kernel/irq/timings.c b/kernel/irq/timings.c
index 90c735da15d0..4f5daf3db13b 100644
--- a/kernel/irq/timings.c
+++ b/kernel/irq/timings.c
@@ -297,7 +297,16 @@ static u64 irq_timings_ema_new(u64 value, u64 ema_old)
 
 static int irq_timings_next_event_index(int *buffer, size_t len, int period_max)
 {
-	int i;
+	int period;
+
+	/*
+	 * Move the beginning pointer to the end minus the max period x 3.
+	 * We are at the point we can begin searching the pattern
+	 */
+	buffer = &buffer[len - (period_max * 3)];
+
+	/* Adjust the length to the maximum allowed period x 3 */
+	len = period_max * 3;
 
 	/*
 	 * The buffer contains the suite of intervals, in a ilog2
@@ -306,21 +315,45 @@ static int irq_timings_next_event_index(int *buffer, size_t len, int period_max)
 	 * period beginning at the end of the buffer. We do that for
 	 * each suffix.
 	 */
-	for (i = period_max; i >= PREDICTION_PERIOD_MIN ; i--) {
+	for (period = period_max; period >= PREDICTION_PERIOD_MIN; period--) {
 
-		int *begin = &buffer[len - (i * 3)];
-		int *ptr = begin;
+		/*
+		 * The first comparison always succeed because the
+		 * suffix is deduced from the first n-period bytes of
+		 * the buffer and we compare the initial suffix with
+		 * itself, so we can skip the first iteration.
+		 */
+		int idx = period;
+		size_t size = period;
 
 		/*
 		 * We look if the suite with period 'i' repeat
 		 * itself. If it is truncated at the end, as it
 		 * repeats we can use the period to find out the next
-		 * element.
+		 * element with the modulo.
 		 */
-		while (!memcmp(ptr, begin, i * sizeof(*ptr))) {
-			ptr += i;
-			if (ptr >= &buffer[len])
-				return begin[((i * 3) % i)];
+		while (!memcmp(buffer, &buffer[idx], size * sizeof(int))) {
+
+			/*
+			 * Move the index in a period basis
+			 */
+			idx += size;
+
+			/*
+			 * If this condition is reached, all previous
+			 * memcmp were successful, so the period is
+			 * found.
+			 */
+			if (idx == len)
+				return buffer[len % period];
+
+			/*
+			 * If the remaining elements to compare are
+			 * smaller than the period, readjust the size
+			 * of the comparison for the last iteration.
+			 */
+			if (len - idx < period)
+				size = len - idx;
 		}
 	}
 

  reply	other threads:[~2019-06-12 12:27 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-27 20:55 [PATCH V3 0/8] genirq/timings: Fixes and selftests Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 1/8] genirq/timings: Fix next event index function Daniel Lezcano
2019-06-12 12:27   ` tip-bot for Daniel Lezcano [this message]
2019-05-27 20:55 ` [PATCH V3 2/8] genirq/timings: Fix timings buffer inspection Daniel Lezcano
2019-06-12 12:28   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 3/8] genirq/timings: Optimize the period detection speed Daniel Lezcano
2019-06-12 12:29   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 4/8] genirq/timings: Encapsulate timings push Daniel Lezcano
2019-06-12 12:29   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 5/8] genirq/timings: Encapsulate storing function Daniel Lezcano
2019-06-12 12:30   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 6/8] genirq/timings: Add selftest for circular array Daniel Lezcano
2019-06-12 12:31   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 7/8] genirq/timings: Add selftest for irqs circular buffer Daniel Lezcano
2019-06-12 12:31   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-05-27 20:55 ` [PATCH V3 8/8] genirq/timings: Add selftest for next event computation Daniel Lezcano
2019-06-12 12:32   ` [tip:irq/core] " tip-bot for Daniel Lezcano
2019-06-04  6:15 ` [PATCH V3 0/8] genirq/timings: Fixes and selftests Daniel Lezcano

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=tip-619c1baa91b2820eae9ff5d89eb525df81ea7a5a@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=tglx@linutronix.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox