Work around QEMU bugs

This commit is contained in:
Justine Tunney 2024-07-07 15:42:46 -07:00
parent f7780de24b
commit f590e96abd
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
4 changed files with 12 additions and 6 deletions

View file

@ -61,6 +61,8 @@ TEST(madvise, short) {
} }
TEST(madvise, zero) { TEST(madvise, zero) {
if (IsQemuUser())
return; // doesn't validate flags
char *p; char *p;
ASSERT_NE(MAP_FAILED, (p = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, ASSERT_NE(MAP_FAILED, (p = mmap(0, getpagesize(), PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0))); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)));
@ -86,7 +88,7 @@ TEST(madvise, madvWillNeed_unmappedRegion) {
ASSERT_SYS(0, 0, munmap(p + getgransize(), getgransize())); ASSERT_SYS(0, 0, munmap(p + getgransize(), getgransize()));
if (IsXnu()) if (IsXnu())
ASSERT_SYS(EINVAL, -1, madvise(p, getgransize() * 3, MADV_WILLNEED)); ASSERT_SYS(EINVAL, -1, madvise(p, getgransize() * 3, MADV_WILLNEED));
else if (IsBsd() || IsWindows()) else if (IsBsd() || IsWindows() || IsQemuUser())
ASSERT_SYS(0, 0, madvise(p, getgransize() * 3, MADV_WILLNEED)); ASSERT_SYS(0, 0, madvise(p, getgransize() * 3, MADV_WILLNEED));
else else
ASSERT_SYS(ENOMEM, -1, madvise(p, getgransize() * 3, MADV_WILLNEED)); ASSERT_SYS(ENOMEM, -1, madvise(p, getgransize() * 3, MADV_WILLNEED));
@ -102,7 +104,7 @@ TEST(madvise, madvFree_unmappedRegion) {
ASSERT_SYS(EINVAL, -1, madvise(p, getgransize() * 3, MADV_FREE)); ASSERT_SYS(EINVAL, -1, madvise(p, getgransize() * 3, MADV_FREE));
else if (IsNetbsd() || IsOpenbsd()) else if (IsNetbsd() || IsOpenbsd())
ASSERT_SYS(EFAULT, -1, madvise(p, getgransize() * 3, MADV_FREE)); ASSERT_SYS(EFAULT, -1, madvise(p, getgransize() * 3, MADV_FREE));
else if (IsFreebsd() || IsWindows()) else if (IsFreebsd() || IsWindows() || IsQemuUser())
ASSERT_SYS(0, 0, madvise(p, getgransize() * 3, MADV_FREE)); ASSERT_SYS(0, 0, madvise(p, getgransize() * 3, MADV_FREE));
else else
ASSERT_SYS(ENOMEM, -1, madvise(p, getgransize() * 3, MADV_FREE)); ASSERT_SYS(ENOMEM, -1, madvise(p, getgransize() * 3, MADV_FREE));

View file

@ -44,6 +44,7 @@ TEST_LIBC_INTRIN_DIRECTDEPS = \
TOOL_VIZ_LIB \ TOOL_VIZ_LIB \
THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_COMPILER_RT \
THIRD_PARTY_NSYNC \ THIRD_PARTY_NSYNC \
THIRD_PARTY_OPENMP \
THIRD_PARTY_XED THIRD_PARTY_XED
TEST_LIBC_INTRIN_DEPS := \ TEST_LIBC_INTRIN_DEPS := \
@ -76,6 +77,10 @@ $(TEST_LIBC_INTRIN_OBJS): private \
CFLAGS += \ CFLAGS += \
-fno-builtin -fno-builtin
$(TEST_LIBC_INTRIN_OBJS): private \
CXXFLAGS += \
-fopenmp
.PHONY: o/$(MODE)/test/libc/intrin .PHONY: o/$(MODE)/test/libc/intrin
o/$(MODE)/test/libc/intrin: \ o/$(MODE)/test/libc/intrin: \
$(TEST_LIBC_INTRIN_BINS) \ $(TEST_LIBC_INTRIN_BINS) \

View file

@ -190,7 +190,7 @@ BENCH(bulk_free, bench) {
#define ITERATIONS 1000 #define ITERATIONS 1000
#define THREADS 10 #define THREADS 10
#define SIZE (256 * 1024) #define SIZE (2 * 1024 * 1024)
void *Worker(void *arg) { void *Worker(void *arg) {
for (int i = 0; i < ITERATIONS; ++i) { for (int i = 0; i < ITERATIONS; ++i) {

View file

@ -142,7 +142,7 @@ static void free_waiters_push (waiter *w) {
w->next_free = atomic_load_explicit (&free_waiters, memory_order_relaxed); w->next_free = atomic_load_explicit (&free_waiters, memory_order_relaxed);
while (!atomic_compare_exchange_weak_explicit (&free_waiters, &w->next_free, w, while (!atomic_compare_exchange_weak_explicit (&free_waiters, &w->next_free, w,
memory_order_acq_rel, memory_order_relaxed)) memory_order_acq_rel, memory_order_relaxed))
backoff = pthread_delay_np(free_waiters, backoff); backoff = pthread_delay_np (free_waiters, backoff);
} }
static void free_waiters_populate (void) { static void free_waiters_populate (void) {
@ -188,12 +188,11 @@ static waiter *free_waiters_pop (void) {
if (atomic_compare_exchange_weak_explicit (&free_waiters, &w, w->next_free, if (atomic_compare_exchange_weak_explicit (&free_waiters, &w, w->next_free,
memory_order_acq_rel, memory_order_relaxed)) memory_order_acq_rel, memory_order_relaxed))
return w; return w;
backoff = pthread_delay_np(free_waiters, backoff); backoff = pthread_delay_np (free_waiters, backoff);
} else { } else {
free_waiters_populate (); free_waiters_populate ();
} }
} }
return w;
} }
/* -------------------------------- */ /* -------------------------------- */