[Bug 219399] System panics after several hours of 14-threads-compilation orgies using poudriere on AMD Ryzen...
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Mon Jul 24 22:26:04 UTC 2017
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219399
--- Comment #108 from Don Lewis <truckman at FreeBSD.org> ---
(In reply to Nils Beyer from comment #91)
I'm pretty sure that ryzen_segv_test is actually broken. The first iteration
of the loop in the t2 threadx() is unlocked and there is no guarantee that it
will have initialized things before thread1() tries to use them.
Try this patch:
--- ryzen_segv_test.c.orig 2017-07-24 14:26:23.851846000 -0700
+++ ryzen_segv_test.c 2017-07-24 15:02:33.998102000 -0700
@@ -291,29 +291,32 @@
atomic_store(&flg, 0);
}
+void threadx_core()
+{
+ uint8_t offset;
+ uint32_t randval;
+
+ offset = random() % 256;
+ randval = random();
+ memset(func_set, 0, sizeof(func_set_t));
+ memcpy(&func_set->func[offset], func_base, FUNC_BYTES);
+ func_set->offset = offset;
+ func_set->ret = randval;
+}
+
void threadx(void *p)
{
uint8_t offset;
uint32_t randval;
int init = 0;
- if(p != NULL) {
- init = 1;
- }
//usleep(1000);
while(atomic_load(&flg)) {
offset = random() % 256;
randval = random();
- if(!init) {
- lock_enter();
- } else {
- if(func_set == MAP_FAILED) {
- fprintf(stderr, "mmap returns MAP_FAILED!\n");
- return;
- }
- init = 0;
- }
+ lock_enter();
+ // threadx_core();
memset(func_set, 0, sizeof(func_set_t));
memcpy(&func_set->func[offset], func_base, FUNC_BYTES);
func_set->offset = offset;
@@ -330,8 +333,7 @@
{
int64_t loops;
pthread_t t1, t2, t3;
-#ifdef _MSC_VER
-#else
+#if !defined(_MSC_VER) && !defined(__FreeBSD__)
cpu_set_t cpuset;
int cpu;
#endif
@@ -349,19 +351,23 @@
n_cpus = sysconf(_SC_NPROCESSORS_ONLN);
func_set = mmap (NULL, sizeof(func_set_t), PROT_READ | PROT_WRITE |
PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
#endif
+ if(func_set == MAP_FAILED) {
+ fprintf(stderr, "mmap returns MAP_FAILED!\n");
+ exit (1);
+ }
atomic_store(&flg, 1);
atomic_store(&locked, 1);
srandom(time(NULL) + pid);
// You should confirm assembly of generated code, just in case the
compiler reorders mfence instruction
+ threadx_core();
mfence(); // Assure that flags are stored properly
pthread_create(&t1, NULL, (void*)thread1, &loops);
- pthread_create(&t2, NULL, (void*)threadx, (void*)1);
+ pthread_create(&t2, NULL, (void*)threadx, NULL);
pthread_create(&t3, NULL, (void*)threadx, NULL);
-#ifdef _MSC_VER
-#else
+#if !defined(_MSC_VER) && !defined(__FreeBSD__)
cpu = random() % n_cpus;
CPU_ZERO(&cpuset);
CPU_SET(cpu, &cpuset);
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list