From: Richard Palethorpe <rpalethorpe@suse.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v3 4/7] fzsync: Add sched_yield for single core machine
Date: Fri, 19 Mar 2021 09:18:34 +0000 [thread overview]
Message-ID: <20210319091837.27319-5-rpalethorpe@suse.com> (raw)
In-Reply-To: <20210319091837.27319-1-rpalethorpe@suse.com>
From: Leo Yu-Chi Liang <ycliang@andestech.com>
Fuzzy sync library uses spin waiting mechanism to implement thread
barrier behavior, which would cause this test to be time-consuming
on single core machine.
Fix this by adding sched_yield in the spin waiting loop, so that the
thread yields cpu as soon as it enters the waiting loop.
Signed-off-by: Leo Yu-Chi Liang <ycliang@andestech.com>
---
include/tst_fuzzy_sync.h | 34 ++++++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)
diff --git a/include/tst_fuzzy_sync.h b/include/tst_fuzzy_sync.h
index 4063e95cb..5474f81e3 100644
--- a/include/tst_fuzzy_sync.h
+++ b/include/tst_fuzzy_sync.h
@@ -59,12 +59,15 @@
* @sa tst_fzsync_pair
*/
-#include <sys/time.h>
-#include <time.h>
#include <math.h>
-#include <stdlib.h>
#include <pthread.h>
+#include <sched.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <time.h>
#include "tst_atomic.h"
+#include "tst_cpu.h"
#include "tst_timer.h"
#include "tst_safe_pthread.h"
@@ -180,6 +183,15 @@ struct tst_fzsync_pair {
int exec_loop;
/** Internal; The second thread or 0 */
pthread_t thread_b;
+ /**
+ * Internal; The flag indicates single core machines or not
+ *
+ * If running on single core machines, it would take considerable
+ * amount of time to run fuzzy sync library.
+ * Thus call sched_yield to give up cpu to decrease the test time.
+ */
+ bool yield_in_wait;
+
};
#define CHK(param, low, hi, def) do { \
@@ -206,6 +218,7 @@ static void tst_fzsync_pair_init(struct tst_fzsync_pair *pair)
CHK(max_dev_ratio, 0, 1, 0.1);
CHK(exec_time_p, 0, 1, 0.5);
CHK(exec_loops, 20, INT_MAX, 3000000);
+ CHK(yield_in_wait, 0, 1, (tst_ncpus() <= 1));
}
#undef CHK
@@ -551,7 +564,8 @@ static void tst_fzsync_pair_update(struct tst_fzsync_pair *pair)
*/
static inline void tst_fzsync_pair_wait(int *our_cntr,
int *other_cntr,
- int *spins)
+ int *spins,
+ bool yield_in_wait)
{
if (tst_atomic_inc(other_cntr) == INT_MAX) {
/*
@@ -565,6 +579,8 @@ static inline void tst_fzsync_pair_wait(int *our_cntr,
&& tst_atomic_load(our_cntr) < INT_MAX) {
if (spins)
(*spins)++;
+ if(yield_in_wait)
+ sched_yield();
}
tst_atomic_store(0, other_cntr);
@@ -582,6 +598,8 @@ static inline void tst_fzsync_pair_wait(int *our_cntr,
while (tst_atomic_load(our_cntr) < tst_atomic_load(other_cntr)) {
if (spins)
(*spins)++;
+ if(yield_in_wait)
+ sched_yield();
}
}
}
@@ -594,7 +612,7 @@ static inline void tst_fzsync_pair_wait(int *our_cntr,
*/
static inline void tst_fzsync_wait_a(struct tst_fzsync_pair *pair)
{
- tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr, NULL);
+ tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr, NULL, pair->yield_in_wait);
}
/**
@@ -605,7 +623,7 @@ static inline void tst_fzsync_wait_a(struct tst_fzsync_pair *pair)
*/
static inline void tst_fzsync_wait_b(struct tst_fzsync_pair *pair)
{
- tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr, NULL);
+ tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr, NULL, pair->yield_in_wait);
}
/**
@@ -710,7 +728,7 @@ static inline void tst_fzsync_start_race_a(struct tst_fzsync_pair *pair)
static inline void tst_fzsync_end_race_a(struct tst_fzsync_pair *pair)
{
tst_fzsync_time(&pair->a_end);
- tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr, &pair->spins);
+ tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr, &pair->spins, pair->yield_in_wait);
}
/**
@@ -741,7 +759,7 @@ static inline void tst_fzsync_start_race_b(struct tst_fzsync_pair *pair)
static inline void tst_fzsync_end_race_b(struct tst_fzsync_pair *pair)
{
tst_fzsync_time(&pair->b_end);
- tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr, &pair->spins);
+ tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr, &pair->spins, pair->yield_in_wait);
}
/**
--
2.30.1
next prev parent reply other threads:[~2021-03-19 9:18 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-19 9:18 [LTP] [PATCH v3 0/7] Fuzzy Sync single core support and tests Richard Palethorpe
2021-03-19 9:18 ` [LTP] [PATCH v3 1/7] fzsync: Add self tests Richard Palethorpe
2021-04-08 15:13 ` Cyril Hrubis
2021-04-09 9:34 ` Richard Palethorpe
2021-04-12 13:57 ` Li Wang
2021-04-13 6:42 ` Richard Palethorpe
2021-03-19 9:18 ` [LTP] [PATCH v3 2/7] fzsync: Reset delay bias Richard Palethorpe
2021-04-07 15:38 ` Cyril Hrubis
2021-03-19 9:18 ` [LTP] [PATCH v3 3/7] fzsync: Correctly print positive lower delay range bound Richard Palethorpe
2021-04-07 15:40 ` Cyril Hrubis
2021-03-19 9:18 ` Richard Palethorpe [this message]
2021-03-19 9:18 ` [LTP] [PATCH v3 5/7] fzsync: Move yield check out of loop and add yield to delay Richard Palethorpe
2021-04-08 12:45 ` Cyril Hrubis
2021-03-19 9:18 ` [LTP] [PATCH v3 6/7] API: Add tst_ncpus_available Richard Palethorpe
2021-04-07 15:39 ` Cyril Hrubis
2021-03-19 9:18 ` [LTP] [PATCH v3 7/7] fzsync: Check processor affinity Richard Palethorpe
2021-04-08 12:47 ` Cyril Hrubis
2021-04-09 7:18 ` Li Wang
2021-04-09 9:50 ` Richard Palethorpe
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=20210319091837.27319-5-rpalethorpe@suse.com \
--to=rpalethorpe@suse.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox