aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2023-05-09 17:21:39 +0100
committerRichard Henderson <richard.henderson@linaro.org>2023-05-09 17:21:39 +0100
commit577e648bdb524d1984659baf1bd6165de2edae83 (patch)
tree7c5e59e610be8da6f3ffca922824687caebd0592 /tests
parent271477b59e723250f17a7e20f139262057921b6a (diff)
parentef709860ea12ec59c4cd7373bd2fd7a4e50143ee (diff)
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* target/i386: improved EPYC models * more removal of mb_read/mb_set * bump _WIN32_WINNT to the Windows 8 API * fix for modular builds with --disable-system # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmRZK7wUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroObngf8D6A5l1QQAnImRrZAny6HZV/9xseD # 9QhkUW3fxXlUhb8tXomv2BlT8h9GzLIN6aWvcCotT+xK3kAX7mRcYKgPMr9CYL7y # vev/hh+B6RY1CJ/xPT09/BMVjkj50AL0O/OuWMhcQ5nCO7F2sdMjMrsYqqeZcjYf # zx9RTX7gVGt+wWFHxgCgdfL0kfgzexK55YuZU0vLzcA+pYsZWoEfW+fKBIf4rzDV # r9M6mDBUkHBQ0rIVC3QFloAXnYb1JrpeqqL2i2qwhAkLz8LyGqk3lZF20hE/04im # XZcZjWO5pxAxIEPeTken+2x1n8tn2BLkMtvwJdV5TpvICCFRtPZlbH79qw== # =rXLN # -----END PGP SIGNATURE----- # gpg: Signature made Mon 08 May 2023 06:05:00 PM BST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [undefined] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: meson: leave unnecessary modules out of the build docs: clarify --without-default-devices target/i386: Add EPYC-Genoa model to support Zen 4 processor series target/i386: Add VNMI and automatic IBRS feature bits target/i386: Add missing feature bits in EPYC-Milan model target/i386: Add feature bits for CPUID_Fn80000021_EAX target/i386: Add a couple of feature bits in 8000_0008_EBX target/i386: Add new EPYC CPU versions with updated cache_info target/i386: allow versioned CPUs to specify new cache_info include/qemu/osdep.h: Bump _WIN32_WINNT to the Windows 8 API MAINTAINERS: add stanza for Kconfig files tb-maint: do not use mb_read/mb_set call_rcu: stop using mb_set/mb_read test-aio-multithread: simplify test_multi_co_schedule test-aio-multithread: do not use mb_read/mb_set for simple flags rcu: remove qatomic_mb_set, expand comments Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/test-aio-multithread.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/tests/unit/test-aio-multithread.c b/tests/unit/test-aio-multithread.c
index a555cc8835..80c5d4e2e6 100644
--- a/tests/unit/test-aio-multithread.c
+++ b/tests/unit/test-aio-multithread.c
@@ -107,8 +107,7 @@ static void test_lifecycle(void)
/* aio_co_schedule test. */
static Coroutine *to_schedule[NUM_CONTEXTS];
-
-static bool now_stopping;
+static bool stop[NUM_CONTEXTS];
static int count_retry;
static int count_here;
@@ -136,6 +135,7 @@ static bool schedule_next(int n)
static void finish_cb(void *opaque)
{
+ stop[id] = true;
schedule_next(id);
}
@@ -143,13 +143,19 @@ static coroutine_fn void test_multi_co_schedule_entry(void *opaque)
{
g_assert(to_schedule[id] == NULL);
- while (!qatomic_mb_read(&now_stopping)) {
+ /*
+ * The next iteration will set to_schedule[id] again, but once finish_cb
+ * is scheduled there is no guarantee that it will actually be woken up,
+ * so at that point it must not go to sleep.
+ */
+ while (!stop[id]) {
int n;
n = g_test_rand_int_range(0, NUM_CONTEXTS);
schedule_next(n);
qatomic_mb_set(&to_schedule[id], qemu_coroutine_self());
+ /* finish_cb can run here. */
qemu_coroutine_yield();
g_assert(to_schedule[id] == NULL);
}
@@ -161,7 +167,6 @@ static void test_multi_co_schedule(int seconds)
int i;
count_here = count_other = count_retry = 0;
- now_stopping = false;
create_aio_contexts();
for (i = 0; i < NUM_CONTEXTS; i++) {
@@ -171,10 +176,10 @@ static void test_multi_co_schedule(int seconds)
g_usleep(seconds * 1000000);
- qatomic_mb_set(&now_stopping, true);
+ /* Guarantee that each AioContext is woken up from its last wait. */
for (i = 0; i < NUM_CONTEXTS; i++) {
ctx_run(i, finish_cb, NULL);
- to_schedule[i] = NULL;
+ g_assert(to_schedule[i] == NULL);
}
join_aio_contexts();
@@ -199,10 +204,11 @@ static uint32_t atomic_counter;
static uint32_t running;
static uint32_t counter;
static CoMutex comutex;
+static bool now_stopping;
static void coroutine_fn test_multi_co_mutex_entry(void *opaque)
{
- while (!qatomic_mb_read(&now_stopping)) {
+ while (!qatomic_read(&now_stopping)) {
qemu_co_mutex_lock(&comutex);
counter++;
qemu_co_mutex_unlock(&comutex);
@@ -236,7 +242,7 @@ static void test_multi_co_mutex(int threads, int seconds)
g_usleep(seconds * 1000000);
- qatomic_mb_set(&now_stopping, true);
+ qatomic_set(&now_stopping, true);
while (running > 0) {
g_usleep(100000);
}
@@ -327,7 +333,7 @@ static void mcs_mutex_unlock(void)
static void test_multi_fair_mutex_entry(void *opaque)
{
- while (!qatomic_mb_read(&now_stopping)) {
+ while (!qatomic_read(&now_stopping)) {
mcs_mutex_lock();
counter++;
mcs_mutex_unlock();
@@ -355,7 +361,7 @@ static void test_multi_fair_mutex(int threads, int seconds)
g_usleep(seconds * 1000000);
- qatomic_mb_set(&now_stopping, true);
+ qatomic_set(&now_stopping, true);
while (running > 0) {
g_usleep(100000);
}
@@ -383,7 +389,7 @@ static QemuMutex mutex;
static void test_multi_mutex_entry(void *opaque)
{
- while (!qatomic_mb_read(&now_stopping)) {
+ while (!qatomic_read(&now_stopping)) {
qemu_mutex_lock(&mutex);
counter++;
qemu_mutex_unlock(&mutex);
@@ -411,7 +417,7 @@ static void test_multi_mutex(int threads, int seconds)
g_usleep(seconds * 1000000);
- qatomic_mb_set(&now_stopping, true);
+ qatomic_set(&now_stopping, true);
while (running > 0) {
g_usleep(100000);
}