From: Li Wang <liwang@redhat.com>
To: ltp@lists.linux.it
Subject: [LTP] [Draft PATCH] lib: add TST_DYNAMICAL_RUNTIME option
Date: Wed, 27 Nov 2024 15:48:13 +0800 [thread overview]
Message-ID: <20241127074813.10322-1-liwang@redhat.com> (raw)
In-Reply-To: <CAEemH2e3H0w52LKXs+UURdg5dq2bP5dXokWYb98DxHu5qcsOQg@mail.gmail.com>
Hi, this is a draft patch to reflect the method came up in the thread,
if people agree I will polish it and send a complete one later.
Signed-off-by: Li Wang <liwang@redhat.com>
---
include/tst_kconfig.h | 44 +++++++++++++++++++++++++++++++++++++++++++
include/tst_test.h | 1 +
include/tst_timer.h | 30 +++++++++++++++++++++++++++++
lib/tst_test.c | 12 ++++++++----
4 files changed, 83 insertions(+), 4 deletions(-)
diff --git a/include/tst_kconfig.h b/include/tst_kconfig.h
index 23f807409..8f5bc06a7 100644
--- a/include/tst_kconfig.h
+++ b/include/tst_kconfig.h
@@ -98,4 +98,48 @@ struct tst_kcmdline_var {
*/
void tst_kcmdline_parse(struct tst_kcmdline_var params[], size_t params_len);
+/*
+ * List of debug-related kernel config options that may degrade performance when enabled.
+ */
+static const char * const tst_kconf_debug_options[][2] = {
+ /* Lock debugging */
+ {"CONFIG_PROVE_LOCKING=y", NULL},
+ {"CONFIG_LOCKDEP=y", NULL},
+ {"CONFIG_DEBUG_SPINLOCK=y", NULL},
+
+ /* Mutexes debugging */
+ {"CONFIG_DEBUG_RT_MUTEXES=y", NULL},
+ {"CONFIG_DEBUG_MUTEXES=y", NULL},
+
+ /* Memory debugging */
+ {"CONFIG_DEBUG_PAGEALLOC=y", NULL},
+ {"CONFIG_KASAN=y", NULL},
+ {"CONFIG_SLUB_RCU_DEBUG=y", NULL},
+
+ /* Tracing and profiling */
+ {"CONFIG_TRACE_IRQFLAGS=y", NULL},
+ {"CONFIG_LATENCYTOP=y", NULL},
+ {"CONFIG_DEBUG_NET=y", NULL},
+
+ /* Filesystem debugging */
+ {"CONFIG_EXT4_DEBUG=y", NULL},
+ {"CONFIG_QUOTA_DEBUG=y", NULL},
+
+ /* Miscellaneous debugging */
+ {"CONFIG_FAULT_INJECTION=y", NULL},
+ {"CONFIG_DEBUG_OBJECTS=y", NULL},
+
+ {NULL, NULL} /* End of the array */
+};
+
+static inline int tst_kconfig_debug_matches(void)
+{
+ int i, num = 1;
+
+ for (i = 0; tst_kconf_debug_options[i][0] != NULL; i++)
+ num += tst_kconfig_check(tst_kconf_debug_options[i]);
+
+ return num;
+}
+
#endif /* TST_KCONFIG_H__ */
diff --git a/include/tst_test.h b/include/tst_test.h
index 8d1819f74..483b707d3 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -235,6 +235,7 @@ struct tst_tag {
extern unsigned int tst_variant;
#define TST_UNLIMITED_RUNTIME (-1)
+#define TST_DYNAMICAL_RUNTIME (-2)
/**
* struct tst_ulimit_val - An ulimit resource and value.
diff --git a/include/tst_timer.h b/include/tst_timer.h
index 6fb940020..268fc8389 100644
--- a/include/tst_timer.h
+++ b/include/tst_timer.h
@@ -17,6 +17,7 @@
#include <mqueue.h>
#include <time.h>
#include "tst_test.h"
+#include "tst_clocks.h"
#include "lapi/common_timers.h"
#include "lapi/posix_types.h"
#include "lapi/syscalls.h"
@@ -1074,4 +1075,33 @@ static inline long long tst_timer_elapsed_us(void)
return tst_timespec_to_us(tst_timer_elapsed());
}
+#define CALLIBRATE_LOOPS 120000000
+
+/*
+ * Measures the time taken by the CPU to perform a specified
+ * number of empty loops for calibration.
+ */
+static inline int tst_callibrate(void)
+{
+ int i;
+ struct timespec start, stop;
+ long long diff;
+
+ for (i = 0; i < CALLIBRATE_LOOPS; i++)
+ __asm__ __volatile__ ("" : "+g" (i) : :);
+
+ tst_clock_gettime(CLOCK_MONOTONIC_RAW, &start);
+
+ for (i = 0; i < CALLIBRATE_LOOPS; i++)
+ __asm__ __volatile__ ("" : "+g" (i) : :);
+
+ tst_clock_gettime(CLOCK_MONOTONIC_RAW, &stop);
+
+ diff = tst_timespec_diff_us(stop, start);
+
+ tst_res(TINFO, "CPU did %i loops in %llius", CALLIBRATE_LOOPS, diff);
+
+ return diff;
+}
+
#endif /* TST_TIMER */
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 8db554dea..8a4460944 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -1265,8 +1265,8 @@ static void do_setup(int argc, char *argv[])
if (!tst_test)
tst_brk(TBROK, "No tests to run");
- if (tst_test->max_runtime < -1) {
- tst_brk(TBROK, "Invalid runtime value %i",
+ if (tst_test->max_runtime < -2) {
+ tst_brk(TBROK, "Invalid runtime value %d",
results->max_runtime);
}
@@ -1695,7 +1695,6 @@ unsigned int tst_remaining_runtime(void)
return 0;
}
-
unsigned int tst_multiply_timeout(unsigned int timeout)
{
parse_mul(&timeout_mul, "LTP_TIMEOUT_MUL", 0.099, 10000);
@@ -1715,8 +1714,13 @@ static void set_timeout(void)
return;
}
+ if (results->max_runtime == TST_DYNAMICAL_RUNTIME) {
+ tst_res(TINFO, "Timeout is decited in running time");
+ results->max_runtime = (tst_callibrate() / 1000) * tst_kconfig_debug_matches();
+ }
+
if (results->max_runtime < 0) {
- tst_brk(TBROK, "max_runtime must to be >= -1! (%d)",
+ tst_brk(TBROK, "max_runtime must to be >= -2! (%d)",
results->max_runtime);
}
--
2.47.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2024-11-27 7:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-26 10:04 [LTP] [RFC PATCH] starvation: set a baseline for maximum runtime Li Wang
2024-11-26 10:28 ` Cyril Hrubis
2024-11-26 10:59 ` Li Wang
2024-11-26 11:23 ` Cyril Hrubis
2024-11-27 4:15 ` Li Wang
2024-11-27 7:48 ` Li Wang [this message]
2024-11-27 8:21 ` [LTP] [Draft PATCH] lib: add TST_DYNAMICAL_RUNTIME option Li Wang
2024-11-27 9:46 ` [LTP] [RFC PATCH] starvation: set a baseline for maximum runtime Cyril Hrubis
2024-11-27 10:08 ` Li Wang
2024-11-27 10:40 ` Cyril Hrubis
2024-11-27 10:56 ` Li Wang
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=20241127074813.10322-1-liwang@redhat.com \
--to=liwang@redhat.com \
--cc=ltp@lists.linux.it \
/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.