From 134fba2c1d763c41a2cd4e1af32edf4d3bb76e7b Mon Sep 17 00:00:00 2001 From: Yi Duan Date: Tue, 3 Jan 2023 15:15:51 +0800 Subject: [PATCH] feat: ignore SIGPROF while calling native funcs (#342) --- decoder/primitives.go | 5 ++++- encoder/primitives.go | 10 ++++++++-- internal/rt/asm.s | 44 ++++++++++++++++++++++++++++++++++++++---- internal/rt/fastmem.go | 3 --- internal/rt/gcwb.go | 42 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 94 insertions(+), 10 deletions(-) diff --git a/decoder/primitives.go b/decoder/primitives.go index 5c84269..d6053e2 100644 --- a/decoder/primitives.go +++ b/decoder/primitives.go @@ -30,7 +30,10 @@ func decodeTypedPointer(s string, i int, vt *rt.GoType, vp unsafe.Pointer, sb *_ return 0, err } else { rt.MoreStack(_FP_size + _VD_size + native.MaxFrameSize) - return fn(s, i, vp, sb, fv, "", nil) + rt.StopProf() + ret, err := fn(s, i, vp, sb, fv, "", nil) + rt.StartProf() + return ret, err } } diff --git a/encoder/primitives.go b/encoder/primitives.go index 451b997..b0aebfb 100644 --- a/encoder/primitives.go +++ b/encoder/primitives.go @@ -72,10 +72,16 @@ func encodeTypedPointer(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *_Sta return err } else if vt.Indirect() { rt.MoreStack(_FP_size + native.MaxFrameSize) - return fn(buf, *vp, sb, fv) + rt.StopProf() + err := fn(buf, *vp, sb, fv) + rt.StartProf() + return err } else { rt.MoreStack(_FP_size + native.MaxFrameSize) - return fn(buf, unsafe.Pointer(vp), sb, fv) + rt.StopProf() + err := fn(buf, unsafe.Pointer(vp), sb, fv) + rt.StartProf() + return err } } diff --git a/internal/rt/asm.s b/internal/rt/asm.s index 589457e..d7abffd 100644 --- a/internal/rt/asm.s +++ b/internal/rt/asm.s @@ -1,5 +1,5 @@ // +build !noasm !appengine -// Code generated by asm2asm, DO NOT EDIT. +// Code generated by asm2asm, DO NOT EDIT· #include "go_asm.h" #include "funcdata.h" @@ -13,8 +13,44 @@ _entry: NOTQ R12 LEAQ (SP)(R12*1), R12 CMPQ R12, 16(R14) - JBE _stack_grow + JBE _stack_grow RET _stack_grow: - CALL runtime·morestack_noctxt<>(SB) - JMP _entry + CALL runtime·morestack_noctxt<>(SB) + JMP _entry + + +TEXT ·StopProf(SB), NOSPLIT, $0-0 + NO_LOCAL_POINTERS + MOVL $1, AX + LEAQ github·com∕bytedance∕sonic∕internal∕rt·yieldCount(SB), CX + LOCK + XADDL AX, (CX) + MOVL runtime·prof+4(SB), AX + TESTL AX, AX + JEQ _ret_1 + MOVL AX, github·com∕bytedance∕sonic∕internal∕rt·oldHz(SB) + MOVL $0, runtime·prof+4(SB) +_ret_1: + RET + + +TEXT ·StartProf(SB), NOSPLIT, $0-0 + NO_LOCAL_POINTERS + MOVL $-1, AX + LEAQ github·com∕bytedance∕sonic∕internal∕rt·yieldCount(SB), CX + LOCK + XADDL AX, (CX) + CMPL github·com∕bytedance∕sonic∕internal∕rt·yieldCount(SB), $0 + JNE _ret_2 + CMPL runtime·prof+4(SB), $0 + JNE _ret_2 + CMPL github·com∕bytedance∕sonic∕internal∕rt·oldHz(SB), $0 + JNE _branch_1 + MOVL $100, github·com∕bytedance∕sonic∕internal∕rt·oldHz(SB) +_branch_1: + MOVL github·com∕bytedance∕sonic∕internal∕rt·oldHz(SB), AX + MOVL AX, runtime·prof+4(SB) +_ret_2: + RET + \ No newline at end of file diff --git a/internal/rt/fastmem.go b/internal/rt/fastmem.go index d33ca1b..a425094 100644 --- a/internal/rt/fastmem.go +++ b/internal/rt/fastmem.go @@ -65,6 +65,3 @@ func FuncAddr(f interface{}) unsafe.Pointer { return *(*unsafe.Pointer)(vv.Value) } } - -//go:nosplit -func MoreStack(size uintptr) \ No newline at end of file diff --git a/internal/rt/gcwb.go b/internal/rt/gcwb.go index 51f8c44..2cec9df 100644 --- a/internal/rt/gcwb.go +++ b/internal/rt/gcwb.go @@ -74,3 +74,45 @@ func GcwbAddr() uintptr { return uintptr(fp) + off } } + +// WARN: must be aligned with runtime.Prof +// type Prof struct { +// signalLock uint32 +// hz int32 +// } + +var ( + // // go:linkname runtimeProf runtime.prof + // runtimeProf Prof + + // count of native-C calls + yieldCount uint32 + + // previous value of runtimeProf.hz + oldHz int32 +) + +//go:nosplit +func MoreStack(size uintptr) + +func StopProf() + +// func StopProf() { +// atomic.AddUint32(&yieldCount, 1) +// if runtimeProf.hz != 0 { +// oldHz = runtimeProf.hz +// runtimeProf.hz = 0 +// } +// } + +func StartProf() + +// func StartProf() { +// atomic.AddUint32(&yieldCount, ^uint32(0)) +// if yieldCount == 0 && runtimeProf.hz == 0 { +// if oldHz == 0 { +// oldHz = 100 +// } +// runtimeProf.hz = oldHz +// } +// }