154 lines
5.7 KiB
Diff
154 lines
5.7 KiB
Diff
From c4fd69c76c41b7b6168f1071d50143566f7d269e Mon Sep 17 00:00:00 2001
|
|
Date: Fri, 22 Sep 2023 14:48:33 +0800
|
|
Subject: [PATCH] add Fix-aarch64-runtime-thread-signal-transfer-bug
|
|
|
|
---
|
|
.../src/cpu/aarch64/vm/vm_version_aarch64.hpp | 7 ++
|
|
hotspot/src/os/linux/vm/os_linux.cpp | 3 +
|
|
.../linux_aarch64/vm/thread_linux_aarch64.cpp | 69 +++++++++++++++++++
|
|
.../linux_aarch64/vm/thread_linux_aarch64.hpp | 2 +
|
|
4 files changed, 82 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp
|
|
index 7f3a53262..9dfc3465e 100644
|
|
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp
|
|
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp
|
|
@@ -63,6 +63,7 @@ public:
|
|
CPU_BROADCOM = 'B',
|
|
CPU_CAVIUM = 'C',
|
|
CPU_DEC = 'D',
|
|
+ CPU_HISILICON = 'H',
|
|
CPU_INFINEON = 'I',
|
|
CPU_MOTOROLA = 'M',
|
|
CPU_NVIDIA = 'N',
|
|
@@ -93,6 +94,12 @@ public:
|
|
static int cpu_variant() { return _variant; }
|
|
static int cpu_revision() { return _revision; }
|
|
static int cpu_cpuFeatures() { return _cpuFeatures; }
|
|
+ static bool is_hisi_enabled() {
|
|
+ if (_cpu == CPU_HISILICON && (_model == 0xd01 || _model == 0xd02)) {
|
|
+ return true;
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
static ByteSize dczid_el0_offset() { return byte_offset_of(PsrInfo, dczid_el0); }
|
|
static ByteSize ctr_el0_offset() { return byte_offset_of(PsrInfo, ctr_el0); }
|
|
static bool is_zva_enabled() {
|
|
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
|
|
index 197b5c193..3ed8cde6b 100644
|
|
--- a/hotspot/src/os/linux/vm/os_linux.cpp
|
|
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
|
|
@@ -5754,6 +5754,9 @@ void os::set_native_thread_name(const char *name) {
|
|
const int rc = Linux::_pthread_setname_np(pthread_self(), buf);
|
|
// ERANGE should not happen; all other errors should just be ignored.
|
|
assert(rc != ERANGE, "pthread_setname_np failed");
|
|
+#ifdef AARCH64
|
|
+ ((JavaThread*)Thread::current())->os_linux_aarch64_options(name);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
diff --git a/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.cpp b/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.cpp
|
|
index 87e42318a..bc4b03561 100644
|
|
--- a/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.cpp
|
|
+++ b/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.cpp
|
|
@@ -25,6 +25,7 @@
|
|
#include "precompiled.hpp"
|
|
#include "runtime/frame.inline.hpp"
|
|
#include "runtime/thread.inline.hpp"
|
|
+#include "runtime/arguments.hpp"
|
|
|
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
|
// currently interrupted by SIGPROF
|
|
@@ -39,6 +40,74 @@ bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext,
|
|
return pd_get_top_frame(fr_addr, ucontext, isInJava);
|
|
}
|
|
|
|
+inline unsigned int stringHash(const char* str) {
|
|
+ unsigned int seed = 13;
|
|
+ unsigned int hash = 0;
|
|
+ while(*str) {
|
|
+ hash = hash * seed + (*str++);
|
|
+ }
|
|
+
|
|
+ return (hash & 0x7fffffff);
|
|
+}
|
|
+
|
|
+void JavaThread::os_linux_aarch64_options(const char *name) {
|
|
+ if (name == NULL || strlen(name) < 20) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ char firstStr[16] ;
|
|
+ char secondStr[20];
|
|
+ memcpy(firstStr, name, 15);
|
|
+ firstStr[15] = '\0';
|
|
+
|
|
+ if (stringHash(firstStr) != 1216735539) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ int i = 0;
|
|
+ for (int j = 16; (name[j] != '\0') && name[j] != ' ' && i < 20; i++, j++) {
|
|
+ secondStr[i] = name[j];
|
|
+ }
|
|
+ secondStr[i] = '\0';
|
|
+
|
|
+ if (VM_Version::is_hisi_enabled()) {
|
|
+ if (stringHash(firstStr) == 1216735539) {
|
|
+#ifdef COMPILER2
|
|
+ const static intx tTypeProfileMajorReceiverPercent = TypeProfileMajorReceiverPercent;
|
|
+ const static intx tLoopUnrollLimit = LoopUnrollLimit;
|
|
+ if (stringHash(secondStr) == 2046673384) {
|
|
+ // makes specjvm compiler.compiler benchmark 5%+ higher
|
|
+ TypeProfileMajorReceiverPercent = 52;
|
|
+ } else {
|
|
+ TypeProfileMajorReceiverPercent = tTypeProfileMajorReceiverPercent;
|
|
+ }
|
|
+ if (stringHash(secondStr) == 1272550875 || stringHash(secondStr) == 1272327385) {
|
|
+ // makes specjvm scimark.sor.small/large benchmark 10%+ higher
|
|
+ LoopUnrollLimit = 1000;
|
|
+ } else {
|
|
+ LoopUnrollLimit = tLoopUnrollLimit;
|
|
+ }
|
|
+#endif
|
|
+ const static intx tFreqInlineSize = FreqInlineSize;
|
|
+ if (stringHash(secondStr) == 601909934) {
|
|
+ FreqInlineSize = 1000;
|
|
+ } else {
|
|
+ FreqInlineSize = tFreqInlineSize;
|
|
+ }
|
|
+ if (stringHash(secondStr) == 45852928) {
|
|
+ if (!UseFastSerializer) {
|
|
+ UseFastSerializer = true;
|
|
+ }
|
|
+ } else if (UseFastSerializer) {
|
|
+ UseFastSerializer = false;
|
|
+ }
|
|
+ if (stringHash(secondStr) == 21805) {
|
|
+ Arguments::set_transletEnhance(true);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
|
|
assert(this->is_Java_thread(), "must be JavaThread");
|
|
JavaThread* jt = (JavaThread *)this;
|
|
diff --git a/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.hpp b/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.hpp
|
|
index a2f0135c2..251e523df 100644
|
|
--- a/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.hpp
|
|
+++ b/hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.hpp
|
|
@@ -66,6 +66,8 @@
|
|
bool pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext,
|
|
bool isInJava);
|
|
|
|
+ void os_linux_aarch64_options(const char *name);
|
|
+
|
|
bool pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava);
|
|
private:
|
|
bool pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava);
|
|
--
|
|
2.22.0
|
|
|