Skip to content

memExist multi-threading unsafe #3617

@xiangzhai

Description

@xiangzhai

Hi,

Testcase: test/hotspot/jtreg/vmTestbase/nsk/stress/jni/gclocker/libgcl001.cpp

Thanks for #1362 there is an opportunity to create libbox64.so for host (LoongArch64) Java to emulated guest libX64.so. And libbox64.so chose memExist to check the address whether belongs to host or guest, for example, 0x3f0b051d4d belongs to guest, then libbox64.so emulated via RunFunctionWithEmu. But it reproduced memExist wrongly check the guest address to host for multi-threading testcase:

#0  memExist (addr=270616506368) at /home/zhaixiang/repo/libbox64/src/custommem.c:1982
#1  0x000000ff85e6c29c in DynaRun (emu=emu@entry=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/dynarec/dynarec.c:239
#2  0x000000ff85e6c400 in DynaCall (emu=emu@entry=0xff8c1b79d0, addr=<optimized out>) at /home/zhaixiang/repo/libbox64/src/dynarec/dynarec.c:123
#3  0x000000ff85ea35b4 in RunFunctionWithEmu (emu=emu@entry=0xff8c1b79d0, QuitOnLongJump=QuitOnLongJump@entry=0, fnc=fnc@entry=270616506368, nargs=nargs@entry=3) at /home/zhaixiang/repo/libbox64/src/tools/callback.c:374
#4  0x000000ff85e6ef44 in RunElfInit (h=0xff8c224040, emu=emu@entry=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1206
#5  0x000000ff85e6f000 in RunElfInit (emu=0xff8c1b79d0, h=<optimized out>) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1177
#6  RunDeferredElfInit (emu=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1253
#7  0x000000ff865572b8 in my_dlopen (emu=0xff8c1b79d0, filename=filename@entry=0xff8c0058b0, flag=flag@entry=1) at /home/zhaixiang/repo/libbox64/src/wrapped/wrappedlibdl.c:251
...
(gdb) p/x addr
$1 = 0x3f02003000
(gdb) info threads
  Id   Target Id         Frame 
  1    Thread 0xfff7da4710 (LWP 19634) "java" 0x000000fff7db56f8 in __GI___pthread_timedjoin_ex (threadid=1099350323680, thread_return=thread_return@entry=0xffffff1648, abstime=abstime@entry=0x0, block=block@entry=true) at pthread_join_common.c:89
  2    Thread 0xfff662b1e0 (LWP 19744) "java" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff002fb78) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  3    Thread 0xfff5a731e0 (LWP 19753) "GC Thread#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff004b428) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
  4    Thread 0xfff586f1e0 (LWP 19754) "G1 Main Marker" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d749e8 <mutex_init()::G1CGC_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  5    Thread 0xfff566b1e0 (LWP 19755) "G1 Conc#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff004fcd8) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
  6    Thread 0xfff50571e0 (LWP 19756) "G1 Refi..ontrol" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff0070828) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  7    Thread 0xfff4e531e0 (LWP 19757) "G1 Refi..kers#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff0071518) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
  8    Thread 0xfff4c4f1e0 (LWP 19758) "G1 Service" futex_reltimed_wait_cancelable (private=0, reltime=0xfff4c4e748, expected=0, futex_word=0xfff0072b48) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  11   Thread 0xfff48131e0 (LWP 19761) "VM Peri..Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xfff4812728, expected=0, futex_word=0xfff7d735c8 <mutex_init()::PeriodicTask_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  12   Thread 0xfff4a171e0 (LWP 19762) "VM Thread" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d724b8 <mutex_init()::VMOperation_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  13   Thread 0xfff44eb1e0 (LWP 19763) "Referen..andler" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d72608 <mutex_init()::Heap_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  14   Thread 0xfff42e71e0 (LWP 19764) "Finalizer" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff00a3b78) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  15   Thread 0xffd82af1e0 (LWP 19765) "Signal ..atcher" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff7d7a600 <sig_semaphore>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
  16   Thread 0xffc9a1b1e0 (LWP 19766) "Service Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9a1a668, expected=0, futex_word=0xfff7d743c8 <mutex_init()::Service_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  17   Thread 0xffc98171e0 (LWP 19767) "Monitor..Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9816638, expected=0, futex_word=0xfff7d74438 <mutex_init()::MonitorDeflation_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  18   Thread 0xffc96131e0 (LWP 19768) "C2 Comp..hread0" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9612528, expected=0, futex_word=0xfff7d73b0c <mutex_init()::MethodCompileQueue_lock_storage+92>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  19   Thread 0xffc940f1e0 (LWP 19769) "C1 Comp..hread0" futex_reltimed_wait_cancelable (private=0, reltime=0xffc940e528, expected=0, futex_word=0xfff7d73b0c <mutex_init()::MethodCompileQueue_lock_storage+92>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
  20   Thread 0xffc920b1e0 (LWP 19770) "Notific..Thread" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d74358 <mutex_init()::Notification_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
  21   Thread 0xffc90071e0 (LWP 19771) "Common-Cleaner" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9005e38, expected=0, futex_word=0xfff00e2f78) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
* 22   Thread 0xffc8e031e0 (LWP 19772) "MainThread" memExist (addr=270616506368) at /home/zhaixiang/repo/libbox64/src/custommem.c:1982

How about?

diff --git a/src/custommem.c b/src/custommem.c
index a35e2822e..56fd88b6e 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -2829,7 +2829,10 @@ int getMmapped(uintptr_t addr)
 
 int memExist(uintptr_t addr)
 {
-    return rb_get(mapallmem, addr);
+    LOCK_PROT_FAST();
+    int ret = rb_get(mapallmem, addr);
+    UNLOCK_PROT_FAST();
+    return ret;
 }
 
 #define LOWEST (void*)0x10000

Thanks,
Leslie Zhai

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions