From ea8c05508b582f7ab20850e336d5ae4abf4e448d Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Mon, 11 Sep 2023 12:18:51 -0400 Subject: Revert "runtime: allow update of system stack bounds on callback from C thread" This reverts CL 525455. The test fails to build on darwin, alpine, and android. For #62440. Change-Id: I39c6b1e16499bd61e0f166de6c6efe7a07961e62 Reviewed-on: https://go-review.googlesource.com/c/go/+/527317 Auto-Submit: Michael Pratt LUCI-TryBot-Result: Go LUCI Reviewed-by: Bryan Mills Reviewed-by: Cherry Mui --- src/runtime/testdata/testprogcgo/stackswitch.c | 81 ------------------------- src/runtime/testdata/testprogcgo/stackswitch.go | 43 ------------- 2 files changed, 124 deletions(-) delete mode 100644 src/runtime/testdata/testprogcgo/stackswitch.c delete mode 100644 src/runtime/testdata/testprogcgo/stackswitch.go (limited to 'src/runtime/testdata') diff --git a/src/runtime/testdata/testprogcgo/stackswitch.c b/src/runtime/testdata/testprogcgo/stackswitch.c deleted file mode 100644 index 9c0c583bf4..0000000000 --- a/src/runtime/testdata/testprogcgo/stackswitch.c +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build unix && !openbsd - -#include -#include -#include -#include -#include -#include - -// Use a stack size larger than the 32kb estimate in -// runtime.callbackUpdateSystemStack. This ensures that a second stack -// allocation won't accidentally count as in bounds of the first stack -#define STACK_SIZE (64ull << 10) - -static ucontext_t uctx_save, uctx_switch; - -extern void stackSwitchCallback(void); - -static void *stackSwitchThread(void *arg) { - // Simple test: callback works from the normal system stack. - stackSwitchCallback(); - - // Next, verify that switching stacks doesn't break callbacks. - - char *stack1 = malloc(STACK_SIZE); - if (stack1 == NULL) { - perror("malloc"); - exit(1); - } - - // Allocate the second stack before freeing the first to ensure we don't get - // the same address from malloc. - char *stack2 = malloc(STACK_SIZE); - if (stack1 == NULL) { - perror("malloc"); - exit(1); - } - - if (getcontext(&uctx_switch) == -1) { - perror("getcontext"); - exit(1); - } - uctx_switch.uc_stack.ss_sp = stack1; - uctx_switch.uc_stack.ss_size = STACK_SIZE; - uctx_switch.uc_link = &uctx_save; - makecontext(&uctx_switch, stackSwitchCallback, 0); - - if (swapcontext(&uctx_save, &uctx_switch) == -1) { - perror("swapcontext"); - exit(1); - } - - if (getcontext(&uctx_switch) == -1) { - perror("getcontext"); - exit(1); - } - uctx_switch.uc_stack.ss_sp = stack2; - uctx_switch.uc_stack.ss_size = STACK_SIZE; - uctx_switch.uc_link = &uctx_save; - makecontext(&uctx_switch, stackSwitchCallback, 0); - - if (swapcontext(&uctx_save, &uctx_switch) == -1) { - perror("swapcontext"); - exit(1); - } - - free(stack1); - free(stack2); - - return NULL; -} - -void callStackSwitchCallbackFromThread(void) { - pthread_t thread; - assert(pthread_create(&thread, NULL, stackSwitchThread, NULL) == 0); - assert(pthread_join(thread, NULL) == 0); -} diff --git a/src/runtime/testdata/testprogcgo/stackswitch.go b/src/runtime/testdata/testprogcgo/stackswitch.go deleted file mode 100644 index b4bb5f5fd9..0000000000 --- a/src/runtime/testdata/testprogcgo/stackswitch.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build unix && !openbsd - -package main - -/* -void callStackSwitchCallbackFromThread(void); -*/ -import "C" - -import ( - "fmt" - "runtime/debug" -) - -func init() { - register("StackSwitchCallback", StackSwitchCallback) -} - -//export stackSwitchCallback -func stackSwitchCallback() { - // We want to trigger a bounds check on the g0 stack. To do this, we - // need to call a splittable function through systemstack(). - // SetGCPercent contains such a systemstack call. - gogc := debug.SetGCPercent(100) - debug.SetGCPercent(gogc) -} - - -// Regression test for https://go.dev/issue/62440. It should be possible for C -// threads to call into Go from different stacks without crashing due to g0 -// stack bounds checks. -// -// N.B. This is only OK for threads created in C. Threads with Go frames up the -// stack must not change the stack out from under us. -func StackSwitchCallback() { - C.callStackSwitchCallbackFromThread(); - - fmt.Printf("OK\n") -} -- cgit v1.3