• Cherry Zhang's avatar
    cmd/internal/obj: mark split-stack prologue nonpreemptible · b2482e48
    Cherry Zhang authored
    When there are both a synchronous preemption request (by
    clobbering the stack guard) and an asynchronous one (by signal),
    the running goroutine may observe the synchronous request first
    in stack bounds check, and go to the path of calling morestack.
    If the preemption signal arrives at this point before the call to
    morestack, the goroutine will be asynchronously preempted,
    entering the scheduler. When it is resumed, the scheduler clears
    the preemption request, unclobbers the stack guard. But the
    resumed goroutine will still call morestack, as it is already on
    its way. morestack will, as there is no preemption request,
    double the stack unnecessarily. If this happens multiple times,
    the stack may grow too big, although only a small amount is
    actually used.
    
    To fix this, we mark the stack bounds check and the call to
    morestack async-nonpreemptible, starting after the memory
    instruction (mostly a load, on x86 CMP with memory).
    
    Not done for Wasm as it does not support async preemption.
    
    Fixes #35470.
    
    Change-Id: Ibd7f3d935a3649b80f47539116ec9b9556680cf2
    Reviewed-on: https://go-review.googlesource.com/c/go/+/207350Reviewed-by: default avatarDavid Chase <drchase@google.com>
    b2482e48
obj7.go 25.4 KB